From a60a49ade0cf6b1fc8309be870677db461972d75 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Mon, 2 Oct 2023 16:26:04 +0200 Subject: [PATCH 001/310] Implemented SQLSink --- .../ie3/datamodel/io/DatabaseIdentifier.java | 43 ++ .../java/edu/ie3/datamodel/io/IoUtil.java | 15 + .../java/edu/ie3/datamodel/io/SqlUtils.java | 192 +++++++ .../datamodel/io/connectors/SqlConnector.java | 16 +- .../io/naming/DatabaseNamingStrategy.java | 51 ++ .../ie3/datamodel/io/processor/Processor.java | 3 +- .../io/processor/ProcessorProvider.java | 12 + .../edu/ie3/datamodel/io/sink/SqlSink.java | 507 ++++++++++++++++++ .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 402 ++++++++++++++ .../ie3/test/common/SampleJointGrid.groovy | 4 +- .../ie3/test/common/TimeSeriesTestData.groovy | 7 + .../ie3/datamodel/io/sink/_sql/cleanup.sql | 7 + .../datamodel/io/sink/_sql/input_entities.sql | 240 +++++++++ .../datamodel/io/sink/_sql/load_profile.sql | 13 + .../io/sink/_sql/result_entities.sql | 79 +++ .../edu/ie3/datamodel/io/sink/_sql/setup.sql | 1 + .../datamodel/io/sink/_sql/sql_test_data.sql | 16 + .../datamodel/io/sink/_sql/time_series.sql | 123 +++++ .../edu/ie3/datamodel/io/sink/_sql/types.sql | 59 ++ .../datamodel/io/source/sql/_types/types.sql | 2 +- src/test/resources/log4j2-test.xml | 2 +- 22 files changed, 1783 insertions(+), 13 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java create mode 100644 src/main/java/edu/ie3/datamodel/io/SqlUtils.java create mode 100644 src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java create mode 100644 src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/cleanup.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/setup.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql diff --git a/src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java b/src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java new file mode 100644 index 000000000..14d9c0738 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java @@ -0,0 +1,43 @@ +package edu.ie3.datamodel.io; + +import java.util.UUID; +import java.util.stream.Stream; + +import static edu.ie3.datamodel.io.IoUtil.quote; + +/** + * Class for identification of grids and results in SQL databases. + */ +public class DatabaseIdentifier { + + private final String identifier; + private final UUID uuid; + + public DatabaseIdentifier( + String identifier, + UUID uuid + ) { + this.identifier = identifier; + this.uuid = uuid; + } + + public String getIdentifier() { + return identifier; + } + + public UUID getUuid() { + return uuid; + } + + public String toString() { + return "identifier=" + identifier + ", uuid=" + uuid.toString(); + } + + public String[] getQueryString() { + return new String[]{quote(identifier, "'"), quote(uuid.toString(), "'")}; + } + + public Stream getStreamForQuery() { + return Stream.concat(Stream.of(quote(identifier, "'")), Stream.of(quote(uuid.toString(), "'"))); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/IoUtil.java b/src/main/java/edu/ie3/datamodel/io/IoUtil.java index 0968b4f28..590ea1b49 100644 --- a/src/main/java/edu/ie3/datamodel/io/IoUtil.java +++ b/src/main/java/edu/ie3/datamodel/io/IoUtil.java @@ -7,6 +7,8 @@ import java.io.File; import java.nio.file.Path; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.Optional; public class IoUtil { @@ -49,4 +51,17 @@ public static Path harmonizeFileSeparator(Path path) { public static Optional pathOption(String in) { return Optional.of(Path.of(in)); } + + public String timeFormatter(ZonedDateTime time, String timePattern) { + return time.format(DateTimeFormatter.ofPattern(timePattern)); + } + + public static String quote(String input, String quoteSymbol) { + if (input == "") { + return "NULL"; + } else { + return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; + } + } + } diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java new file mode 100644 index 000000000..c0fe83645 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -0,0 +1,192 @@ +package edu.ie3.datamodel.io; + +import edu.ie3.datamodel.exceptions.EntityProcessorException; +import edu.ie3.datamodel.exceptions.ProcessorProviderException; +import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; +import edu.ie3.datamodel.io.processor.ProcessorProvider; +import edu.ie3.datamodel.models.UniqueEntity; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static edu.ie3.util.StringUtils.camelCaseToSnakeCase; + +public class SqlUtils { + private static final String endQueryCreateTable = ")\n" + "\t WITHOUT OIDS\n" + "\t TABLESPACE pg_default;"; + + private SqlUtils() { + throw new IllegalStateException("Utility classes cannot be instantiated"); + } + + + public static String queryForCreation( + String schemaName, + String tableName, + Stream> columnsWithDataTypes + ) { + return beginQueryCreateTable(schemaName, tableName) + + " " + + endQueryCreateTable; + } + + public static String getEndQueryCreateTable() { + return endQueryCreateTable; + } + + private static String beginQueryCreateTable( + String schemaName, + String tableName + ) { + return "CREATE TABLE " + schemaName + "." + tableName + "\n(\n"; + } + + public static String getDataTypes(Class cls) { + try { + ProcessorProvider processorProvider = new ProcessorProvider(); + DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); + String body = ""; + Stream dataTypes; + String[] headerElements = processorProvider.getHeaderElements(cls); + Stream strHeader = Stream.concat(Arrays.stream(headerElements), Stream.of("grid_name", "grid_uuid")) ; + Stream dtHeader = strHeader.map( + element -> { + return camelCaseToSnakeCase(element) + " " + classToDataType().get(camelCaseToSnakeCase(element)); + } + ); + return "CREATE TABLE public." + namingStrategy.getEntityName(cls).orElseThrow() + "\n(\n\t" + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) + "\n)\n\t" + + "WITHOUT OIDS\n" + + "\t" + "TABLESPACE pg_default;\n"; + } catch (EntityProcessorException e) { + return ""; + } catch (ProcessorProviderException e) { + return ""; + } + } + + public static Map classToDataType() { + HashMap map = new HashMap(); + map.put("uuid", "uuid PRIMARY KEY"); + map.put("time_series", "uuid NOT NULL"); + map.put("time", "timestamp with time zone NOT NULL"); + map.put("p", "double precision NOT NULL"); + map.put("q", "double precision NOT NULL"); + map.put("c", "double precision NOT NULL"); + map.put("s_rated", "double precision NOT NULL"); + + map.put("cost_controlled", "bool NOT NULL"); + map.put("feed_in_tariff", "int NOT NULL"); + map.put("id", "TEXT NOT NULL"); + map.put("market_reaction", "bool NOT NULL"); + map.put("node", "uuid NOT NULL"); + //map.put("operatesFrom", "timestamp with time zone"); + map.put("operates_from", "timestamp with time zone"); + //map.put("operatesUntil", "timestamp with time zone"); + map.put("operates_until", "timestamp with time zone"); + map.put("operator", "uuid"); + map.put("q_characteristics", "TEXT NOT NULL"); + map.put("geo_position", "TEXT NOT NULL"); + map.put("length", "double precision NOT NULL"); + map.put("node_a", "uuid NOT NULL"); + map.put("node_b", "uuid NOT NULL"); + map.put("type", "uuid NOT NULL"); //EVCS + map.put("olm_characteristic", "TEXT NOT NULL"); + map.put("parallel_devices", "int NOT NULL"); + //map.put("parallelDevices", "int NOT NULL"); + map.put("cos_phi_rated", "TEXT NOT NULL"); + map.put("dsm", "bool NOT NULL"); + map.put("e_cons_annual", "double precision NOT NULL"); + map.put("load_profile", "TEXT NOT NULL"); + + map.put("auto_tap", "bool NOT NULL"); + map.put("tap_pos", "int NOT NULL"); + map.put("type", "uuid NOT NULL"); + + map.put("v_ang", "bool NOT NULL"); + map.put("v_mag", "bool NOT NULL"); + map.put("slack", "bool NOT NULL"); + map.put("subnet", "int NOT NULL"); + //map.put("vRated", "double precision NOT NULL"); + map.put("v_rated", "double precision NOT NULL"); + map.put("v_target", "double precision NOT NULL"); + //map.put("vTarget", "double precision NOT NULL"); + map.put("volt_lvl", "TEXT NOT NULL"); + map.put("charging_points", "int NOT NULL"); + map.put("location_type", "TEXT NOT NULL"); + map.put("v_2g_support", "bool NOT NULL"); + //map.put("voltLvl", "TEXT NOT NULL"); + + map.put("albedo", "double precision NOT NULL"); + map.put("azimuth", "double precision NOT NULL"); + map.put("elevation_angle", "double precision NOT NULL"); + map.put("eta_conv", "double precision NOT NULL"); + map.put("k_g", "double precision NOT NULL"); + map.put("k_t", "double precision NOT NULL"); + + map.put("grid_name", "TEXT NOT NULL"); + map.put("grid_uuid", "uuid NOT NULL"); + + + map.put("b_m", "double precision NOT NULL"); + map.put("d_phi", "double precision NOT NULL"); + map.put("d_v", "double precision NOT NULL"); + map.put("g_m", "double precision NOT NULL"); + map.put("r_sc", "double precision NOT NULL"); + map.put("tap_max", "int NOT NULL"); + map.put("tap_min", "int NOT NULL"); + map.put("tap_neutr", "int NOT NULL"); + map.put("tap_side", "bool NOT NULL"); + map.put("v_rated_a", "int NOT NULL"); + map.put("v_rated_b", "int NOT NULL"); + map.put("x_sc", "int NOT NULL"); + map.put("graphic_layer", "TEXT NOT NULL"); + map.put("line", "uuid NOT NULL"); + map.put("path", "TEXT NOT NULL"); + map.put("point", "TEXT NOT NULL"); + map.put("inlet_temp", "double precision NOT NULL"); + map.put("return_temp", "double precision NOT NULL"); + map.put("storage_volume_lvl", "double precision NOT NULL"); + map.put("storage_volume_lvl_min", "double precision NOT NULL"); + map.put("thermal_bus", "uuid NOT NULL"); + map.put("eth_capa", "double precision NOT NULL"); + map.put("eth_losses", "double precision NOT NULL"); + map.put("lower_temperature_limit", "double precision NOT NULL"); + map.put("target_temperature", "double precision NOT NULL"); + map.put("upper_temperature_limit", "double precision NOT NULL"); + map.put("b", "double precision NOT NULL"); + map.put("g", "double precision NOT NULL"); + map.put("i_max", "double precision NOT NULL"); + map.put("r", "double precision NOT NULL"); + map.put("x", "double precision NOT NULL"); + + map.put("connected_assets", "TEXT NOT NULL"); + map.put("capex", "double precision NOT NULL"); + map.put("control_strategy", "TEXT NOT NULL"); + + map.put("input_model", "uuid NOT NULL"); + map.put("soc", "double precision NOT NULL"); + map.put("p_max", "double precision NOT NULL"); + map.put("p_min", "double precision NOT NULL"); + map.put("p_ref", "double precision NOT NULL"); + + map.put("dod", "double precision NOT NULL"); + map.put("e_storage", "double precision NOT NULL"); + map.put("eta", "double precision NOT NULL"); + map.put("life_cycle", "double precision NOT NULL"); + map.put("life_time", "double precision NOT NULL"); + map.put("opex", "double precision NOT NULL"); + map.put("active_power_gradient", "double precision NOT NULL"); + + return map; + } + + public static String quote(String input, String quoteSymbol) { + if (input == "") { + return "NULL"; + } else { + return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 8b13ec0d0..b3b5d704f 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -64,13 +64,8 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException * @param updateQuery the query to execute * @return The number of updates or a negative number if the execution failed */ - public int executeUpdate(String updateQuery) { - try (Statement stmt = getConnection().createStatement()) { - return stmt.executeUpdate(updateQuery); - } catch (SQLException e) { - log.error(String.format("Error at execution of query \"%1.127s\": ", updateQuery), e); - return -1; - } + public int executeUpdate(String updateQuery) throws SQLException { + return getConnection().createStatement().executeUpdate(updateQuery); } /** @@ -160,4 +155,11 @@ public Map extractFieldMap(ResultSet rs) { } return insensitiveFieldsToAttributes; } + + public boolean tableExists(Connection connection, String tableName) throws SQLException { + DatabaseMetaData meta = connection.getMetaData(); + ResultSet resultSet = meta.getTables(null, null, tableName, new String[] {"TABLE"}); + + return resultSet.next(); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index e59727668..1801ee345 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -7,12 +7,23 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.timeseries.TimeSeries; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.value.Value; + import java.util.Optional; +import static edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy.logger; + /** A naming strategy for database entities */ public class DatabaseNamingStrategy { private static final String TIME_SERIES_PREFIX = "time_series_"; + + private static final String LOAD_PROFILE_PREFIX = "load_profile_"; + private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; public DatabaseNamingStrategy(EntityPersistenceNamingStrategy entityPersistenceNamingStrategy) { @@ -42,7 +53,47 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { return TIME_SERIES_PREFIX + columnScheme.getScheme(); } + /** + * Provides the name of a load profile given by the load profile key + * @param lpKey Load profile key + * @return the table name + */ + private String getLoadProfileEntityName(String lpKey) { + return LOAD_PROFILE_PREFIX + lpKey; + } + + /** + * Provides the name of a unique entity class. + * @param cls Class extends UniqueEntity + * @return the table name + */ public Optional getEntityName(Class cls) { return entityPersistenceNamingStrategy.getEntityName(cls); } + + /** + * Provides the name of a time series. Used to determine the table name in SQL database. + * @param timeSeries + * @return the table name + */ + public , E extends TimeSeriesEntry, V extends Value> + Optional getEntityName(T timeSeries) { + if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) { + Optional maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst(); + if (maybeFirstElement.isPresent()) { + Class valueClass = maybeFirstElement.get().getValue().getClass(); + return Optional.of(getTimeSeriesEntityName(ColumnScheme.parse(valueClass).orElseThrow())); + } else { + logger.error("Unable to determine content of time series {}", timeSeries); + return Optional.empty(); + } + } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { + return Optional.of( + getLoadProfileEntityName(loadProfileInput.getType().getKey()) + ); + } else { + logger.error("There is no naming strategy defined for {}", timeSeries); + return Optional.empty(); + } + } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 830fbef02..4d2a48454 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -24,6 +24,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import javax.measure.Quantity; @@ -411,7 +412,7 @@ protected String processOperationTime(OperationTime operationTime, String fieldN * @return string representation of the ZonedDateTime */ protected String processZonedDateTime(ZonedDateTime zonedDateTime) { - return zonedDateTime.toString(); + return zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z")); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 8f3bb42f4..b3257ed98 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -79,6 +79,18 @@ Try, ProcessorProviderException> handleEntity(T en .transformF(ProcessorProviderException::new)); } + public Set> handleEntities(List entities) throws ProcessorProviderException { + Set setOfEntities = new HashSet<>(entities); + Set> setOfMaps = new HashSet<>(); + for (T entity : setOfEntities) { + LinkedHashMap entryResult = handleEntity(entity).getOrThrow(); + + /* Prepare the actual result and add them to the set of all results */ + setOfMaps.add(new LinkedHashMap<>(entryResult)); + } + return setOfMaps; + } + /** * Get the correct entity processor * diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java new file mode 100644 index 000000000..e1c1c4e0b --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -0,0 +1,507 @@ +package edu.ie3.datamodel.io.sink; + +import edu.ie3.datamodel.exceptions.*; +import edu.ie3.datamodel.io.DatabaseIdentifier; +import edu.ie3.datamodel.io.connectors.SqlConnector; +import edu.ie3.datamodel.io.extractor.Extractor; +import edu.ie3.datamodel.io.extractor.NestedEntity; +import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; +import edu.ie3.datamodel.io.processor.ProcessorProvider; +import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; +import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.*; +import edu.ie3.datamodel.models.input.connector.*; +import edu.ie3.datamodel.models.input.container.GraphicElements; +import edu.ie3.datamodel.models.input.container.JointGridContainer; +import edu.ie3.datamodel.models.input.container.RawGridElements; +import edu.ie3.datamodel.models.input.container.SystemParticipants; +import edu.ie3.datamodel.models.input.graphics.GraphicInput; +import edu.ie3.datamodel.models.input.system.*; +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; +import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput; +import edu.ie3.datamodel.models.result.ResultEntity; +import edu.ie3.datamodel.models.timeseries.TimeSeries; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.value.Value; +import edu.ie3.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static edu.ie3.datamodel.io.SqlUtils.quote; +import static java.util.UUID.randomUUID; +import static java.util.stream.Collectors.groupingBy; + + +public class SqlSink { + + protected static final Logger log = LoggerFactory.getLogger(SqlSink.class); + + private final SqlConnector connector; + private final DatabaseNamingStrategy databaseNamingStrategy; + private final ProcessorProvider processorProvider; + private final String schemaName; + + private static final String GRID_NAME = "grid_name"; + private static final String GRID_UUID = "grid_uuid"; + private static final String TIME_SERIES = "time_series"; + + public SqlSink( + String schemaName, + DatabaseNamingStrategy databaseNamingStrategy, + SqlConnector connector + ) throws EntityProcessorException { + this(schemaName, new ProcessorProvider(), databaseNamingStrategy, connector); + } + + public SqlSink( + String schemaName, + ProcessorProvider processorProvider, + DatabaseNamingStrategy databaseNamingStrategy, + SqlConnector connector + ) { + this.connector = connector; + this.databaseNamingStrategy = databaseNamingStrategy; + this.processorProvider = processorProvider; + this.schemaName = schemaName; + } + + public void shutdown() { + connector.shutdown(); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + public void persistAll(Collection entities, DatabaseIdentifier identifier) throws SQLException { + // Extract nested entities and add them to the set of entities + Set entitiesToAdd = new HashSet<>(entities); // entities to persist + entities.stream().filter( + entity -> entity instanceof NestedEntity + ).forEach( + entity -> { + try { + entitiesToAdd.addAll((List) Extractor.extractElements((NestedEntity) entity).stream().toList()); + } catch (ExtractorException e) { + log.error( + String.format( + "An error occurred during extraction of nested entity'%s': ", + entity.getClass()), + e); + } + }); + + // Persist the entities in hierarchic order to avoid failure because of foreign keys + for (Class cls : hierarchicInsert()) { + persistMixedList( + entitiesToAdd.stream().filter( + ent -> cls.isAssignableFrom(ent.getClass()) + ).collect(Collectors.toList()), identifier); + entitiesToAdd.removeIf(ent -> cls.isAssignableFrom(ent.getClass())); // maybe it's not necessary but I'm not sure if there are entities who aren't in the hierarchic structure + } + persistMixedList(new ArrayList<>(entitiesToAdd), identifier); // persist left entities + } + + public void persistAllIgnoreNested(Collection entities, DatabaseIdentifier identifier) { + persistMixedList(new ArrayList<>(entities), identifier); + } + + public void persist(C entity, DatabaseIdentifier identifier) throws SQLException { + if (entity instanceof InputEntity inputEntity) { + persistIncludeNested(inputEntity, identifier); + } else if (entity instanceof ResultEntity resultEntity) { + insert(resultEntity, identifier); + } else if (entity instanceof TimeSeries timeSeries) { + persistTimeSeries(timeSeries, identifier); + } else { + log.error("I don't know how to handle an entity of class {}", entity.getClass().getSimpleName()); + } + } + + public void persistIgnoreNested(C entity, DatabaseIdentifier identifier) throws SQLException { + insert(entity, identifier); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + protected void persistListIncludeNested(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { + if (NestedEntity.class.isAssignableFrom(cls)) { + entities.forEach( + entity -> { + try { + List arr = new ArrayList<>(Extractor.extractElements((NestedEntity) entity)); + persistAll(arr, identifier); + } catch (ExtractorException | SQLException e) { + log.error( + String.format( + "An error occurred during extraction of nested entity'%s': ", + cls.getSimpleName()), + e); + } + } + ); + insertListIgnoreNested(entities, cls, identifier); + } else { + insertListIgnoreNested(entities, cls, identifier); + } + } + + public void persistIncludeNested(C entity, DatabaseIdentifier identifier) throws SQLException { + Set entitiesToAdd = new HashSet<>(); + entitiesToAdd.add(entity); + persistAll(entitiesToAdd, identifier); + } + + private void persistMixedList(List entities, DatabaseIdentifier identifier) { + Map, List> entitiesPerClass = entities.stream() + .collect(groupingBy(entity -> (Class) entity.getClass())); + entitiesPerClass.forEach( + (cls, ent) -> { + try { + persistList(ent, cls, identifier); + } catch (SQLException e) { + log.error(String.format( + "An error occurred during extraction of entity'%s': ", + cls.getSimpleName()), + e); + throw new RuntimeException(String.format( + "An error occurred during extraction of entity '%s', SQLReason: '%s'", + cls.getSimpleName(), e.getMessage()), e); + } + } + ); + } + + private , V extends Value> void persistList(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { + // Check if there are only elements of the same class + Class firstClass = entities.get(0).getClass(); + boolean allSameClass = true; + for (Object obj : entities) { + if (obj.getClass() != firstClass) { + allSameClass = false; + break; + } + } + + if (allSameClass) { + if (InputEntity.class.isAssignableFrom(cls)) { + insertListIgnoreNested(entities, cls, identifier); + } else if (ResultEntity.class.isAssignableFrom(cls)) { + insertListIgnoreNested(entities, cls, identifier); + } else if (TimeSeries.class.isAssignableFrom(cls)) { + persistListOfTimeSeries((List>) entities, identifier); + } else { + log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); + } + } else { + log.error("The list isn't homogenous regarding the classes of the elements."); + } + } + + /** + * Writes a list of entities into a sql table. It's necessary that all entities have the same class. + */ + private void insertListIgnoreNested(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { + try { + String[] headerElements = StringUtils.camelCaseToSnakeCase(processorProvider.getHeaderElements(cls)); + String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); + query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier); + connector.executeUpdate(query); + //int expectedElements = entities.size(); + //int addedElements = connector.executeUpdate(query); + //System.out.println("Insert " + cls.getSimpleName() + ": " + " expected " + expectedElements + ", added " + addedElements); + } catch (ProcessorProviderException e) { + log.error("Exception occurred during processor request: ", e); + } + } + + private , V extends Value> void persistListOfTimeSeries( + List> list, DatabaseIdentifier identifier + ) throws SQLException { + for (TimeSeries ts : list) { + persistTimeSeries(ts, identifier); + } + } + + + protected , V extends Value> void persistTimeSeries(TimeSeries timeSeries, DatabaseIdentifier identifier) throws SQLException { + try { + TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); + String[] headerElements = processorProvider.getHeaderElements(key); + persistTimeSeries(timeSeries, headerElements, identifier); + } catch (ProcessorProviderException e) { + log.error( + "Exception occurred during receiving of header elements. Cannot write this element.", e); + } catch (IOException e) { + log.error("Exception occurred during closing of writer.", e); + } + } + + private , V extends Value> void persistTimeSeries( + TimeSeries timeSeries, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException, IOException, SQLException { + try { + String query = basicInsertQueryValuesITS(schemaName, databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), headerElements); + Set> entityFieldData = + processorProvider.handleTimeSeries(timeSeries); + query = query + entityFieldData.stream().map( + //data -> createTimeSeriesQueryLine(sqlEntityFieldData(data), headerElements, identifier, timeSeries.getUuid().toString())).collect(Collectors.joining(",\n", "", "ON CONFLICT (uuid) DO NOTHING;")); + data -> queryTimeSeriesValueLine(sqlEntityFieldData(data), headerElements, identifier, timeSeries.getUuid().toString())).collect(Collectors.joining(",\n", "", ";")); + try { + connector.executeUpdate(query); + //int expectedElements = timeSeries.getEntries().size(); + //int addedElements = connector.executeUpdate(query); + //System.out.println("Insert " + "TimeSeries" + ": " + " expected " + expectedElements + ", added " + addedElements); + } catch (SQLException e) { + throw new SQLException(String.format("Error at execution of query \"%1.127s\": ", query), e); + } + } catch (ProcessorProviderException e) { + throw new ProcessorProviderException("Exception occurred during processor request: ", e); + } + } + + public void persistJointGrid(JointGridContainer jointGridContainer) throws SQLException { + DatabaseIdentifier identifier = new DatabaseIdentifier( + jointGridContainer.getGridName(), randomUUID() + ); + + // get raw grid entities with types or operators + RawGridElements rawGridElements = jointGridContainer.getRawGrid(); + Set nodes = rawGridElements.getNodes(); + Set lines = rawGridElements.getLines(); + Set transformer2Ws = rawGridElements.getTransformer2Ws(); + Set transformer3Ws = rawGridElements.getTransformer3Ws(); + Set switches = rawGridElements.getSwitches(); + Set measurementUnits = rawGridElements.getMeasurementUnits(); + + // get system participants with types or operators + SystemParticipants systemParticipants = jointGridContainer.getSystemParticipants(); + Set bmPlants = systemParticipants.getBmPlants(); + Set chpPlants = systemParticipants.getChpPlants(); + Set evCS = systemParticipants.getEvCS(); + Set evs = systemParticipants.getEvs(); + Set fixedFeedIns = systemParticipants.getFixedFeedIns(); + Set heatPumps = systemParticipants.getHeatPumps(); + Set loads = systemParticipants.getLoads(); + Set pvPlants = systemParticipants.getPvPlants(); + Set storages = systemParticipants.getStorages(); + Set wecPlants = systemParticipants.getWecPlants(); + Set emSystems = systemParticipants.getEmSystems(); + + // get graphic elements (just for better readability, we could also just get them directly + // below) + GraphicElements graphicElements = jointGridContainer.getGraphics(); + + // extract types + Set types = + Stream.of( + lines, + transformer2Ws, + transformer3Ws, + bmPlants, + chpPlants, + evs, + heatPumps, + storages, + wecPlants) + .flatMap(Collection::stream) + .map(Extractor::extractType) + .collect(Collectors.toSet()); + + // extract operators + Set operators = + Stream.of( + nodes, + lines, + transformer2Ws, + transformer3Ws, + switches, + measurementUnits, + bmPlants, + chpPlants, + evCS, + evs, + fixedFeedIns, + heatPumps, + loads, + pvPlants, + storages, + wecPlants, + emSystems) + .flatMap(Collection::stream) + .map(Extractor::extractOperator) + .flatMap(Optional::stream) + .collect(Collectors.toSet()); + + List toAdd = new LinkedList<>(); + toAdd.addAll(rawGridElements.allEntitiesAsList()); + toAdd.addAll(systemParticipants.allEntitiesAsList()); + toAdd.addAll(graphicElements.allEntitiesAsList()); + toAdd.addAll(types); + toAdd.addAll(operators); + + // persist all entities + persistAll(toAdd, identifier); + } + private void insert(C entity, DatabaseIdentifier identifier) throws SQLException { + try { + String[] headerElements = StringUtils.camelCaseToSnakeCase(processorProvider.getHeaderElements(entity.getClass())); + String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(entity.getClass()).orElseThrow(), headerElements) + queryValueLine(entity, headerElements, identifier) + ";"; + connector.executeUpdate(query); + } catch (ProcessorProviderException e) { + log.error("Exception occurred during receiving of header elements. Cannot write this element.", e); + } + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Provides the value lists for an insertion query. Conflicts because of the primary key uuid will be ignored. + * + * WARNING: It's assumed that all entities are from the same class C. + */ + private String createInsertQueryBodyIgnoreConflict(List entities, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException { + Set> entityFieldData = + processorProvider + .handleEntities(entities); + String queryBody = ""; + queryBody = queryBody + entityFieldData.stream().map( + data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)).collect(Collectors.joining(",\n", "", "\nON CONFLICT (uuid) DO NOTHING;")); + return queryBody; + } + + /** + * Provides the value lists for an insertion query. + * + * WARNING: It's assumed that all entities are from the same class C. + */ + private String createInsertQueryBody(List entities, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException { + Set> entityFieldData = + processorProvider + .handleEntities(entities); + String queryBody = ""; + queryBody = queryBody + entityFieldData.stream().map( + data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)).collect(Collectors.joining(",\n", "", ";")); + return queryBody; + } + + /** + * Creates a line with the values of one entity for an insertion query using the entityFieldData. + */ + private String queryValueLine(LinkedHashMap entityFieldData, String[] headerElements, DatabaseIdentifier identifier) { + return writeOneLine(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery())); + } + + /** + * Creates a line with the values of one entity for an insertion query. + */ + private String queryValueLine(C entity, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException { + LinkedHashMap entityFieldData = + processorProvider + .handleEntity(entity) + .map(this::sqlEntityFieldData) + .getOrThrow(); + return writeOneLine(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery())); + } + + private String queryTimeSeriesValueLine(Map entityFieldData, String[] headerElements, DatabaseIdentifier identifier, String TSuuid) { + return writeOneLine(Stream.concat(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), Stream.of(quote(TSuuid,"'")))); + } + + /** + * Quote a given entity field + */ + private LinkedHashMap sqlEntityFieldData( + LinkedHashMap entityFieldData) { + + return entityFieldData.entrySet().stream() + .map( + mapEntry -> + new AbstractMap.SimpleEntry<>( + mapEntry.getKey(), + quote(mapEntry.getValue(), "'"))) + .collect( + Collectors.toMap( + AbstractMap.SimpleEntry::getKey, + AbstractMap.SimpleEntry::getValue, + (v1, v2) -> { + throw new IllegalStateException( + "Converting entity data to RFC 4180 compliant strings has lead to duplicate keys. Initial input:\n\t" + + entityFieldData.entrySet().stream() + .map(entry -> entry.getKey() + " = " + entry.getValue()) + .collect(Collectors.joining(",\n\t"))); + }, + LinkedHashMap::new)); + } + + + /** + * "INSERT INTO" line with schemaName.tableName + */ + private static String basicInsertQuery(String schemaName, String tableName) { + return "INSERT INTO\n\t" + schemaName + "." + tableName; + } + + /** + * Provides the insert, column names, grid identifier and the VALUES statement for a query. + */ + private String basicInsertQueryValuesGrid(String schemaName, String tableName, String[] headerElements) { + String[] addParams = {GRID_NAME, GRID_UUID}; + return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(headerElements, addParams) + "\nVALUES\n"; + } + + /** + * Provides the insert, column names, grid identifier, time_series uuid and the VALUES statement for a query. + */ + private String basicInsertQueryValuesITS(String schemaName, String tableName, String[] headerElements) { + String[] addParams = {GRID_NAME, GRID_UUID, TIME_SERIES}; + return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(headerElements, addParams) + "\nVALUES\n"; + } + + /** + * Converts a stream of strings into an one line string with brackets. + */ + private String writeOneLine(Stream entries) { + return "(" + entries.collect(Collectors.joining(",")) + ")"; + } + + /** + * Converts an array of strings and an array of strings (for additional parameters) into an one line string with brackets. + */ + private String writeOneLine(String[] entries, String[] addParams) { + return writeOneLine(Stream.concat(Arrays.stream(entries), Arrays.stream(addParams))); + } + + + /** + * @return insertion order for unique entities + */ + private static List> hierarchicInsert() { + List> sortedInsert = new ArrayList<>(); + sortedInsert.add(AssetTypeInput.class); //1. Types + sortedInsert.add(OperatorInput.class); //2. Operators + sortedInsert.add(NodeInput.class); //3. Nodes + sortedInsert.add(ThermalBusInput.class); //4. ThermalBus + sortedInsert.add(ThermalUnitInput.class); //5. ThermalUnit + sortedInsert.add(ConnectorInput.class); //6a. ConnectorInput + sortedInsert.add(SystemParticipantInput.class); //6b. SystemParticipantInput + sortedInsert.add(GraphicInput.class); //7. GraphicInput + //8. Rest + return sortedInsert; + } + + private String entitiesToString(Collection entities) { + String res = "[\n"; + int no = 0; + Iterator iterator = entities.iterator(); + while (iterator.hasNext()) { + res = res + "\t (" + no + ") " + iterator.next().toString() + "\n"; + no++; + } + res = res + "]"; + return res; + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 62491ebc6..84f0e6ca5 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -312,7 +312,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("line_input.csv").toFile().exists() testBaseFolderPath.resolve("line_type_input.csv").toFile().exists() testBaseFolderPath.resolve("load_input.csv").toFile().exists() - testBaseFolderPath.resolve( "node_input.csv").toFile().exists() + testBaseFolderPath.resolve("node_input.csv").toFile().exists() testBaseFolderPath.resolve("operator_input.csv").toFile().exists() testBaseFolderPath.resolve("pv_input.csv").toFile().exists() testBaseFolderPath.resolve("storage_input.csv").toFile().exists() diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy new file mode 100644 index 000000000..b8759a546 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -0,0 +1,402 @@ +package edu.ie3.datamodel.io.sink + +import edu.ie3.datamodel.io.DatabaseIdentifier +import edu.ie3.datamodel.io.SqlUtils +import edu.ie3.datamodel.io.connectors.SqlConnector +import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory +import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy +import edu.ie3.datamodel.io.naming.FileNamingStrategy +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation +import edu.ie3.datamodel.io.processor.ProcessorProvider +import edu.ie3.datamodel.io.processor.input.InputEntityProcessor +import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor +import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor +import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey +import edu.ie3.datamodel.io.source.csv.CsvTimeSeriesSource +import edu.ie3.datamodel.io.source.sql.SqlDataSource +import edu.ie3.datamodel.io.source.sql.SqlTimeSeriesSource +import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.NodeInput +import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.connector.LineInput +import edu.ie3.datamodel.models.input.connector.Transformer2WInput +import edu.ie3.datamodel.models.input.connector.type.LineTypeInput +import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput +import edu.ie3.datamodel.models.input.graphics.LineGraphicInput +import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput +import edu.ie3.datamodel.models.input.system.EmInput +import edu.ie3.datamodel.models.input.system.EvcsInput +import edu.ie3.datamodel.models.input.system.LoadInput +import edu.ie3.datamodel.models.input.system.PvInput +import edu.ie3.datamodel.models.input.system.StorageInput +import edu.ie3.datamodel.models.input.system.WecInput +import edu.ie3.datamodel.models.input.system.characteristic.CosPhiFixed +import edu.ie3.datamodel.models.input.system.type.StorageTypeInput +import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput +import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput +import edu.ie3.datamodel.models.result.system.EmResult +import edu.ie3.datamodel.models.result.system.EvResult +import edu.ie3.datamodel.models.result.system.EvcsResult +import edu.ie3.datamodel.models.result.system.FlexOptionsResult +import edu.ie3.datamodel.models.result.system.PvResult +import edu.ie3.datamodel.models.result.system.WecResult +import edu.ie3.datamodel.models.timeseries.TimeSeries +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry +import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries +import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.value.EnergyPriceValue +import edu.ie3.datamodel.models.value.Value +import edu.ie3.test.common.GridTestData +import edu.ie3.test.common.SampleJointGrid +import edu.ie3.test.common.ThermalUnitInputTestData +import edu.ie3.test.common.TimeSeriesTestData +import edu.ie3.test.helper.TestContainerHelper +import edu.ie3.util.TimeUtil +import edu.ie3.util.io.FileIOUtils +import org.jetbrains.annotations.NotNull +import org.testcontainers.containers.Container +import org.testcontainers.containers.PostgreSQLContainer +import org.testcontainers.utility.MountableFile +import spock.lang.Shared +import spock.lang.Specification +import org.testcontainers.spock.Testcontainers +import tech.units.indriya.quantity.Quantities + +import javax.measure.Quantity +import javax.measure.quantity.Power +import java.nio.file.Path + +import edu.ie3.test.common.SystemParticipantTestData + +import java.sql.SQLException +import java.time.ZoneId +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter + +import static edu.ie3.datamodel.models.StandardUnits.ENERGY_PRICE +import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM +import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM +import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE +import static tech.units.indriya.unit.Units.PERCENT + +@Testcontainers +class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeriesTestData { + + @Shared + PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:14.2") + + @Shared + SqlConnector connector + + @Shared + SqlDataSource sqlSource + + @Shared + DatabaseNamingStrategy namingStrategy + + @Shared + DatabaseIdentifier identifier + + static String schemaName = "public" + + def setupSpec() { + // Copy sql import scripts into docker + MountableFile sqlImportFile = getMountableFile("_sql/") + postgreSQLContainer.copyFileToContainer(sqlImportFile, "/home/") + postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + "setup.sql") + + connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) + + namingStrategy = new DatabaseNamingStrategy() + + identifier = new DatabaseIdentifier("vn_simona", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120002")) + + sqlSource = new SqlDataSource(connector, schemaName, namingStrategy) + } + + def setup() { + // Execute import script + Iterable importFiles = Arrays.asList( + "types.sql", + "result_entities.sql", + "input_entities.sql", + "time_series.sql", + "load_profile.sql" + ) + for (String file: importFiles) { + Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) + assert res.stderr.empty + } + } + + def cleanup() { + postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + "cleanup.sql") + } + + def "SQL sink can persist provided elements correctly"() { + given: + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + HashMap timeSeriesProcessorMap = new HashMap<>() + timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) + IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries + + SqlSink sink = new SqlSink(schemaName, + new ProcessorProvider([ + new ResultEntityProcessor(PvResult), + new ResultEntityProcessor(WecResult), + new ResultEntityProcessor(EvResult), + new ResultEntityProcessor(EvcsResult), + new ResultEntityProcessor(EmResult), + new ResultEntityProcessor(FlexOptionsResult), + new InputEntityProcessor(Transformer2WInput), + new InputEntityProcessor(NodeInput), + new InputEntityProcessor(EvcsInput), + new InputEntityProcessor(Transformer2WTypeInput), + new InputEntityProcessor(LineGraphicInput), + new InputEntityProcessor(NodeGraphicInput), + new InputEntityProcessor(CylindricalStorageInput), + new InputEntityProcessor(ThermalHouseInput), + new InputEntityProcessor(OperatorInput), + new InputEntityProcessor(LineInput), + new InputEntityProcessor(ThermalBusInput), + new InputEntityProcessor(LineTypeInput), + new InputEntityProcessor(LoadInput), + new InputEntityProcessor(EmInput) + ], timeSeriesProcessorMap), + namingStrategy, + connector) + UUID uuid = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") + UUID inputModel = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") + Quantity p = Quantities.getQuantity(10, StandardUnits.ACTIVE_POWER_IN) + Quantity q = Quantities.getQuantity(10, StandardUnits.REACTIVE_POWER_IN) + PvResult pvResult = new PvResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + WecResult wecResult = new WecResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + EvcsResult evcsResult = new EvcsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + EmResult emResult = new EmResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + + Quantity pRef = Quantities.getQuantity(5.1, StandardUnits.ACTIVE_POWER_RESULT) + Quantity pMin = Quantities.getQuantity(-6, StandardUnits.ACTIVE_POWER_RESULT) + Quantity pMax = Quantities.getQuantity(6, StandardUnits.ACTIVE_POWER_RESULT) + FlexOptionsResult flexOptionsResult = new FlexOptionsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, pRef, pMin, pMax) + + when: + sink.persistAll([ + pvResult, + wecResult, + evcsResult, + emResult, + flexOptionsResult, + GridTestData.transformerCtoG, + GridTestData.lineGraphicCtoD, + GridTestData.nodeGraphicC, + ThermalUnitInputTestData.cylindricStorageInput, + ThermalUnitInputTestData.thermalHouseInput, + SystemParticipantTestData.evcsInput, + SystemParticipantTestData.loadInput, + SystemParticipantTestData.emInput, + individualTimeSeries + ], identifier) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "pv_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "evcs_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "flex_options_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_type_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_input", ps -> {}).count() == 4 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "operator_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "cylindrical_storage_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_graphic_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_graphic_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_bus_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_house_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "ev_res", ps -> {}).count() == 0 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 + + cleanup: + sink.shutdown() + } + + + def "A SqlSink can persist a time series."() { + given: + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + HashMap timeSeriesProcessorMap = new HashMap<>() + timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) + IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries + SqlSink sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + sink.persist(individualTimeSeries, identifier) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink persists a bunch of time series correctly"() { + given: + SqlSink sink = new SqlSink(schemaName, namingStrategy, connector) + SqlDataSource source = new SqlDataSource(connector, schemaName, namingStrategy) + + when: + sink.persistAll(allTimeSeries, identifier) + + then: + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_p", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pq", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_ph", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pqh", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_weather", ps -> {}).count() == 3 + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink throws an exception if an entity has null for a not null attribute."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + def nestedInput = new PvInput( + UUID.fromString("d56f15b7-8293-4b98-b5bd-58f6273ce229"), + "test_pvInput", + OperatorInput.NO_OPERATOR_ASSIGNED, + OperationTime.notLimited(), + Mock(NodeInput), + new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), + 0.2, + Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), + Quantities.getQuantity(95d, PERCENT), + Quantities.getQuantity(41.01871871948242, DEGREE_GEOM), + 0.8999999761581421, + 1, + false, + Quantities.getQuantity(25d, KILOVOLTAMPERE), + 0.95 + ) + + when: + sink.persistIgnoreNested(nestedInput, identifier) + + then: + def exception = thrown(SQLException) + exception.message == "ERROR: invalid input syntax for type uuid: \"null\"\n Position: 365" + + cleanup: + sink.shutdown() + } + + + def "A valid SqlSink refuses to persist an entity, if no processor can be found for a specific input"() { + given: + def sink = new SqlSink( + schemaName, + new ProcessorProvider( + ProcessorProvider.allEntityProcessors(), + new HashMap, Value>, TimeSeriesEntry, Value>>()), + namingStrategy, + connector) + + when: + sink.persist(individualEnergyPriceTimeSeries, identifier) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 0 + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink throws an exception if a nested entity hasn't all of its nested entity."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + sink.persistIgnoreNested(SystemParticipantTestData.loadInput, identifier) + + then: + def exception = thrown(SQLException) + exception.message == "ERROR: insert or update on table \"load_input\" violates foreign key constraint \"load_input_node_fkey\"\n" + + " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\"." + + cleanup: + sink.shutdown() + } + + + def "A valid SqlSink should persist a valid joint grid container correctly"() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + sink.persistJointGrid(SampleJointGrid.grid()) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 6 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_type_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_input", ps -> {}).count() == 7 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "operator_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "pv_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "storage_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "storage_type_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_type_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_input", ps -> {}).count() == 2 + + cleanup: + sink.shutdown() + } + + /* + def "Ausgabe"() { + given: + System.out.println(SqlUtils.getDataTypes(StorageTypeInput.class)) + //System.out.println(SqlUtils.getDataTypes(StorageInput.class)) + //System.out.println(SqlUtils.getDataTypes(NodeInput.class)) + + System.out.println(SqlUtils.getDataTypes(PvResult.class)) + System.out.println(SqlUtils.getDataTypes(WecResult.class)) + System.out.println(SqlUtils.getDataTypes(EvResult.class)) + System.out.println(SqlUtils.getDataTypes(EvcsResult.class)) + System.out.println(SqlUtils.getDataTypes(EmResult.class)) + System.out.println(SqlUtils.getDataTypes(FlexOptionsResult.class)) + + + System.out.println(SqlUtils.getDataTypes(Transformer2WInput.class)) + System.out.println(SqlUtils.getDataTypes(NodeInput.class)) + System.out.println(SqlUtils.getDataTypes(EvcsInput.class)) + System.out.println(SqlUtils.getDataTypes(LineGraphicInput.class)) + System.out.println(SqlUtils.getDataTypes(NodeGraphicInput.class)) + System.out.println(SqlUtils.getDataTypes(CylindricalStorageInput.class)) + System.out.println(SqlUtils.getDataTypes(ThermalHouseInput.class)) + System.out.println(SqlUtils.getDataTypes(OperatorInput.class)) + System.out.println(SqlUtils.getDataTypes(LineInput.class)) + System.out.println(SqlUtils.getDataTypes(ThermalBusInput.class)) + System.out.println(SqlUtils.getDataTypes(LineTypeInput.class)) + System.out.println(SqlUtils.getDataTypes(LoadInput.class)) + System.out.println(SqlUtils.getDataTypes(EmInput.class)) + + System.out.println(SqlUtils.getDataTypes(Transformer2WTypeInput.class)) + + + when: + def nummer = 1 + + then: + nummer == 1 + } + */ +} diff --git a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy index a9f1aeb63..57a19b06f 100644 --- a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy +++ b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy @@ -381,8 +381,8 @@ class SampleJointGrid extends SystemParticipantTestData { public static final Transformer2WTypeInput transformerType_MV_HV_110KV = new Transformer2WTypeInput( - UUID.fromString("08559390-d7c0-4427-a2dc-97ba312ae0ac"), - "MS-NS_1", + UUID.fromString("deecabd2-5ddb-11ee-8c99-0242ac120002"), + "HS-MS_1", Quantities.getQuantity(10.078, OHM), Quantities.getQuantity(23.312, OHM), Quantities.getQuantity(800d, KILOVOLTAMPERE), diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 61986f7ad..0da55b6cd 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.test.common +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.timeseries.IntValue @@ -52,6 +54,11 @@ trait TimeSeriesTestData { ] as Set ) + IndividualTimeSeriesMetaInformation individualEnergyPriceTimeSeriesMeta = new IndividualTimeSeriesMetaInformation( + UUID.fromString("a4bbcb77-b9d0-4b88-92be-b9a14a3e332b"), + ColumnScheme.ENERGY_PRICE + ) + Set> individualEnergyPriceTimeSeriesProcessed = [ [ "uuid" : "9e4dba1b-f3bb-4e40-bd7e-2de7e81b7704", diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/cleanup.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/cleanup.sql new file mode 100644 index 000000000..3dd1acf4a --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/cleanup.sql @@ -0,0 +1,7 @@ +DO $$ DECLARE +r RECORD; +BEGIN +FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP + EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; +END LOOP; +END $$; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql new file mode 100644 index 000000000..fa6d569aa --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -0,0 +1,240 @@ +CREATE TABLE public.node_input +( + uuid uuid PRIMARY KEY, + geo_position TEXT NOT NULL, + id TEXT NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + slack bool NOT NULL, + subnet int NOT NULL, + v_rated double precision NOT NULL, + v_target double precision NOT NULL, + volt_lvl TEXT NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.transformer_2_w_input +( + uuid uuid PRIMARY KEY, + auto_tap bool NOT NULL, + id TEXT NOT NULL, + node_a uuid NOT NULL REFERENCES node_input(uuid), + node_b uuid NOT NULL REFERENCES node_input(uuid), + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + parallel_devices int NOT NULL, + tap_pos int NOT NULL, + type uuid NOT NULL REFERENCES transformer_2_w_type_input(uuid), + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.evcs_input +( + uuid uuid PRIMARY KEY, + charging_points int NOT NULL, + cos_phi_rated TEXT NOT NULL, + id TEXT NOT NULL, + location_type TEXT NOT NULL, + node uuid NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + q_characteristics TEXT NOT NULL, + type TEXT NOT NULL, + v_2g_support bool NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.line_graphic_input +( + uuid uuid PRIMARY KEY, + graphic_layer TEXT NOT NULL, + line uuid NOT NULL, + path TEXT, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.node_graphic_input +( + uuid uuid PRIMARY KEY, + graphic_layer TEXT NOT NULL, + node uuid NOT NULL, + path TEXT, + point TEXT NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.cylindrical_storage_input +( + uuid uuid PRIMARY KEY, + c double precision NOT NULL, + id TEXT NOT NULL, + inlet_temp double precision NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + return_temp double precision NOT NULL, + storage_volume_lvl double precision NOT NULL, + storage_volume_lvl_min double precision NOT NULL, + thermal_bus uuid NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.thermal_house_input +( + uuid uuid PRIMARY KEY, + eth_capa double precision NOT NULL, + eth_losses double precision NOT NULL, + id TEXT NOT NULL, + lower_temperature_limit double precision NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + target_temperature double precision NOT NULL, + thermal_bus uuid NOT NULL, + upper_temperature_limit double precision NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.operator_input +( + uuid uuid PRIMARY KEY, + id TEXT NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.line_input +( + uuid uuid PRIMARY KEY, + geo_position TEXT NOT NULL, + id TEXT NOT NULL, + length double precision NOT NULL, + node_a uuid NOT NULL, + node_b uuid NOT NULL, + olm_characteristic TEXT NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + parallel_devices int NOT NULL, + type uuid NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.thermal_bus_input +( + uuid uuid PRIMARY KEY, + id TEXT NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.load_input +( + uuid uuid PRIMARY KEY, + cos_phi_rated TEXT NOT NULL, + dsm bool NOT NULL, + e_cons_annual double precision NOT NULL, + id TEXT NOT NULL, + load_profile TEXT NOT NULL, + node uuid NOT NULL REFERENCES node_input(uuid), + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + q_characteristics TEXT NOT NULL, + s_rated double precision NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.em_input +( + uuid uuid PRIMARY KEY, + connected_assets TEXT NOT NULL, + control_strategy TEXT NOT NULL, + id TEXT NOT NULL, + node uuid NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + q_characteristics TEXT NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.pv_input +( + uuid uuid PRIMARY KEY, + albedo double precision NOT NULL, + azimuth double precision NOT NULL, + cos_phi_rated TEXT NOT NULL, + elevation_angle double precision NOT NULL, + eta_conv double precision NOT NULL, + id TEXT NOT NULL, + k_g double precision NOT NULL, + k_t double precision NOT NULL, + market_reaction bool NOT NULL, + node uuid NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + q_characteristics TEXT NOT NULL, + s_rated double precision NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.storage_input +( + uuid uuid PRIMARY KEY, + id TEXT NOT NULL, + node uuid NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + q_characteristics TEXT NOT NULL, + type uuid NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql new file mode 100644 index 000000000..45cf68173 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql @@ -0,0 +1,13 @@ +CREATE TABLE public.load_profile_g2 +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + dayOfWeek TEXT NOT NULL, + quarterHourOfDay TEXT NOT NULL, + p double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql new file mode 100644 index 000000000..f6ad68d49 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql @@ -0,0 +1,79 @@ +CREATE TABLE public.pv_res +( + uuid uuid PRIMARY KEY, + input_model uuid NOT NULL, + p double precision NOT NULL, + q double precision NOT NULL, + time timestamp with time zone NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.wec_res +( + uuid uuid PRIMARY KEY, + input_model uuid NOT NULL, + p double precision NOT NULL, + q double precision NOT NULL, + time timestamp with time zone NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.ev_res +( + uuid uuid PRIMARY KEY, + input_model uuid NOT NULL, + p double precision NOT NULL, + q double precision NOT NULL, + soc double precision NOT NULL, + time timestamp with time zone NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.evcs_res +( + uuid uuid PRIMARY KEY, + input_model uuid NOT NULL, + p double precision NOT NULL, + q double precision NOT NULL, + time timestamp with time zone NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.em_res +( + uuid uuid PRIMARY KEY, + input_model uuid NOT NULL, + p double precision NOT NULL, + q double precision NOT NULL, + time timestamp with time zone NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.flex_options_res +( + uuid uuid PRIMARY KEY, + input_model uuid NOT NULL, + p_max double precision NOT NULL, + p_min double precision NOT NULL, + p_ref double precision NOT NULL, + time timestamp with time zone NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/setup.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/setup.sql new file mode 100644 index 000000000..aacd7775c --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/setup.sql @@ -0,0 +1 @@ +CREATE SCHEMA public; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql new file mode 100644 index 000000000..a5cb071e5 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql @@ -0,0 +1,16 @@ +CREATE TABLE public.test_data_sql +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + p double precision NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX test_data_sql_series_id ON test_data_sql USING hash (time_series); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX test_data_sql_series_time ON test_data_sql USING btree (time_series, time); \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql new file mode 100644 index 000000000..23184d899 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql @@ -0,0 +1,123 @@ +CREATE TABLE public.time_series_c +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + price double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_c_series_id ON time_series_c USING hash (time_series); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX time_series_c_series_time ON time_series_c USING btree (time_series, time); + +CREATE TABLE public.time_series_p +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + p double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_p_series_id ON time_series_p USING hash (time_series); + +CREATE UNIQUE INDEX time_series_p_series_time ON time_series_p USING btree (time_series, time); + +CREATE TABLE public.time_series_pq +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + p double precision, + q double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_pq_series_id ON time_series_pq USING hash (time_series); + +CREATE UNIQUE INDEX time_series_pq_series_time ON time_series_pq USING btree (time_series, time); + +CREATE TABLE public.time_series_h +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + heatDemand double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_h_series_id ON time_series_h USING hash (time_series); + +CREATE UNIQUE INDEX time_series_h_series_time ON time_series_h USING btree (time_series, time); + +CREATE TABLE public.time_series_ph +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + p double precision, + heatDemand double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_ph_series_id ON time_series_ph USING hash (time_series); + +CREATE UNIQUE INDEX time_series_ph_series_time ON time_series_ph USING btree (time_series, time); + +CREATE TABLE public.time_series_pqh +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + time timestamp with time zone NOT NULL, + p double precision, + q double precision, + heatDemand double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_pqh_series_id ON time_series_pqh USING hash (time_series); + +CREATE UNIQUE INDEX time_series_pqh_series_time ON time_series_pqh USING btree (time_series, time); + +CREATE TABLE public.time_series_weather +( + uuid uuid PRIMARY KEY, + time_series uuid NOT NULL, + coordinate TEXT NOT NULL, + time timestamp with time zone NOT NULL, + diffuseIrradiance double precision, + directIrradiance double precision, + direction double precision, + temperature double precision, + velocity double precision, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX time_series_weather_series_id ON time_series_weather USING hash (time_series); + +CREATE UNIQUE INDEX time_series_weather_series_time ON time_series_weather USING btree (time_series, time); \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql new file mode 100644 index 000000000..3d8bd328d --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql @@ -0,0 +1,59 @@ +CREATE TABLE public.transformer_2_w_type_input +( + uuid uuid PRIMARY KEY, + b_m double precision NOT NULL, + d_phi double precision NOT NULL, + d_v double precision NOT NULL, + g_m double precision NOT NULL, + id TEXT NOT NULL, + r_sc double precision NOT NULL, + s_rated double precision NOT NULL, + tap_max int NOT NULL, + tap_min int NOT NULL, + tap_neutr int NOT NULL, + tap_side bool NOT NULL, + v_rated_a double precision NOT NULL, + v_rated_b double precision NOT NULL, + x_sc double precision NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.line_type_input +( + uuid uuid PRIMARY KEY, + b double precision NOT NULL, + g double precision NOT NULL, + i_max double precision NOT NULL, + id TEXT NOT NULL, + r double precision NOT NULL, + v_rated double precision NOT NULL, + x double precision NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE TABLE public.storage_type_input +( + uuid uuid PRIMARY KEY, + active_power_gradient double precision NOT NULL, + capex double precision NOT NULL, + cos_phi_rated TEXT NOT NULL, + dod double precision NOT NULL, + e_storage double precision NOT NULL, + eta double precision NOT NULL, + id TEXT NOT NULL, + life_cycle double precision NOT NULL, + life_time double precision NOT NULL, + opex double precision NOT NULL, + p_max double precision NOT NULL, + s_rated double precision NOT NULL, + grid_name TEXT NOT NULL, + grid_uuid uuid NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql index 13bb195bf..56251bb93 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql +++ b/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql @@ -1,6 +1,6 @@ CREATE TABLE public.line_type_input ( - uuid uuid NOT NULL, + uuid BINARY(16) NOT NULL, id varchar NOT NULL, v_rated double precision NOT NULL, i_max double precision NOT NULL, diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml index fd2d36637..dd7c536aa 100644 --- a/src/test/resources/log4j2-test.xml +++ b/src/test/resources/log4j2-test.xml @@ -25,7 +25,7 @@ - + From b4a04ae3bf1e2cfb7084b385dfa8bd32b0d651ab Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Wed, 4 Oct 2023 11:23:46 +0200 Subject: [PATCH 002/310] New quoting --- .../edu/ie3/datamodel/io/sink/SqlSink.java | 46 +++++++------------ .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 2 +- .../datamodel/io/sink/_sql/load_profile.sql | 4 +- .../datamodel/io/sink/_sql/time_series.sql | 10 ++-- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index e1c1c4e0b..ae357217e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -1,5 +1,6 @@ package edu.ie3.datamodel.io.sink; +import com.couchbase.client.core.deps.io.perfmark.Link; import edu.ie3.datamodel.exceptions.*; import edu.ie3.datamodel.io.DatabaseIdentifier; import edu.ie3.datamodel.io.connectors.SqlConnector; @@ -207,7 +208,7 @@ private , V extends Value> */ private void insertListIgnoreNested(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { try { - String[] headerElements = StringUtils.camelCaseToSnakeCase(processorProvider.getHeaderElements(cls)); + String[] headerElements = processorProvider.getHeaderElements(cls); String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier); connector.executeUpdate(query); @@ -248,7 +249,6 @@ private , V extends Value> void persistTimeSeries( Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); query = query + entityFieldData.stream().map( - //data -> createTimeSeriesQueryLine(sqlEntityFieldData(data), headerElements, identifier, timeSeries.getUuid().toString())).collect(Collectors.joining(",\n", "", "ON CONFLICT (uuid) DO NOTHING;")); data -> queryTimeSeriesValueLine(sqlEntityFieldData(data), headerElements, identifier, timeSeries.getUuid().toString())).collect(Collectors.joining(",\n", "", ";")); try { connector.executeUpdate(query); @@ -348,7 +348,7 @@ public void persistJointGrid(JointGridContainer jointGridContainer) throws SQLEx } private void insert(C entity, DatabaseIdentifier identifier) throws SQLException { try { - String[] headerElements = StringUtils.camelCaseToSnakeCase(processorProvider.getHeaderElements(entity.getClass())); + String[] headerElements = processorProvider.getHeaderElements(entity.getClass()); String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(entity.getClass()).orElseThrow(), headerElements) + queryValueLine(entity, headerElements, identifier) + ";"; connector.executeUpdate(query); } catch (ProcessorProviderException e) { @@ -369,7 +369,9 @@ private String createInsertQueryBodyIgnoreConflict(List .handleEntities(entities); String queryBody = ""; queryBody = queryBody + entityFieldData.stream().map( - data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)).collect(Collectors.joining(",\n", "", "\nON CONFLICT (uuid) DO NOTHING;")); + data -> + queryValueLine(sqlEntityFieldData(data), headerElements, identifier) + ).collect(Collectors.joining(",\n", "", "\nON CONFLICT (uuid) DO NOTHING;")); return queryBody; } @@ -411,30 +413,16 @@ private String queryTimeSeriesValueLine(Map entityFieldData, Str return writeOneLine(Stream.concat(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), Stream.of(quote(TSuuid,"'")))); } - /** - * Quote a given entity field - */ + private LinkedHashMap sqlEntityFieldData( - LinkedHashMap entityFieldData) { - - return entityFieldData.entrySet().stream() - .map( - mapEntry -> - new AbstractMap.SimpleEntry<>( - mapEntry.getKey(), - quote(mapEntry.getValue(), "'"))) - .collect( - Collectors.toMap( - AbstractMap.SimpleEntry::getKey, - AbstractMap.SimpleEntry::getValue, - (v1, v2) -> { - throw new IllegalStateException( - "Converting entity data to RFC 4180 compliant strings has lead to duplicate keys. Initial input:\n\t" - + entityFieldData.entrySet().stream() - .map(entry -> entry.getKey() + " = " + entry.getValue()) - .collect(Collectors.joining(",\n\t"))); - }, - LinkedHashMap::new)); + LinkedHashMap entityFieldData + ) { + LinkedHashMap quotedEntityFieldData = new LinkedHashMap<>(entityFieldData); + quotedEntityFieldData.replaceAll( + (key, ent) -> quote(ent, "'") + ); + + return quotedEntityFieldData; } @@ -450,7 +438,7 @@ private static String basicInsertQuery(String schemaName, String tableName) { */ private String basicInsertQueryValuesGrid(String schemaName, String tableName, String[] headerElements) { String[] addParams = {GRID_NAME, GRID_UUID}; - return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(headerElements, addParams) + "\nVALUES\n"; + return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + "\nVALUES\n"; } /** @@ -458,7 +446,7 @@ private String basicInsertQueryValuesGrid(String schemaName, String tableName, S */ private String basicInsertQueryValuesITS(String schemaName, String tableName, String[] headerElements) { String[] addParams = {GRID_NAME, GRID_UUID, TIME_SERIES}; - return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(headerElements, addParams) + "\nVALUES\n"; + return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + "\nVALUES\n"; } /** diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index b8759a546..7b4878461 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -293,7 +293,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri then: def exception = thrown(SQLException) - exception.message == "ERROR: invalid input syntax for type uuid: \"null\"\n Position: 365" + exception.message.contains("ERROR: invalid input syntax for type uuid: \"null\"\n") cleanup: sink.shutdown() diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql index 45cf68173..13ff7f12c 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql @@ -2,8 +2,8 @@ CREATE TABLE public.load_profile_g2 ( uuid uuid PRIMARY KEY, time_series uuid NOT NULL, - dayOfWeek TEXT NOT NULL, - quarterHourOfDay TEXT NOT NULL, + day_of_week TEXT NOT NULL, + quarter_hour_of_day TEXT NOT NULL, p double precision, grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql index 23184d899..640be69d0 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql @@ -55,7 +55,7 @@ CREATE TABLE public.time_series_h uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, - heatDemand double precision, + heat_demand double precision, grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) @@ -72,7 +72,7 @@ CREATE TABLE public.time_series_ph time_series uuid NOT NULL, time timestamp with time zone NOT NULL, p double precision, - heatDemand double precision, + heat_demand double precision, grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) @@ -90,7 +90,7 @@ CREATE TABLE public.time_series_pqh time timestamp with time zone NOT NULL, p double precision, q double precision, - heatDemand double precision, + heat_demand double precision, grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) @@ -107,8 +107,8 @@ CREATE TABLE public.time_series_weather time_series uuid NOT NULL, coordinate TEXT NOT NULL, time timestamp with time zone NOT NULL, - diffuseIrradiance double precision, - directIrradiance double precision, + diffuse_irradiance double precision, + direct_irradiance double precision, direction double precision, temperature double precision, velocity double precision, From d5f1c9f9ed755fda95a702625e9fb73465b37e43 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Thu, 12 Oct 2023 15:37:32 +0200 Subject: [PATCH 003/310] documentations --- .../edu/ie3/datamodel/io/sink/SqlSink.java | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index ae357217e..a8bc24480 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -1,12 +1,12 @@ package edu.ie3.datamodel.io.sink; -import com.couchbase.client.core.deps.io.perfmark.Link; import edu.ie3.datamodel.exceptions.*; import edu.ie3.datamodel.io.DatabaseIdentifier; import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.extractor.Extractor; import edu.ie3.datamodel.io.extractor.NestedEntity; import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; +import edu.ie3.datamodel.io.processor.EntityProcessor; import edu.ie3.datamodel.io.processor.ProcessorProvider; import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; import edu.ie3.datamodel.models.UniqueEntity; @@ -78,23 +78,32 @@ public void shutdown() { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + /** + * Entry point of a data sink to persist multiple entities in a collection. + * @param entities a collection of entities that should be persisted + * @param identifier identifier of the grid + * @param bounded to be all unique entities. Handling of specific entities is normally then + * executed by a specific {@link EntityProcessor} + * @throws SQLException + */ public void persistAll(Collection entities, DatabaseIdentifier identifier) throws SQLException { // Extract nested entities and add them to the set of entities Set entitiesToAdd = new HashSet<>(entities); // entities to persist - entities.stream().filter( - entity -> entity instanceof NestedEntity - ).forEach( + entities.stream().forEach( entity -> { - try { - entitiesToAdd.addAll((List) Extractor.extractElements((NestedEntity) entity).stream().toList()); - } catch (ExtractorException e) { - log.error( - String.format( - "An error occurred during extraction of nested entity'%s': ", - entity.getClass()), - e); + if (entity instanceof NestedEntity nestedEntity) { + try { + entitiesToAdd.addAll((List) Extractor.extractElements(nestedEntity).stream().toList()); + } catch (ExtractorException e) { + log.error( + String.format( + "An error occurred during extraction of nested entity'%s': ", + entity.getClass()), + e); + } } - }); + } + ); // Persist the entities in hierarchic order to avoid failure because of foreign keys for (Class cls : hierarchicInsert()) { @@ -107,10 +116,21 @@ public void persistAll(Collection entities, Database persistMixedList(new ArrayList<>(entitiesToAdd), identifier); // persist left entities } - public void persistAllIgnoreNested(Collection entities, DatabaseIdentifier identifier) { + /** + * Persist multiple input entities in a collection. In contrast to {@link SqlSink#persistAll} this function does not extract nested entities. + * @param entities a collection of entities that should be persisted + * @param identifier identifier of the grid + */ + public void persistAllIgnoreNested(Collection entities, DatabaseIdentifier identifier) { persistMixedList(new ArrayList<>(entities), identifier); } + /** + * Persist an entity. By default this method take care about the extraction process of nested entities (if any) + * @param entity the entity that should be persisted + * @param identifier identifier of the grid + * @throws SQLException + */ public void persist(C entity, DatabaseIdentifier identifier) throws SQLException { if (entity instanceof InputEntity inputEntity) { persistIncludeNested(inputEntity, identifier); @@ -123,6 +143,12 @@ public void persist(C entity, DatabaseIdentifier identi } } + /** + * Persist an entity. In contrast to {@link SqlSink#persist} this function doe not extract nested entities. + * @param entity the entity that should be persisted + * @param identifier identifier of the grid + * @throws SQLException + */ public void persistIgnoreNested(C entity, DatabaseIdentifier identifier) throws SQLException { insert(entity, identifier); } From 31ff1c880c82acc915d61a2c9fabd1860b0f41cb Mon Sep 17 00:00:00 2001 From: smjobaoo Date: Tue, 21 Nov 2023 16:46:42 +0100 Subject: [PATCH 004/310] implementend createTable --- .../ie3/datamodel/io/DatabaseIdentifier.java | 43 ------ .../edu/ie3/datamodel/io/DbGridMetadata.java | 24 ++++ .../java/edu/ie3/datamodel/io/SqlUtils.java | 53 ++++--- .../io/naming/DatabaseNamingStrategy.java | 2 +- .../edu/ie3/datamodel/io/sink/SqlSink.java | 136 ++++++++---------- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 95 +++++------- .../edu/ie3/datamodel/io/sink/_sql/grids.sql | 13 ++ .../datamodel/io/sink/_sql/input_entities.sql | 42 ++---- .../datamodel/io/sink/_sql/load_profile.sql | 3 +- .../io/sink/_sql/result_entities.sql | 6 - .../datamodel/io/sink/_sql/time_series.sql | 21 +-- .../edu/ie3/datamodel/io/sink/_sql/types.sql | 11 +- 12 files changed, 182 insertions(+), 267 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java create mode 100644 src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql diff --git a/src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java b/src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java deleted file mode 100644 index 14d9c0738..000000000 --- a/src/main/java/edu/ie3/datamodel/io/DatabaseIdentifier.java +++ /dev/null @@ -1,43 +0,0 @@ -package edu.ie3.datamodel.io; - -import java.util.UUID; -import java.util.stream.Stream; - -import static edu.ie3.datamodel.io.IoUtil.quote; - -/** - * Class for identification of grids and results in SQL databases. - */ -public class DatabaseIdentifier { - - private final String identifier; - private final UUID uuid; - - public DatabaseIdentifier( - String identifier, - UUID uuid - ) { - this.identifier = identifier; - this.uuid = uuid; - } - - public String getIdentifier() { - return identifier; - } - - public UUID getUuid() { - return uuid; - } - - public String toString() { - return "identifier=" + identifier + ", uuid=" + uuid.toString(); - } - - public String[] getQueryString() { - return new String[]{quote(identifier, "'"), quote(uuid.toString(), "'")}; - } - - public Stream getStreamForQuery() { - return Stream.concat(Stream.of(quote(identifier, "'")), Stream.of(quote(uuid.toString(), "'"))); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java new file mode 100644 index 000000000..ae1e2b6cb --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java @@ -0,0 +1,24 @@ +package edu.ie3.datamodel.io; + +import java.util.UUID; +import java.util.stream.Stream; + +import static edu.ie3.datamodel.io.IoUtil.quote; + +/** + * Class for identification of entities and results from grids in SQL databases. + */ +public record DbGridMetadata(String gridName, UUID uuid) { + + public static final String GRID_NAME = "grid_name"; + public static final String GRID_UUID = "grid_uuid"; + + public String toString() { + return GRID_NAME + "=" + gridName + ", " + GRID_UUID + "=" + uuid.toString(); + } + + public Stream getStreamForQuery() { + return Stream.of(quote(uuid.toString(), "'")); + } + +} diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index c0fe83645..458dbcc6e 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -4,17 +4,22 @@ import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; import edu.ie3.datamodel.io.processor.ProcessorProvider; +import edu.ie3.datamodel.io.sink.SqlSink; import edu.ie3.datamodel.models.UniqueEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; import static edu.ie3.util.StringUtils.camelCaseToSnakeCase; public class SqlUtils { + protected static final Logger log = LoggerFactory.getLogger(SqlUtils.class); private static final String endQueryCreateTable = ")\n" + "\t WITHOUT OIDS\n" + "\t TABLESPACE pg_default;"; private SqlUtils() { @@ -43,31 +48,29 @@ private static String beginQueryCreateTable( return "CREATE TABLE " + schemaName + "." + tableName + "\n(\n"; } - public static String getDataTypes(Class cls) { - try { - ProcessorProvider processorProvider = new ProcessorProvider(); - DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); - String body = ""; - Stream dataTypes; - String[] headerElements = processorProvider.getHeaderElements(cls); - Stream strHeader = Stream.concat(Arrays.stream(headerElements), Stream.of("grid_name", "grid_uuid")) ; - Stream dtHeader = strHeader.map( - element -> { - return camelCaseToSnakeCase(element) + " " + classToDataType().get(camelCaseToSnakeCase(element)); - } - ); - return "CREATE TABLE public." + namingStrategy.getEntityName(cls).orElseThrow() + "\n(\n\t" + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) + "\n)\n\t" + - "WITHOUT OIDS\n" + - "\t" + "TABLESPACE pg_default;\n"; - } catch (EntityProcessorException e) { - return ""; - } catch (ProcessorProviderException e) { - return ""; - } + public static String queryForGridTable( + String schemaName, + String tableName + ) { + return beginQueryCreateTable(schemaName, tableName) + "\tuuid uuid PRIMARY KEY,\n\tname TEXT NOT NULL\n" + endQueryCreateTable; + } + + public static String getDataTypes(Class cls) throws EntityProcessorException, ProcessorProviderException { + ProcessorProvider processorProvider = new ProcessorProvider(); + DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); + String[] headerElements = processorProvider.getHeaderElements(cls); + Stream strHeader = Stream.concat(Arrays.stream(headerElements), Stream.of("grid_uuid")) ; + Stream dtHeader = strHeader.map( + element -> camelCaseToSnakeCase(element) + " " + classToDataType().get(camelCaseToSnakeCase(element)) + ); + return "CREATE TABLE public." + namingStrategy.getEntityName(cls).orElseThrow() + "\n(\n\t" + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) + "\n)\n\t" + + "WITHOUT OIDS\n" + + "\t" + "TABLESPACE pg_default;\n"; } public static Map classToDataType() { HashMap map = new HashMap(); + map.put("uuid", "uuid PRIMARY KEY"); map.put("time_series", "uuid NOT NULL"); map.put("time", "timestamp with time zone NOT NULL"); @@ -81,9 +84,7 @@ public static Map classToDataType() { map.put("id", "TEXT NOT NULL"); map.put("market_reaction", "bool NOT NULL"); map.put("node", "uuid NOT NULL"); - //map.put("operatesFrom", "timestamp with time zone"); map.put("operates_from", "timestamp with time zone"); - //map.put("operatesUntil", "timestamp with time zone"); map.put("operates_until", "timestamp with time zone"); map.put("operator", "uuid"); map.put("q_characteristics", "TEXT NOT NULL"); @@ -94,7 +95,6 @@ public static Map classToDataType() { map.put("type", "uuid NOT NULL"); //EVCS map.put("olm_characteristic", "TEXT NOT NULL"); map.put("parallel_devices", "int NOT NULL"); - //map.put("parallelDevices", "int NOT NULL"); map.put("cos_phi_rated", "TEXT NOT NULL"); map.put("dsm", "bool NOT NULL"); map.put("e_cons_annual", "double precision NOT NULL"); @@ -108,15 +108,12 @@ public static Map classToDataType() { map.put("v_mag", "bool NOT NULL"); map.put("slack", "bool NOT NULL"); map.put("subnet", "int NOT NULL"); - //map.put("vRated", "double precision NOT NULL"); map.put("v_rated", "double precision NOT NULL"); map.put("v_target", "double precision NOT NULL"); - //map.put("vTarget", "double precision NOT NULL"); map.put("volt_lvl", "TEXT NOT NULL"); map.put("charging_points", "int NOT NULL"); map.put("location_type", "TEXT NOT NULL"); map.put("v_2g_support", "bool NOT NULL"); - //map.put("voltLvl", "TEXT NOT NULL"); map.put("albedo", "double precision NOT NULL"); map.put("azimuth", "double precision NOT NULL"); @@ -179,6 +176,8 @@ public static Map classToDataType() { map.put("opex", "double precision NOT NULL"); map.put("active_power_gradient", "double precision NOT NULL"); + // not all data types are implemented + return map; } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 1801ee345..482815fa5 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -73,7 +73,7 @@ public Optional getEntityName(Class cls) { /** * Provides the name of a time series. Used to determine the table name in SQL database. - * @param timeSeries + * @param timeSeries to be named TimeSeries * @return the table name */ public , E extends TimeSeriesEntry, V extends Value> diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index a8bc24480..ddfa4d8a7 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -1,7 +1,7 @@ package edu.ie3.datamodel.io.sink; import edu.ie3.datamodel.exceptions.*; -import edu.ie3.datamodel.io.DatabaseIdentifier; +import edu.ie3.datamodel.io.DbGridMetadata; import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.extractor.Extractor; import edu.ie3.datamodel.io.extractor.NestedEntity; @@ -24,6 +24,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; + import edu.ie3.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +35,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static edu.ie3.datamodel.io.SqlUtils.quote; -import static java.util.UUID.randomUUID; +import static edu.ie3.datamodel.io.SqlUtils.*; import static java.util.stream.Collectors.groupingBy; @@ -48,8 +48,6 @@ public class SqlSink { private final ProcessorProvider processorProvider; private final String schemaName; - private static final String GRID_NAME = "grid_name"; - private static final String GRID_UUID = "grid_uuid"; private static final String TIME_SERIES = "time_series"; public SqlSink( @@ -86,7 +84,7 @@ public void shutdown() { * executed by a specific {@link EntityProcessor} * @throws SQLException */ - public void persistAll(Collection entities, DatabaseIdentifier identifier) throws SQLException { + public void persistAll(Collection entities, DbGridMetadata identifier) throws SQLException { // Extract nested entities and add them to the set of entities Set entitiesToAdd = new HashSet<>(entities); // entities to persist entities.stream().forEach( @@ -121,7 +119,7 @@ public void persistAll(Collection entities, Database * @param entities a collection of entities that should be persisted * @param identifier identifier of the grid */ - public void persistAllIgnoreNested(Collection entities, DatabaseIdentifier identifier) { + public void persistAllIgnoreNested(Collection entities, DbGridMetadata identifier) { persistMixedList(new ArrayList<>(entities), identifier); } @@ -131,7 +129,7 @@ public void persistAllIgnoreNested(Collection entitie * @param identifier identifier of the grid * @throws SQLException */ - public void persist(C entity, DatabaseIdentifier identifier) throws SQLException { + public void persist(C entity, DbGridMetadata identifier) throws SQLException { if (entity instanceof InputEntity inputEntity) { persistIncludeNested(inputEntity, identifier); } else if (entity instanceof ResultEntity resultEntity) { @@ -144,18 +142,18 @@ public void persist(C entity, DatabaseIdentifier identi } /** - * Persist an entity. In contrast to {@link SqlSink#persist} this function doe not extract nested entities. + * Persist an entity. In contrast to {@link SqlSink#persist} this function does not extract nested entities. * @param entity the entity that should be persisted * @param identifier identifier of the grid * @throws SQLException */ - public void persistIgnoreNested(C entity, DatabaseIdentifier identifier) throws SQLException { + public void persistIgnoreNested(C entity, DbGridMetadata identifier) throws SQLException { insert(entity, identifier); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - protected void persistListIncludeNested(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { + protected void persistListIncludeNested(List entities, Class cls, DbGridMetadata identifier) throws SQLException { if (NestedEntity.class.isAssignableFrom(cls)) { entities.forEach( entity -> { @@ -177,13 +175,13 @@ protected void persistListIncludeNested(List entitie } } - public void persistIncludeNested(C entity, DatabaseIdentifier identifier) throws SQLException { + public void persistIncludeNested(C entity, DbGridMetadata identifier) throws SQLException { Set entitiesToAdd = new HashSet<>(); entitiesToAdd.add(entity); persistAll(entitiesToAdd, identifier); } - private void persistMixedList(List entities, DatabaseIdentifier identifier) { + private void persistMixedList(List entities, DbGridMetadata identifier) { Map, List> entitiesPerClass = entities.stream() .collect(groupingBy(entity -> (Class) entity.getClass())); entitiesPerClass.forEach( @@ -191,10 +189,6 @@ private void persistMixedList(List entities, Databas try { persistList(ent, cls, identifier); } catch (SQLException e) { - log.error(String.format( - "An error occurred during extraction of entity'%s': ", - cls.getSimpleName()), - e); throw new RuntimeException(String.format( "An error occurred during extraction of entity '%s', SQLReason: '%s'", cls.getSimpleName(), e.getMessage()), e); @@ -203,16 +197,10 @@ private void persistMixedList(List entities, Databas ); } - private , V extends Value> void persistList(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { + private , V extends Value> void persistList(List entities, Class cls, DbGridMetadata identifier) throws SQLException { // Check if there are only elements of the same class Class firstClass = entities.get(0).getClass(); - boolean allSameClass = true; - for (Object obj : entities) { - if (obj.getClass() != firstClass) { - allSameClass = false; - break; - } - } + boolean allSameClass = entities.stream().allMatch(e -> e.getClass() == firstClass); if (allSameClass) { if (InputEntity.class.isAssignableFrom(cls)) { @@ -220,7 +208,15 @@ private , V extends Value> } else if (ResultEntity.class.isAssignableFrom(cls)) { insertListIgnoreNested(entities, cls, identifier); } else if (TimeSeries.class.isAssignableFrom(cls)) { - persistListOfTimeSeries((List>) entities, identifier); + entities.forEach(ts -> { + try { + persistTimeSeries((TimeSeries) ts, identifier); + } catch (SQLException e) { + throw new RuntimeException(String.format( + "An error occurred during extraction of entity '%s', SQLReason: '%s'", + cls.getSimpleName(), e.getMessage()), e); + } + }); } else { log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); } @@ -232,30 +228,18 @@ private , V extends Value> /** * Writes a list of entities into a sql table. It's necessary that all entities have the same class. */ - private void insertListIgnoreNested(List entities, Class cls, DatabaseIdentifier identifier) throws SQLException { + private void insertListIgnoreNested(List entities, Class cls, DbGridMetadata identifier) throws SQLException { try { String[] headerElements = processorProvider.getHeaderElements(cls); String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier); connector.executeUpdate(query); - //int expectedElements = entities.size(); - //int addedElements = connector.executeUpdate(query); - //System.out.println("Insert " + cls.getSimpleName() + ": " + " expected " + expectedElements + ", added " + addedElements); } catch (ProcessorProviderException e) { log.error("Exception occurred during processor request: ", e); } } - private , V extends Value> void persistListOfTimeSeries( - List> list, DatabaseIdentifier identifier - ) throws SQLException { - for (TimeSeries ts : list) { - persistTimeSeries(ts, identifier); - } - } - - - protected , V extends Value> void persistTimeSeries(TimeSeries timeSeries, DatabaseIdentifier identifier) throws SQLException { + protected , V extends Value> void persistTimeSeries(TimeSeries timeSeries, DbGridMetadata identifier) throws SQLException { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); String[] headerElements = processorProvider.getHeaderElements(key); @@ -269,7 +253,7 @@ protected , V extends Value> void persistTimeSeries } private , V extends Value> void persistTimeSeries( - TimeSeries timeSeries, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException, IOException, SQLException { + TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException, IOException, SQLException { try { String query = basicInsertQueryValuesITS(schemaName, databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), headerElements); Set> entityFieldData = @@ -278,20 +262,19 @@ private , V extends Value> void persistTimeSeries( data -> queryTimeSeriesValueLine(sqlEntityFieldData(data), headerElements, identifier, timeSeries.getUuid().toString())).collect(Collectors.joining(",\n", "", ";")); try { connector.executeUpdate(query); - //int expectedElements = timeSeries.getEntries().size(); - //int addedElements = connector.executeUpdate(query); - //System.out.println("Insert " + "TimeSeries" + ": " + " expected " + expectedElements + ", added " + addedElements); } catch (SQLException e) { - throw new SQLException(String.format("Error at execution of query \"%1.127s\": ", query), e); + throw new RuntimeException(String.format( + "An error occurred during extraction of the time series, SQLReason: '%s'", + e.getMessage()), e); } } catch (ProcessorProviderException e) { throw new ProcessorProviderException("Exception occurred during processor request: ", e); } } - public void persistJointGrid(JointGridContainer jointGridContainer) throws SQLException { - DatabaseIdentifier identifier = new DatabaseIdentifier( - jointGridContainer.getGridName(), randomUUID() + public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) throws SQLException { + DbGridMetadata identifier = new DbGridMetadata( + jointGridContainer.getGridName(), gridUUID ); // get raw grid entities with types or operators @@ -372,7 +355,7 @@ public void persistJointGrid(JointGridContainer jointGridContainer) throws SQLEx // persist all entities persistAll(toAdd, identifier); } - private void insert(C entity, DatabaseIdentifier identifier) throws SQLException { + private void insert(C entity, DbGridMetadata identifier) throws SQLException { try { String[] headerElements = processorProvider.getHeaderElements(entity.getClass()); String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(entity.getClass()).orElseThrow(), headerElements) + queryValueLine(entity, headerElements, identifier) + ";"; @@ -385,11 +368,10 @@ private void insert(C entity, DatabaseIdentifier identi // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** - * Provides the value lists for an insertion query. Conflicts because of the primary key uuid will be ignored. - * + * Provides the value lists for an insertion query. Conflicts because of the primary key 'uuid' will be ignored. Conflicts can occur if an entity (e.g. node) already exist. * WARNING: It's assumed that all entities are from the same class C. */ - private String createInsertQueryBodyIgnoreConflict(List entities, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException { + private String createInsertQueryBodyIgnoreConflict(List entities, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { Set> entityFieldData = processorProvider .handleEntities(entities); @@ -406,7 +388,7 @@ private String createInsertQueryBodyIgnoreConflict(List * * WARNING: It's assumed that all entities are from the same class C. */ - private String createInsertQueryBody(List entities, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException { + private String createInsertQueryBody(List entities, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { Set> entityFieldData = processorProvider .handleEntities(entities); @@ -419,27 +401,21 @@ private String createInsertQueryBody(List entities, /** * Creates a line with the values of one entity for an insertion query using the entityFieldData. */ - private String queryValueLine(LinkedHashMap entityFieldData, String[] headerElements, DatabaseIdentifier identifier) { + private String queryValueLine(LinkedHashMap entityFieldData, String[] headerElements, DbGridMetadata identifier) { return writeOneLine(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery())); } /** * Creates a line with the values of one entity for an insertion query. */ - private String queryValueLine(C entity, String[] headerElements, DatabaseIdentifier identifier) throws ProcessorProviderException { - LinkedHashMap entityFieldData = - processorProvider - .handleEntity(entity) - .map(this::sqlEntityFieldData) - .getOrThrow(); - return writeOneLine(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery())); + private String queryValueLine(C entity, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { + return queryValueLine(processorProvider.handleEntity(entity).map(this::sqlEntityFieldData).getOrThrow(), headerElements, identifier); } - private String queryTimeSeriesValueLine(Map entityFieldData, String[] headerElements, DatabaseIdentifier identifier, String TSuuid) { + private String queryTimeSeriesValueLine(Map entityFieldData, String[] headerElements, DbGridMetadata identifier, String TSuuid) { return writeOneLine(Stream.concat(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), Stream.of(quote(TSuuid,"'")))); } - private LinkedHashMap sqlEntityFieldData( LinkedHashMap entityFieldData ) { @@ -451,7 +427,6 @@ private LinkedHashMap sqlEntityFieldData( return quotedEntityFieldData; } - /** * "INSERT INTO" line with schemaName.tableName */ @@ -463,7 +438,7 @@ private static String basicInsertQuery(String schemaName, String tableName) { * Provides the insert, column names, grid identifier and the VALUES statement for a query. */ private String basicInsertQueryValuesGrid(String schemaName, String tableName, String[] headerElements) { - String[] addParams = {GRID_NAME, GRID_UUID}; + String[] addParams = {DbGridMetadata.GRID_UUID}; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + "\nVALUES\n"; } @@ -471,7 +446,9 @@ private String basicInsertQueryValuesGrid(String schemaName, String tableName, S * Provides the insert, column names, grid identifier, time_series uuid and the VALUES statement for a query. */ private String basicInsertQueryValuesITS(String schemaName, String tableName, String[] headerElements) { - String[] addParams = {GRID_NAME, GRID_UUID, TIME_SERIES}; + String[] addParams = { + DbGridMetadata.GRID_UUID, + TIME_SERIES}; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + "\nVALUES\n"; } @@ -489,6 +466,21 @@ private String writeOneLine(String[] entries, String[] addParams) { return writeOneLine(Stream.concat(Arrays.stream(entries), Arrays.stream(addParams))); } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + public void createClassTable( + Class cls + ) throws SQLException, ProcessorProviderException, EntityProcessorException { + String query = getDataTypes(cls); + connector.executeUpdate(query); + } + + public void createGridTable( + String schemaName, String tableName + ) throws SQLException { + String query = queryForGridTable(schemaName, tableName); + connector.executeUpdate(query); + } /** * @return insertion order for unique entities @@ -506,16 +498,4 @@ private static List> hierarchicInsert() { //8. Rest return sortedInsert; } - - private String entitiesToString(Collection entities) { - String res = "[\n"; - int no = 0; - Iterator iterator = entities.iterator(); - while (iterator.hasNext()) { - res = res + "\t (" + no + ") " + iterator.next().toString() + "\n"; - no++; - } - res = res + "]"; - return res; - } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 7b4878461..cba22bd12 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -1,21 +1,14 @@ package edu.ie3.datamodel.io.sink -import edu.ie3.datamodel.io.DatabaseIdentifier -import edu.ie3.datamodel.io.SqlUtils +import edu.ie3.datamodel.io.DbGridMetadata import edu.ie3.datamodel.io.connectors.SqlConnector -import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy -import edu.ie3.datamodel.io.naming.FileNamingStrategy -import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme -import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation import edu.ie3.datamodel.io.processor.ProcessorProvider import edu.ie3.datamodel.io.processor.input.InputEntityProcessor import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey -import edu.ie3.datamodel.io.source.csv.CsvTimeSeriesSource import edu.ie3.datamodel.io.source.sql.SqlDataSource -import edu.ie3.datamodel.io.source.sql.SqlTimeSeriesSource import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.NodeInput @@ -30,10 +23,7 @@ import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.datamodel.models.input.system.WecInput import edu.ie3.datamodel.models.input.system.characteristic.CosPhiFixed -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalBusInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput @@ -47,7 +37,6 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.Value import edu.ie3.test.common.GridTestData @@ -56,8 +45,6 @@ import edu.ie3.test.common.ThermalUnitInputTestData import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.test.helper.TestContainerHelper import edu.ie3.util.TimeUtil -import edu.ie3.util.io.FileIOUtils -import org.jetbrains.annotations.NotNull import org.testcontainers.containers.Container import org.testcontainers.containers.PostgreSQLContainer import org.testcontainers.utility.MountableFile @@ -68,17 +55,11 @@ import tech.units.indriya.quantity.Quantities import javax.measure.Quantity import javax.measure.quantity.Power -import java.nio.file.Path import edu.ie3.test.common.SystemParticipantTestData import java.sql.SQLException -import java.time.ZoneId -import java.time.ZonedDateTime -import java.time.format.DateTimeFormatter -import static edu.ie3.datamodel.models.StandardUnits.ENERGY_PRICE -import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE import static tech.units.indriya.unit.Units.PERCENT @@ -99,7 +80,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri DatabaseNamingStrategy namingStrategy @Shared - DatabaseIdentifier identifier + DbGridMetadata identifier static String schemaName = "public" @@ -113,7 +94,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri namingStrategy = new DatabaseNamingStrategy() - identifier = new DatabaseIdentifier("vn_simona", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120002")) + identifier = new DbGridMetadata("vn_simona", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120002")) sqlSource = new SqlDataSource(connector, schemaName, namingStrategy) } @@ -121,6 +102,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri def setup() { // Execute import script Iterable importFiles = Arrays.asList( + "grids.sql", "types.sql", "result_entities.sql", "input_entities.sql", @@ -336,13 +318,41 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri sink.shutdown() } + def "A valid SqlSink can create a table for class."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + def wec = SystemParticipantTestData.wecInput + + when: + sink.createClassTable(wec.getClass()) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_input", ps -> {}).count() == 0 + } + + def "A valid SqlSink throws an exception if a grid does not exist."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + def failIdentifier = new DbGridMetadata("fail_grid", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120003")) + + sink.persist(individualEnergyPriceTimeSeries, failIdentifier) + + then: + def exception = thrown(RuntimeException) + exception.message.contains("Detail: Key (grid_uuid)=(8e6bd444-4580-11ee-be56-0242ac120003) is not present in table \"grids\".") + + cleanup: + sink.shutdown() + } def "A valid SqlSink should persist a valid joint grid container correctly"() { given: def sink = new SqlSink(schemaName, namingStrategy, connector) when: - sink.persistJointGrid(SampleJointGrid.grid()) + sink.persistJointGrid(SampleJointGrid.grid(), UUID.fromString("297dfac8-83cc-11ee-b962-0242ac120002")) then: sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 6 @@ -360,43 +370,4 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri sink.shutdown() } - /* - def "Ausgabe"() { - given: - System.out.println(SqlUtils.getDataTypes(StorageTypeInput.class)) - //System.out.println(SqlUtils.getDataTypes(StorageInput.class)) - //System.out.println(SqlUtils.getDataTypes(NodeInput.class)) - - System.out.println(SqlUtils.getDataTypes(PvResult.class)) - System.out.println(SqlUtils.getDataTypes(WecResult.class)) - System.out.println(SqlUtils.getDataTypes(EvResult.class)) - System.out.println(SqlUtils.getDataTypes(EvcsResult.class)) - System.out.println(SqlUtils.getDataTypes(EmResult.class)) - System.out.println(SqlUtils.getDataTypes(FlexOptionsResult.class)) - - - System.out.println(SqlUtils.getDataTypes(Transformer2WInput.class)) - System.out.println(SqlUtils.getDataTypes(NodeInput.class)) - System.out.println(SqlUtils.getDataTypes(EvcsInput.class)) - System.out.println(SqlUtils.getDataTypes(LineGraphicInput.class)) - System.out.println(SqlUtils.getDataTypes(NodeGraphicInput.class)) - System.out.println(SqlUtils.getDataTypes(CylindricalStorageInput.class)) - System.out.println(SqlUtils.getDataTypes(ThermalHouseInput.class)) - System.out.println(SqlUtils.getDataTypes(OperatorInput.class)) - System.out.println(SqlUtils.getDataTypes(LineInput.class)) - System.out.println(SqlUtils.getDataTypes(ThermalBusInput.class)) - System.out.println(SqlUtils.getDataTypes(LineTypeInput.class)) - System.out.println(SqlUtils.getDataTypes(LoadInput.class)) - System.out.println(SqlUtils.getDataTypes(EmInput.class)) - - System.out.println(SqlUtils.getDataTypes(Transformer2WTypeInput.class)) - - - when: - def nummer = 1 - - then: - nummer == 1 - } - */ } diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql new file mode 100644 index 000000000..466aad358 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql @@ -0,0 +1,13 @@ +CREATE TABLE public.grids +( + uuid uuid PRIMARY KEY, + name TEXT NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +INSERT INTO + public.grids (uuid, name) +VALUES + ('8e6bd444-4580-11ee-be56-0242ac120002', 'vn_simona'), + ('297dfac8-83cc-11ee-b962-0242ac120002', 'sampleGrid'); \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index fa6d569aa..1c3bddf01 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -11,8 +11,7 @@ CREATE TABLE public.node_input v_rated double precision NOT NULL, v_target double precision NOT NULL, volt_lvl TEXT NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -30,8 +29,7 @@ CREATE TABLE public.transformer_2_w_input parallel_devices int NOT NULL, tap_pos int NOT NULL, type uuid NOT NULL REFERENCES transformer_2_w_type_input(uuid), - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -50,8 +48,7 @@ CREATE TABLE public.evcs_input q_characteristics TEXT NOT NULL, type TEXT NOT NULL, v_2g_support bool NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -62,8 +59,7 @@ CREATE TABLE public.line_graphic_input graphic_layer TEXT NOT NULL, line uuid NOT NULL, path TEXT, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -75,8 +71,7 @@ CREATE TABLE public.node_graphic_input node uuid NOT NULL, path TEXT, point TEXT NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -94,8 +89,7 @@ CREATE TABLE public.cylindrical_storage_input storage_volume_lvl double precision NOT NULL, storage_volume_lvl_min double precision NOT NULL, thermal_bus uuid NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -113,8 +107,7 @@ CREATE TABLE public.thermal_house_input target_temperature double precision NOT NULL, thermal_bus uuid NOT NULL, upper_temperature_limit double precision NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -123,8 +116,7 @@ CREATE TABLE public.operator_input ( uuid uuid PRIMARY KEY, id TEXT NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -143,8 +135,7 @@ CREATE TABLE public.line_input operator uuid, parallel_devices int NOT NULL, type uuid NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -156,8 +147,7 @@ CREATE TABLE public.thermal_bus_input operates_from timestamp with time zone, operates_until timestamp with time zone, operator uuid, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -176,8 +166,7 @@ CREATE TABLE public.load_input operator uuid, q_characteristics TEXT NOT NULL, s_rated double precision NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -193,8 +182,7 @@ CREATE TABLE public.em_input operates_until timestamp with time zone, operator uuid, q_characteristics TEXT NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -217,8 +205,7 @@ CREATE TABLE public.pv_input operator uuid, q_characteristics TEXT NOT NULL, s_rated double precision NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -233,8 +220,7 @@ CREATE TABLE public.storage_input operator uuid, q_characteristics TEXT NOT NULL, type uuid NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql index 13ff7f12c..5f3268340 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql @@ -5,8 +5,7 @@ CREATE TABLE public.load_profile_g2 day_of_week TEXT NOT NULL, quarter_hour_of_day TEXT NOT NULL, p double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql index f6ad68d49..924d8efb1 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql @@ -5,7 +5,6 @@ CREATE TABLE public.pv_res p double precision NOT NULL, q double precision NOT NULL, time timestamp with time zone NOT NULL, - grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS @@ -18,7 +17,6 @@ CREATE TABLE public.wec_res p double precision NOT NULL, q double precision NOT NULL, time timestamp with time zone NOT NULL, - grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS @@ -32,7 +30,6 @@ CREATE TABLE public.ev_res q double precision NOT NULL, soc double precision NOT NULL, time timestamp with time zone NOT NULL, - grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS @@ -45,7 +42,6 @@ CREATE TABLE public.evcs_res p double precision NOT NULL, q double precision NOT NULL, time timestamp with time zone NOT NULL, - grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS @@ -58,7 +54,6 @@ CREATE TABLE public.em_res p double precision NOT NULL, q double precision NOT NULL, time timestamp with time zone NOT NULL, - grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS @@ -72,7 +67,6 @@ CREATE TABLE public.flex_options_res p_min double precision NOT NULL, p_ref double precision NOT NULL, time timestamp with time zone NOT NULL, - grid_name TEXT NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql index 640be69d0..d77ad1895 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql @@ -4,8 +4,7 @@ CREATE TABLE public.time_series_c time_series uuid NOT NULL, time timestamp with time zone NOT NULL, price double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -23,8 +22,7 @@ CREATE TABLE public.time_series_p time_series uuid NOT NULL, time timestamp with time zone NOT NULL, p double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -40,8 +38,7 @@ CREATE TABLE public.time_series_pq time timestamp with time zone NOT NULL, p double precision, q double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -56,8 +53,7 @@ CREATE TABLE public.time_series_h time_series uuid NOT NULL, time timestamp with time zone NOT NULL, heat_demand double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -73,8 +69,7 @@ CREATE TABLE public.time_series_ph time timestamp with time zone NOT NULL, p double precision, heat_demand double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -91,8 +86,7 @@ CREATE TABLE public.time_series_pqh p double precision, q double precision, heat_demand double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -112,8 +106,7 @@ CREATE TABLE public.time_series_weather direction double precision, temperature double precision, velocity double precision, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql index 3d8bd328d..3c4579882 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql @@ -15,8 +15,7 @@ CREATE TABLE public.transformer_2_w_type_input v_rated_a double precision NOT NULL, v_rated_b double precision NOT NULL, x_sc double precision NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -31,8 +30,8 @@ CREATE TABLE public.line_type_input r double precision NOT NULL, v_rated double precision NOT NULL, x double precision NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -52,8 +51,8 @@ CREATE TABLE public.storage_type_input opex double precision NOT NULL, p_max double precision NOT NULL, s_rated double precision NOT NULL, - grid_name TEXT NOT NULL, - grid_uuid uuid NOT NULL + + grid_uuid uuid NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; From 0f46762f3b0702c5b8ba0e03d5a303b69e19582c Mon Sep 17 00:00:00 2001 From: smjobaoo Date: Tue, 21 Nov 2023 16:54:43 +0100 Subject: [PATCH 005/310] spotless --- .../edu/ie3/datamodel/io/DbGridMetadata.java | 30 +- .../java/edu/ie3/datamodel/io/IoUtil.java | 1 - .../java/edu/ie3/datamodel/io/SqlUtils.java | 351 +++---- .../datamodel/io/connectors/SqlConnector.java | 2 +- .../io/naming/DatabaseNamingStrategy.java | 14 +- .../io/processor/ProcessorProvider.java | 3 +- .../edu/ie3/datamodel/io/sink/SqlSink.java | 977 ++++++++++-------- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 586 +++++------ .../ie3/test/common/TimeSeriesTestData.groovy | 4 +- 9 files changed, 1023 insertions(+), 945 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java index ae1e2b6cb..c9bf2fc2f 100644 --- a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java +++ b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java @@ -1,24 +1,26 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ package edu.ie3.datamodel.io; +import static edu.ie3.datamodel.io.IoUtil.quote; + import java.util.UUID; import java.util.stream.Stream; -import static edu.ie3.datamodel.io.IoUtil.quote; - -/** - * Class for identification of entities and results from grids in SQL databases. - */ +/** Class for identification of entities and results from grids in SQL databases. */ public record DbGridMetadata(String gridName, UUID uuid) { - public static final String GRID_NAME = "grid_name"; - public static final String GRID_UUID = "grid_uuid"; - - public String toString() { - return GRID_NAME + "=" + gridName + ", " + GRID_UUID + "=" + uuid.toString(); - } + public static final String GRID_NAME = "grid_name"; + public static final String GRID_UUID = "grid_uuid"; - public Stream getStreamForQuery() { - return Stream.of(quote(uuid.toString(), "'")); - } + public String toString() { + return GRID_NAME + "=" + gridName + ", " + GRID_UUID + "=" + uuid.toString(); + } + public Stream getStreamForQuery() { + return Stream.of(quote(uuid.toString(), "'")); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/IoUtil.java b/src/main/java/edu/ie3/datamodel/io/IoUtil.java index 590ea1b49..9f9f12a74 100644 --- a/src/main/java/edu/ie3/datamodel/io/IoUtil.java +++ b/src/main/java/edu/ie3/datamodel/io/IoUtil.java @@ -63,5 +63,4 @@ public static String quote(String input, String quoteSymbol) { return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; } } - } diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index 458dbcc6e..358d3c83c 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -1,191 +1,192 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ package edu.ie3.datamodel.io; +import static edu.ie3.util.StringUtils.camelCaseToSnakeCase; + import edu.ie3.datamodel.exceptions.EntityProcessorException; import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; import edu.ie3.datamodel.io.processor.ProcessorProvider; -import edu.ie3.datamodel.io.sink.SqlSink; import edu.ie3.datamodel.models.UniqueEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; - -import static edu.ie3.util.StringUtils.camelCaseToSnakeCase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SqlUtils { - protected static final Logger log = LoggerFactory.getLogger(SqlUtils.class); - private static final String endQueryCreateTable = ")\n" + "\t WITHOUT OIDS\n" + "\t TABLESPACE pg_default;"; - - private SqlUtils() { - throw new IllegalStateException("Utility classes cannot be instantiated"); - } - - - public static String queryForCreation( - String schemaName, - String tableName, - Stream> columnsWithDataTypes - ) { - return beginQueryCreateTable(schemaName, tableName) + - " " - + endQueryCreateTable; - } - - public static String getEndQueryCreateTable() { - return endQueryCreateTable; - } - - private static String beginQueryCreateTable( - String schemaName, - String tableName - ) { - return "CREATE TABLE " + schemaName + "." + tableName + "\n(\n"; - } - - public static String queryForGridTable( - String schemaName, - String tableName - ) { - return beginQueryCreateTable(schemaName, tableName) + "\tuuid uuid PRIMARY KEY,\n\tname TEXT NOT NULL\n" + endQueryCreateTable; - } - - public static String getDataTypes(Class cls) throws EntityProcessorException, ProcessorProviderException { - ProcessorProvider processorProvider = new ProcessorProvider(); - DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); - String[] headerElements = processorProvider.getHeaderElements(cls); - Stream strHeader = Stream.concat(Arrays.stream(headerElements), Stream.of("grid_uuid")) ; - Stream dtHeader = strHeader.map( - element -> camelCaseToSnakeCase(element) + " " + classToDataType().get(camelCaseToSnakeCase(element)) - ); - return "CREATE TABLE public." + namingStrategy.getEntityName(cls).orElseThrow() + "\n(\n\t" + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) + "\n)\n\t" + - "WITHOUT OIDS\n" + - "\t" + "TABLESPACE pg_default;\n"; - } - - public static Map classToDataType() { - HashMap map = new HashMap(); - - map.put("uuid", "uuid PRIMARY KEY"); - map.put("time_series", "uuid NOT NULL"); - map.put("time", "timestamp with time zone NOT NULL"); - map.put("p", "double precision NOT NULL"); - map.put("q", "double precision NOT NULL"); - map.put("c", "double precision NOT NULL"); - map.put("s_rated", "double precision NOT NULL"); - - map.put("cost_controlled", "bool NOT NULL"); - map.put("feed_in_tariff", "int NOT NULL"); - map.put("id", "TEXT NOT NULL"); - map.put("market_reaction", "bool NOT NULL"); - map.put("node", "uuid NOT NULL"); - map.put("operates_from", "timestamp with time zone"); - map.put("operates_until", "timestamp with time zone"); - map.put("operator", "uuid"); - map.put("q_characteristics", "TEXT NOT NULL"); - map.put("geo_position", "TEXT NOT NULL"); - map.put("length", "double precision NOT NULL"); - map.put("node_a", "uuid NOT NULL"); - map.put("node_b", "uuid NOT NULL"); - map.put("type", "uuid NOT NULL"); //EVCS - map.put("olm_characteristic", "TEXT NOT NULL"); - map.put("parallel_devices", "int NOT NULL"); - map.put("cos_phi_rated", "TEXT NOT NULL"); - map.put("dsm", "bool NOT NULL"); - map.put("e_cons_annual", "double precision NOT NULL"); - map.put("load_profile", "TEXT NOT NULL"); - - map.put("auto_tap", "bool NOT NULL"); - map.put("tap_pos", "int NOT NULL"); - map.put("type", "uuid NOT NULL"); - - map.put("v_ang", "bool NOT NULL"); - map.put("v_mag", "bool NOT NULL"); - map.put("slack", "bool NOT NULL"); - map.put("subnet", "int NOT NULL"); - map.put("v_rated", "double precision NOT NULL"); - map.put("v_target", "double precision NOT NULL"); - map.put("volt_lvl", "TEXT NOT NULL"); - map.put("charging_points", "int NOT NULL"); - map.put("location_type", "TEXT NOT NULL"); - map.put("v_2g_support", "bool NOT NULL"); - - map.put("albedo", "double precision NOT NULL"); - map.put("azimuth", "double precision NOT NULL"); - map.put("elevation_angle", "double precision NOT NULL"); - map.put("eta_conv", "double precision NOT NULL"); - map.put("k_g", "double precision NOT NULL"); - map.put("k_t", "double precision NOT NULL"); - - map.put("grid_name", "TEXT NOT NULL"); - map.put("grid_uuid", "uuid NOT NULL"); - - - map.put("b_m", "double precision NOT NULL"); - map.put("d_phi", "double precision NOT NULL"); - map.put("d_v", "double precision NOT NULL"); - map.put("g_m", "double precision NOT NULL"); - map.put("r_sc", "double precision NOT NULL"); - map.put("tap_max", "int NOT NULL"); - map.put("tap_min", "int NOT NULL"); - map.put("tap_neutr", "int NOT NULL"); - map.put("tap_side", "bool NOT NULL"); - map.put("v_rated_a", "int NOT NULL"); - map.put("v_rated_b", "int NOT NULL"); - map.put("x_sc", "int NOT NULL"); - map.put("graphic_layer", "TEXT NOT NULL"); - map.put("line", "uuid NOT NULL"); - map.put("path", "TEXT NOT NULL"); - map.put("point", "TEXT NOT NULL"); - map.put("inlet_temp", "double precision NOT NULL"); - map.put("return_temp", "double precision NOT NULL"); - map.put("storage_volume_lvl", "double precision NOT NULL"); - map.put("storage_volume_lvl_min", "double precision NOT NULL"); - map.put("thermal_bus", "uuid NOT NULL"); - map.put("eth_capa", "double precision NOT NULL"); - map.put("eth_losses", "double precision NOT NULL"); - map.put("lower_temperature_limit", "double precision NOT NULL"); - map.put("target_temperature", "double precision NOT NULL"); - map.put("upper_temperature_limit", "double precision NOT NULL"); - map.put("b", "double precision NOT NULL"); - map.put("g", "double precision NOT NULL"); - map.put("i_max", "double precision NOT NULL"); - map.put("r", "double precision NOT NULL"); - map.put("x", "double precision NOT NULL"); - - map.put("connected_assets", "TEXT NOT NULL"); - map.put("capex", "double precision NOT NULL"); - map.put("control_strategy", "TEXT NOT NULL"); - - map.put("input_model", "uuid NOT NULL"); - map.put("soc", "double precision NOT NULL"); - map.put("p_max", "double precision NOT NULL"); - map.put("p_min", "double precision NOT NULL"); - map.put("p_ref", "double precision NOT NULL"); - - map.put("dod", "double precision NOT NULL"); - map.put("e_storage", "double precision NOT NULL"); - map.put("eta", "double precision NOT NULL"); - map.put("life_cycle", "double precision NOT NULL"); - map.put("life_time", "double precision NOT NULL"); - map.put("opex", "double precision NOT NULL"); - map.put("active_power_gradient", "double precision NOT NULL"); - - // not all data types are implemented - - return map; - } - - public static String quote(String input, String quoteSymbol) { - if (input == "") { - return "NULL"; - } else { - return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; - } + protected static final Logger log = LoggerFactory.getLogger(SqlUtils.class); + private static final String endQueryCreateTable = + ")\n" + "\t WITHOUT OIDS\n" + "\t TABLESPACE pg_default;"; + + private SqlUtils() { + throw new IllegalStateException("Utility classes cannot be instantiated"); + } + + public static String queryForCreation( + String schemaName, String tableName, Stream> columnsWithDataTypes) { + return beginQueryCreateTable(schemaName, tableName) + " " + endQueryCreateTable; + } + + public static String getEndQueryCreateTable() { + return endQueryCreateTable; + } + + private static String beginQueryCreateTable(String schemaName, String tableName) { + return "CREATE TABLE " + schemaName + "." + tableName + "\n(\n"; + } + + public static String queryForGridTable(String schemaName, String tableName) { + return beginQueryCreateTable(schemaName, tableName) + + "\tuuid uuid PRIMARY KEY,\n\tname TEXT NOT NULL\n" + + endQueryCreateTable; + } + + public static String getDataTypes(Class cls) + throws EntityProcessorException, ProcessorProviderException { + ProcessorProvider processorProvider = new ProcessorProvider(); + DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); + String[] headerElements = processorProvider.getHeaderElements(cls); + Stream strHeader = Stream.concat(Arrays.stream(headerElements), Stream.of("grid_uuid")); + Stream dtHeader = + strHeader.map( + element -> + camelCaseToSnakeCase(element) + + " " + + classToDataType().get(camelCaseToSnakeCase(element))); + return "CREATE TABLE public." + + namingStrategy.getEntityName(cls).orElseThrow() + + "\n(\n\t" + + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) + + "\n)\n\t" + + "WITHOUT OIDS\n" + + "\t" + + "TABLESPACE pg_default;\n"; + } + + public static Map classToDataType() { + HashMap map = new HashMap(); + + map.put("uuid", "uuid PRIMARY KEY"); + map.put("time_series", "uuid NOT NULL"); + map.put("time", "timestamp with time zone NOT NULL"); + map.put("p", "double precision NOT NULL"); + map.put("q", "double precision NOT NULL"); + map.put("c", "double precision NOT NULL"); + map.put("s_rated", "double precision NOT NULL"); + + map.put("cost_controlled", "bool NOT NULL"); + map.put("feed_in_tariff", "int NOT NULL"); + map.put("id", "TEXT NOT NULL"); + map.put("market_reaction", "bool NOT NULL"); + map.put("node", "uuid NOT NULL"); + map.put("operates_from", "timestamp with time zone"); + map.put("operates_until", "timestamp with time zone"); + map.put("operator", "uuid"); + map.put("q_characteristics", "TEXT NOT NULL"); + map.put("geo_position", "TEXT NOT NULL"); + map.put("length", "double precision NOT NULL"); + map.put("node_a", "uuid NOT NULL"); + map.put("node_b", "uuid NOT NULL"); + map.put("type", "uuid NOT NULL"); // EVCS + map.put("olm_characteristic", "TEXT NOT NULL"); + map.put("parallel_devices", "int NOT NULL"); + map.put("cos_phi_rated", "TEXT NOT NULL"); + map.put("dsm", "bool NOT NULL"); + map.put("e_cons_annual", "double precision NOT NULL"); + map.put("load_profile", "TEXT NOT NULL"); + + map.put("auto_tap", "bool NOT NULL"); + map.put("tap_pos", "int NOT NULL"); + map.put("type", "uuid NOT NULL"); + + map.put("v_ang", "bool NOT NULL"); + map.put("v_mag", "bool NOT NULL"); + map.put("slack", "bool NOT NULL"); + map.put("subnet", "int NOT NULL"); + map.put("v_rated", "double precision NOT NULL"); + map.put("v_target", "double precision NOT NULL"); + map.put("volt_lvl", "TEXT NOT NULL"); + map.put("charging_points", "int NOT NULL"); + map.put("location_type", "TEXT NOT NULL"); + map.put("v_2g_support", "bool NOT NULL"); + + map.put("albedo", "double precision NOT NULL"); + map.put("azimuth", "double precision NOT NULL"); + map.put("elevation_angle", "double precision NOT NULL"); + map.put("eta_conv", "double precision NOT NULL"); + map.put("k_g", "double precision NOT NULL"); + map.put("k_t", "double precision NOT NULL"); + + map.put("grid_name", "TEXT NOT NULL"); + map.put("grid_uuid", "uuid NOT NULL"); + + map.put("b_m", "double precision NOT NULL"); + map.put("d_phi", "double precision NOT NULL"); + map.put("d_v", "double precision NOT NULL"); + map.put("g_m", "double precision NOT NULL"); + map.put("r_sc", "double precision NOT NULL"); + map.put("tap_max", "int NOT NULL"); + map.put("tap_min", "int NOT NULL"); + map.put("tap_neutr", "int NOT NULL"); + map.put("tap_side", "bool NOT NULL"); + map.put("v_rated_a", "int NOT NULL"); + map.put("v_rated_b", "int NOT NULL"); + map.put("x_sc", "int NOT NULL"); + map.put("graphic_layer", "TEXT NOT NULL"); + map.put("line", "uuid NOT NULL"); + map.put("path", "TEXT NOT NULL"); + map.put("point", "TEXT NOT NULL"); + map.put("inlet_temp", "double precision NOT NULL"); + map.put("return_temp", "double precision NOT NULL"); + map.put("storage_volume_lvl", "double precision NOT NULL"); + map.put("storage_volume_lvl_min", "double precision NOT NULL"); + map.put("thermal_bus", "uuid NOT NULL"); + map.put("eth_capa", "double precision NOT NULL"); + map.put("eth_losses", "double precision NOT NULL"); + map.put("lower_temperature_limit", "double precision NOT NULL"); + map.put("target_temperature", "double precision NOT NULL"); + map.put("upper_temperature_limit", "double precision NOT NULL"); + map.put("b", "double precision NOT NULL"); + map.put("g", "double precision NOT NULL"); + map.put("i_max", "double precision NOT NULL"); + map.put("r", "double precision NOT NULL"); + map.put("x", "double precision NOT NULL"); + + map.put("connected_assets", "TEXT NOT NULL"); + map.put("capex", "double precision NOT NULL"); + map.put("control_strategy", "TEXT NOT NULL"); + + map.put("input_model", "uuid NOT NULL"); + map.put("soc", "double precision NOT NULL"); + map.put("p_max", "double precision NOT NULL"); + map.put("p_min", "double precision NOT NULL"); + map.put("p_ref", "double precision NOT NULL"); + + map.put("dod", "double precision NOT NULL"); + map.put("e_storage", "double precision NOT NULL"); + map.put("eta", "double precision NOT NULL"); + map.put("life_cycle", "double precision NOT NULL"); + map.put("life_time", "double precision NOT NULL"); + map.put("opex", "double precision NOT NULL"); + map.put("active_power_gradient", "double precision NOT NULL"); + + // not all data types are implemented + + return map; + } + + public static String quote(String input, String quoteSymbol) { + if (input == "") { + return "NULL"; + } else { + return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; } + } } diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index b3b5d704f..91cf38dd9 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -65,7 +65,7 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException * @return The number of updates or a negative number if the execution failed */ public int executeUpdate(String updateQuery) throws SQLException { - return getConnection().createStatement().executeUpdate(updateQuery); + return getConnection().createStatement().executeUpdate(updateQuery); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 482815fa5..7fadfc45a 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.io.naming; +import static edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy.logger; + import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; @@ -12,11 +14,8 @@ import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import edu.ie3.datamodel.models.value.Value; - import java.util.Optional; -import static edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy.logger; - /** A naming strategy for database entities */ public class DatabaseNamingStrategy { @@ -55,6 +54,7 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { /** * Provides the name of a load profile given by the load profile key + * * @param lpKey Load profile key * @return the table name */ @@ -64,6 +64,7 @@ private String getLoadProfileEntityName(String lpKey) { /** * Provides the name of a unique entity class. + * * @param cls Class extends UniqueEntity * @return the table name */ @@ -73,11 +74,12 @@ public Optional getEntityName(Class cls) { /** * Provides the name of a time series. Used to determine the table name in SQL database. + * * @param timeSeries to be named TimeSeries * @return the table name */ public , E extends TimeSeriesEntry, V extends Value> - Optional getEntityName(T timeSeries) { + Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) { Optional maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst(); if (maybeFirstElement.isPresent()) { @@ -88,9 +90,7 @@ Optional getEntityName(T timeSeries) { return Optional.empty(); } } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { - return Optional.of( - getLoadProfileEntityName(loadProfileInput.getType().getKey()) - ); + return Optional.of(getLoadProfileEntityName(loadProfileInput.getType().getKey())); } else { logger.error("There is no naming strategy defined for {}", timeSeries); return Optional.empty(); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index b3257ed98..567a70189 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -79,7 +79,8 @@ Try, ProcessorProviderException> handleEntity(T en .transformF(ProcessorProviderException::new)); } - public Set> handleEntities(List entities) throws ProcessorProviderException { + public Set> handleEntities( + List entities) throws ProcessorProviderException { Set setOfEntities = new HashSet<>(entities); Set> setOfMaps = new HashSet<>(); for (T entity : setOfEntities) { diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index ddfa4d8a7..59d95b8ce 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -1,5 +1,13 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ package edu.ie3.datamodel.io.sink; +import static edu.ie3.datamodel.io.SqlUtils.*; +import static java.util.stream.Collectors.groupingBy; + import edu.ie3.datamodel.exceptions.*; import edu.ie3.datamodel.io.DbGridMetadata; import edu.ie3.datamodel.io.connectors.SqlConnector; @@ -24,478 +32,541 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; - import edu.ie3.util.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.sql.SQLException; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; - -import static edu.ie3.datamodel.io.SqlUtils.*; -import static java.util.stream.Collectors.groupingBy; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SqlSink { - protected static final Logger log = LoggerFactory.getLogger(SqlSink.class); - - private final SqlConnector connector; - private final DatabaseNamingStrategy databaseNamingStrategy; - private final ProcessorProvider processorProvider; - private final String schemaName; - - private static final String TIME_SERIES = "time_series"; - - public SqlSink( - String schemaName, - DatabaseNamingStrategy databaseNamingStrategy, - SqlConnector connector - ) throws EntityProcessorException { - this(schemaName, new ProcessorProvider(), databaseNamingStrategy, connector); - } - - public SqlSink( - String schemaName, - ProcessorProvider processorProvider, - DatabaseNamingStrategy databaseNamingStrategy, - SqlConnector connector - ) { - this.connector = connector; - this.databaseNamingStrategy = databaseNamingStrategy; - this.processorProvider = processorProvider; - this.schemaName = schemaName; - } - - public void shutdown() { - connector.shutdown(); - } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - /** - * Entry point of a data sink to persist multiple entities in a collection. - * @param entities a collection of entities that should be persisted - * @param identifier identifier of the grid - * @param bounded to be all unique entities. Handling of specific entities is normally then - * executed by a specific {@link EntityProcessor} - * @throws SQLException - */ - public void persistAll(Collection entities, DbGridMetadata identifier) throws SQLException { - // Extract nested entities and add them to the set of entities - Set entitiesToAdd = new HashSet<>(entities); // entities to persist - entities.stream().forEach( - entity -> { - if (entity instanceof NestedEntity nestedEntity) { - try { - entitiesToAdd.addAll((List) Extractor.extractElements(nestedEntity).stream().toList()); - } catch (ExtractorException e) { - log.error( - String.format( - "An error occurred during extraction of nested entity'%s': ", - entity.getClass()), - e); - } - } + protected static final Logger log = LoggerFactory.getLogger(SqlSink.class); + + private final SqlConnector connector; + private final DatabaseNamingStrategy databaseNamingStrategy; + private final ProcessorProvider processorProvider; + private final String schemaName; + + private static final String TIME_SERIES = "time_series"; + + public SqlSink( + String schemaName, DatabaseNamingStrategy databaseNamingStrategy, SqlConnector connector) + throws EntityProcessorException { + this(schemaName, new ProcessorProvider(), databaseNamingStrategy, connector); + } + + public SqlSink( + String schemaName, + ProcessorProvider processorProvider, + DatabaseNamingStrategy databaseNamingStrategy, + SqlConnector connector) { + this.connector = connector; + this.databaseNamingStrategy = databaseNamingStrategy; + this.processorProvider = processorProvider; + this.schemaName = schemaName; + } + + public void shutdown() { + connector.shutdown(); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Entry point of a data sink to persist multiple entities in a collection. + * + * @param entities a collection of entities that should be persisted + * @param identifier identifier of the grid + * @param bounded to be all unique entities. Handling of specific entities is normally then + * executed by a specific {@link EntityProcessor} + * @throws SQLException + */ + public void persistAll(Collection entities, DbGridMetadata identifier) + throws SQLException { + // Extract nested entities and add them to the set of entities + Set entitiesToAdd = new HashSet<>(entities); // entities to persist + entities.stream() + .forEach( + entity -> { + if (entity instanceof NestedEntity nestedEntity) { + try { + entitiesToAdd.addAll( + (List) Extractor.extractElements(nestedEntity).stream().toList()); + } catch (ExtractorException e) { + log.error( + String.format( + "An error occurred during extraction of nested entity'%s': ", + entity.getClass()), + e); } - ); - - // Persist the entities in hierarchic order to avoid failure because of foreign keys - for (Class cls : hierarchicInsert()) { - persistMixedList( - entitiesToAdd.stream().filter( - ent -> cls.isAssignableFrom(ent.getClass()) - ).collect(Collectors.toList()), identifier); - entitiesToAdd.removeIf(ent -> cls.isAssignableFrom(ent.getClass())); // maybe it's not necessary but I'm not sure if there are entities who aren't in the hierarchic structure - } - persistMixedList(new ArrayList<>(entitiesToAdd), identifier); // persist left entities - } - - /** - * Persist multiple input entities in a collection. In contrast to {@link SqlSink#persistAll} this function does not extract nested entities. - * @param entities a collection of entities that should be persisted - * @param identifier identifier of the grid - */ - public void persistAllIgnoreNested(Collection entities, DbGridMetadata identifier) { - persistMixedList(new ArrayList<>(entities), identifier); - } - - /** - * Persist an entity. By default this method take care about the extraction process of nested entities (if any) - * @param entity the entity that should be persisted - * @param identifier identifier of the grid - * @throws SQLException - */ - public void persist(C entity, DbGridMetadata identifier) throws SQLException { - if (entity instanceof InputEntity inputEntity) { - persistIncludeNested(inputEntity, identifier); - } else if (entity instanceof ResultEntity resultEntity) { - insert(resultEntity, identifier); - } else if (entity instanceof TimeSeries timeSeries) { - persistTimeSeries(timeSeries, identifier); - } else { - log.error("I don't know how to handle an entity of class {}", entity.getClass().getSimpleName()); - } - } - - /** - * Persist an entity. In contrast to {@link SqlSink#persist} this function does not extract nested entities. - * @param entity the entity that should be persisted - * @param identifier identifier of the grid - * @throws SQLException - */ - public void persistIgnoreNested(C entity, DbGridMetadata identifier) throws SQLException { - insert(entity, identifier); + } + }); + + // Persist the entities in hierarchic order to avoid failure because of foreign keys + for (Class cls : hierarchicInsert()) { + persistMixedList( + entitiesToAdd.stream() + .filter(ent -> cls.isAssignableFrom(ent.getClass())) + .collect(Collectors.toList()), + identifier); + entitiesToAdd.removeIf( + ent -> + cls.isAssignableFrom( + ent.getClass())); // maybe it's not necessary but I'm not sure if there are + // entities who aren't in the hierarchic structure } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - protected void persistListIncludeNested(List entities, Class cls, DbGridMetadata identifier) throws SQLException { - if (NestedEntity.class.isAssignableFrom(cls)) { - entities.forEach( - entity -> { - try { - List arr = new ArrayList<>(Extractor.extractElements((NestedEntity) entity)); - persistAll(arr, identifier); - } catch (ExtractorException | SQLException e) { - log.error( - String.format( - "An error occurred during extraction of nested entity'%s': ", - cls.getSimpleName()), - e); - } - } - ); - insertListIgnoreNested(entities, cls, identifier); - } else { - insertListIgnoreNested(entities, cls, identifier); - } + persistMixedList(new ArrayList<>(entitiesToAdd), identifier); // persist left entities + } + + /** + * Persist multiple input entities in a collection. In contrast to {@link SqlSink#persistAll} this + * function does not extract nested entities. + * + * @param entities a collection of entities that should be persisted + * @param identifier identifier of the grid + */ + public void persistAllIgnoreNested( + Collection entities, DbGridMetadata identifier) { + persistMixedList(new ArrayList<>(entities), identifier); + } + + /** + * Persist an entity. By default this method take care about the extraction process of nested + * entities (if any) + * + * @param entity the entity that should be persisted + * @param identifier identifier of the grid + * @throws SQLException + */ + public void persist(C entity, DbGridMetadata identifier) + throws SQLException { + if (entity instanceof InputEntity inputEntity) { + persistIncludeNested(inputEntity, identifier); + } else if (entity instanceof ResultEntity resultEntity) { + insert(resultEntity, identifier); + } else if (entity instanceof TimeSeries timeSeries) { + persistTimeSeries(timeSeries, identifier); + } else { + log.error( + "I don't know how to handle an entity of class {}", entity.getClass().getSimpleName()); } - - public void persistIncludeNested(C entity, DbGridMetadata identifier) throws SQLException { - Set entitiesToAdd = new HashSet<>(); - entitiesToAdd.add(entity); - persistAll(entitiesToAdd, identifier); - } - - private void persistMixedList(List entities, DbGridMetadata identifier) { - Map, List> entitiesPerClass = entities.stream() - .collect(groupingBy(entity -> (Class) entity.getClass())); - entitiesPerClass.forEach( - (cls, ent) -> { - try { - persistList(ent, cls, identifier); - } catch (SQLException e) { - throw new RuntimeException(String.format( - "An error occurred during extraction of entity '%s', SQLReason: '%s'", - cls.getSimpleName(), e.getMessage()), e); - } - } - ); - } - - private , V extends Value> void persistList(List entities, Class cls, DbGridMetadata identifier) throws SQLException { - // Check if there are only elements of the same class - Class firstClass = entities.get(0).getClass(); - boolean allSameClass = entities.stream().allMatch(e -> e.getClass() == firstClass); - - if (allSameClass) { - if (InputEntity.class.isAssignableFrom(cls)) { - insertListIgnoreNested(entities, cls, identifier); - } else if (ResultEntity.class.isAssignableFrom(cls)) { - insertListIgnoreNested(entities, cls, identifier); - } else if (TimeSeries.class.isAssignableFrom(cls)) { - entities.forEach(ts -> { - try { - persistTimeSeries((TimeSeries) ts, identifier); - } catch (SQLException e) { - throw new RuntimeException(String.format( - "An error occurred during extraction of entity '%s', SQLReason: '%s'", - cls.getSimpleName(), e.getMessage()), e); - } - }); - } else { - log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); - } - } else { - log.error("The list isn't homogenous regarding the classes of the elements."); - } - } - - /** - * Writes a list of entities into a sql table. It's necessary that all entities have the same class. - */ - private void insertListIgnoreNested(List entities, Class cls, DbGridMetadata identifier) throws SQLException { - try { - String[] headerElements = processorProvider.getHeaderElements(cls); - String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); - query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier); - connector.executeUpdate(query); - } catch (ProcessorProviderException e) { - log.error("Exception occurred during processor request: ", e); - } - } - - protected , V extends Value> void persistTimeSeries(TimeSeries timeSeries, DbGridMetadata identifier) throws SQLException { - try { - TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); - String[] headerElements = processorProvider.getHeaderElements(key); - persistTimeSeries(timeSeries, headerElements, identifier); - } catch (ProcessorProviderException e) { - log.error( - "Exception occurred during receiving of header elements. Cannot write this element.", e); - } catch (IOException e) { - log.error("Exception occurred during closing of writer.", e); - } - } - - private , V extends Value> void persistTimeSeries( - TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException, IOException, SQLException { - try { - String query = basicInsertQueryValuesITS(schemaName, databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), headerElements); - Set> entityFieldData = - processorProvider.handleTimeSeries(timeSeries); - query = query + entityFieldData.stream().map( - data -> queryTimeSeriesValueLine(sqlEntityFieldData(data), headerElements, identifier, timeSeries.getUuid().toString())).collect(Collectors.joining(",\n", "", ";")); + } + + /** + * Persist an entity. In contrast to {@link SqlSink#persist} this function does not extract nested + * entities. + * + * @param entity the entity that should be persisted + * @param identifier identifier of the grid + * @throws SQLException + */ + public void persistIgnoreNested(C entity, DbGridMetadata identifier) + throws SQLException { + insert(entity, identifier); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + protected void persistListIncludeNested( + List entities, Class cls, DbGridMetadata identifier) throws SQLException { + if (NestedEntity.class.isAssignableFrom(cls)) { + entities.forEach( + entity -> { try { - connector.executeUpdate(query); - } catch (SQLException e) { - throw new RuntimeException(String.format( - "An error occurred during extraction of the time series, SQLReason: '%s'", - e.getMessage()), e); + List arr = + new ArrayList<>(Extractor.extractElements((NestedEntity) entity)); + persistAll(arr, identifier); + } catch (ExtractorException | SQLException e) { + log.error( + String.format( + "An error occurred during extraction of nested entity'%s': ", + cls.getSimpleName()), + e); } - } catch (ProcessorProviderException e) { - throw new ProcessorProviderException("Exception occurred during processor request: ", e); - } - } - - public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) throws SQLException { - DbGridMetadata identifier = new DbGridMetadata( - jointGridContainer.getGridName(), gridUUID - ); - - // get raw grid entities with types or operators - RawGridElements rawGridElements = jointGridContainer.getRawGrid(); - Set nodes = rawGridElements.getNodes(); - Set lines = rawGridElements.getLines(); - Set transformer2Ws = rawGridElements.getTransformer2Ws(); - Set transformer3Ws = rawGridElements.getTransformer3Ws(); - Set switches = rawGridElements.getSwitches(); - Set measurementUnits = rawGridElements.getMeasurementUnits(); - - // get system participants with types or operators - SystemParticipants systemParticipants = jointGridContainer.getSystemParticipants(); - Set bmPlants = systemParticipants.getBmPlants(); - Set chpPlants = systemParticipants.getChpPlants(); - Set evCS = systemParticipants.getEvCS(); - Set evs = systemParticipants.getEvs(); - Set fixedFeedIns = systemParticipants.getFixedFeedIns(); - Set heatPumps = systemParticipants.getHeatPumps(); - Set loads = systemParticipants.getLoads(); - Set pvPlants = systemParticipants.getPvPlants(); - Set storages = systemParticipants.getStorages(); - Set wecPlants = systemParticipants.getWecPlants(); - Set emSystems = systemParticipants.getEmSystems(); - - // get graphic elements (just for better readability, we could also just get them directly - // below) - GraphicElements graphicElements = jointGridContainer.getGraphics(); - - // extract types - Set types = - Stream.of( - lines, - transformer2Ws, - transformer3Ws, - bmPlants, - chpPlants, - evs, - heatPumps, - storages, - wecPlants) - .flatMap(Collection::stream) - .map(Extractor::extractType) - .collect(Collectors.toSet()); - - // extract operators - Set operators = - Stream.of( - nodes, - lines, - transformer2Ws, - transformer3Ws, - switches, - measurementUnits, - bmPlants, - chpPlants, - evCS, - evs, - fixedFeedIns, - heatPumps, - loads, - pvPlants, - storages, - wecPlants, - emSystems) - .flatMap(Collection::stream) - .map(Extractor::extractOperator) - .flatMap(Optional::stream) - .collect(Collectors.toSet()); - - List toAdd = new LinkedList<>(); - toAdd.addAll(rawGridElements.allEntitiesAsList()); - toAdd.addAll(systemParticipants.allEntitiesAsList()); - toAdd.addAll(graphicElements.allEntitiesAsList()); - toAdd.addAll(types); - toAdd.addAll(operators); - - // persist all entities - persistAll(toAdd, identifier); - } - private void insert(C entity, DbGridMetadata identifier) throws SQLException { - try { - String[] headerElements = processorProvider.getHeaderElements(entity.getClass()); - String query = basicInsertQueryValuesGrid(schemaName, databaseNamingStrategy.getEntityName(entity.getClass()).orElseThrow(), headerElements) + queryValueLine(entity, headerElements, identifier) + ";"; - connector.executeUpdate(query); - } catch (ProcessorProviderException e) { - log.error("Exception occurred during receiving of header elements. Cannot write this element.", e); - } + }); + insertListIgnoreNested(entities, cls, identifier); + } else { + insertListIgnoreNested(entities, cls, identifier); } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - /** - * Provides the value lists for an insertion query. Conflicts because of the primary key 'uuid' will be ignored. Conflicts can occur if an entity (e.g. node) already exist. - * WARNING: It's assumed that all entities are from the same class C. - */ - private String createInsertQueryBodyIgnoreConflict(List entities, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { - Set> entityFieldData = - processorProvider - .handleEntities(entities); - String queryBody = ""; - queryBody = queryBody + entityFieldData.stream().map( - data -> - queryValueLine(sqlEntityFieldData(data), headerElements, identifier) - ).collect(Collectors.joining(",\n", "", "\nON CONFLICT (uuid) DO NOTHING;")); - return queryBody; + } + + public void persistIncludeNested(C entity, DbGridMetadata identifier) + throws SQLException { + Set entitiesToAdd = new HashSet<>(); + entitiesToAdd.add(entity); + persistAll(entitiesToAdd, identifier); + } + + private void persistMixedList( + List entities, DbGridMetadata identifier) { + Map, List> entitiesPerClass = + entities.stream().collect(groupingBy(entity -> (Class) entity.getClass())); + entitiesPerClass.forEach( + (cls, ent) -> { + try { + persistList(ent, cls, identifier); + } catch (SQLException e) { + throw new RuntimeException( + String.format( + "An error occurred during extraction of entity '%s', SQLReason: '%s'", + cls.getSimpleName(), e.getMessage()), + e); + } + }); + } + + private , V extends Value> void persistList( + List entities, Class cls, DbGridMetadata identifier) throws SQLException { + // Check if there are only elements of the same class + Class firstClass = entities.get(0).getClass(); + boolean allSameClass = entities.stream().allMatch(e -> e.getClass() == firstClass); + + if (allSameClass) { + if (InputEntity.class.isAssignableFrom(cls)) { + insertListIgnoreNested(entities, cls, identifier); + } else if (ResultEntity.class.isAssignableFrom(cls)) { + insertListIgnoreNested(entities, cls, identifier); + } else if (TimeSeries.class.isAssignableFrom(cls)) { + entities.forEach( + ts -> { + try { + persistTimeSeries((TimeSeries) ts, identifier); + } catch (SQLException e) { + throw new RuntimeException( + String.format( + "An error occurred during extraction of entity '%s', SQLReason: '%s'", + cls.getSimpleName(), e.getMessage()), + e); + } + }); + } else { + log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); + } + } else { + log.error("The list isn't homogenous regarding the classes of the elements."); } - - /** - * Provides the value lists for an insertion query. - * - * WARNING: It's assumed that all entities are from the same class C. - */ - private String createInsertQueryBody(List entities, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { - Set> entityFieldData = - processorProvider - .handleEntities(entities); - String queryBody = ""; - queryBody = queryBody + entityFieldData.stream().map( - data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)).collect(Collectors.joining(",\n", "", ";")); - return queryBody; + } + + /** + * Writes a list of entities into a sql table. It's necessary that all entities have the same + * class. + */ + private void insertListIgnoreNested( + List entities, Class cls, DbGridMetadata identifier) throws SQLException { + try { + String[] headerElements = processorProvider.getHeaderElements(cls); + String query = + basicInsertQueryValuesGrid( + schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); + query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier); + connector.executeUpdate(query); + } catch (ProcessorProviderException e) { + log.error("Exception occurred during processor request: ", e); } - - /** - * Creates a line with the values of one entity for an insertion query using the entityFieldData. - */ - private String queryValueLine(LinkedHashMap entityFieldData, String[] headerElements, DbGridMetadata identifier) { - return writeOneLine(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery())); - } - - /** - * Creates a line with the values of one entity for an insertion query. - */ - private String queryValueLine(C entity, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { - return queryValueLine(processorProvider.handleEntity(entity).map(this::sqlEntityFieldData).getOrThrow(), headerElements, identifier); + } + + protected , V extends Value> void persistTimeSeries( + TimeSeries timeSeries, DbGridMetadata identifier) throws SQLException { + try { + TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); + String[] headerElements = processorProvider.getHeaderElements(key); + persistTimeSeries(timeSeries, headerElements, identifier); + } catch (ProcessorProviderException e) { + log.error( + "Exception occurred during receiving of header elements. Cannot write this element.", e); + } catch (IOException e) { + log.error("Exception occurred during closing of writer.", e); } - - private String queryTimeSeriesValueLine(Map entityFieldData, String[] headerElements, DbGridMetadata identifier, String TSuuid) { - return writeOneLine(Stream.concat(Stream.concat(Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), Stream.of(quote(TSuuid,"'")))); - } - - private LinkedHashMap sqlEntityFieldData( - LinkedHashMap entityFieldData - ) { - LinkedHashMap quotedEntityFieldData = new LinkedHashMap<>(entityFieldData); - quotedEntityFieldData.replaceAll( - (key, ent) -> quote(ent, "'") - ); - - return quotedEntityFieldData; - } - - /** - * "INSERT INTO" line with schemaName.tableName - */ - private static String basicInsertQuery(String schemaName, String tableName) { - return "INSERT INTO\n\t" + schemaName + "." + tableName; - } - - /** - * Provides the insert, column names, grid identifier and the VALUES statement for a query. - */ - private String basicInsertQueryValuesGrid(String schemaName, String tableName, String[] headerElements) { - String[] addParams = {DbGridMetadata.GRID_UUID}; - return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + "\nVALUES\n"; - } - - /** - * Provides the insert, column names, grid identifier, time_series uuid and the VALUES statement for a query. - */ - private String basicInsertQueryValuesITS(String schemaName, String tableName, String[] headerElements) { - String[] addParams = { - DbGridMetadata.GRID_UUID, - TIME_SERIES}; - return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + "\nVALUES\n"; - } - - /** - * Converts a stream of strings into an one line string with brackets. - */ - private String writeOneLine(Stream entries) { - return "(" + entries.collect(Collectors.joining(",")) + ")"; - } - - /** - * Converts an array of strings and an array of strings (for additional parameters) into an one line string with brackets. - */ - private String writeOneLine(String[] entries, String[] addParams) { - return writeOneLine(Stream.concat(Arrays.stream(entries), Arrays.stream(addParams))); - } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - public void createClassTable( - Class cls - ) throws SQLException, ProcessorProviderException, EntityProcessorException { - String query = getDataTypes(cls); + } + + private , V extends Value> void persistTimeSeries( + TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) + throws ProcessorProviderException, IOException, SQLException { + try { + String query = + basicInsertQueryValuesITS( + schemaName, + databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), + headerElements); + Set> entityFieldData = + processorProvider.handleTimeSeries(timeSeries); + query = + query + + entityFieldData.stream() + .map( + data -> + queryTimeSeriesValueLine( + sqlEntityFieldData(data), + headerElements, + identifier, + timeSeries.getUuid().toString())) + .collect(Collectors.joining(",\n", "", ";")); + try { connector.executeUpdate(query); + } catch (SQLException e) { + throw new RuntimeException( + String.format( + "An error occurred during extraction of the time series, SQLReason: '%s'", + e.getMessage()), + e); + } + } catch (ProcessorProviderException e) { + throw new ProcessorProviderException("Exception occurred during processor request: ", e); } - - public void createGridTable( - String schemaName, String tableName - ) throws SQLException { - String query = queryForGridTable(schemaName, tableName); - connector.executeUpdate(query); - } - - /** - * @return insertion order for unique entities - */ - private static List> hierarchicInsert() { - List> sortedInsert = new ArrayList<>(); - sortedInsert.add(AssetTypeInput.class); //1. Types - sortedInsert.add(OperatorInput.class); //2. Operators - sortedInsert.add(NodeInput.class); //3. Nodes - sortedInsert.add(ThermalBusInput.class); //4. ThermalBus - sortedInsert.add(ThermalUnitInput.class); //5. ThermalUnit - sortedInsert.add(ConnectorInput.class); //6a. ConnectorInput - sortedInsert.add(SystemParticipantInput.class); //6b. SystemParticipantInput - sortedInsert.add(GraphicInput.class); //7. GraphicInput - //8. Rest - return sortedInsert; + } + + public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) + throws SQLException { + DbGridMetadata identifier = new DbGridMetadata(jointGridContainer.getGridName(), gridUUID); + + // get raw grid entities with types or operators + RawGridElements rawGridElements = jointGridContainer.getRawGrid(); + Set nodes = rawGridElements.getNodes(); + Set lines = rawGridElements.getLines(); + Set transformer2Ws = rawGridElements.getTransformer2Ws(); + Set transformer3Ws = rawGridElements.getTransformer3Ws(); + Set switches = rawGridElements.getSwitches(); + Set measurementUnits = rawGridElements.getMeasurementUnits(); + + // get system participants with types or operators + SystemParticipants systemParticipants = jointGridContainer.getSystemParticipants(); + Set bmPlants = systemParticipants.getBmPlants(); + Set chpPlants = systemParticipants.getChpPlants(); + Set evCS = systemParticipants.getEvCS(); + Set evs = systemParticipants.getEvs(); + Set fixedFeedIns = systemParticipants.getFixedFeedIns(); + Set heatPumps = systemParticipants.getHeatPumps(); + Set loads = systemParticipants.getLoads(); + Set pvPlants = systemParticipants.getPvPlants(); + Set storages = systemParticipants.getStorages(); + Set wecPlants = systemParticipants.getWecPlants(); + Set emSystems = systemParticipants.getEmSystems(); + + // get graphic elements (just for better readability, we could also just get them directly + // below) + GraphicElements graphicElements = jointGridContainer.getGraphics(); + + // extract types + Set types = + Stream.of( + lines, + transformer2Ws, + transformer3Ws, + bmPlants, + chpPlants, + evs, + heatPumps, + storages, + wecPlants) + .flatMap(Collection::stream) + .map(Extractor::extractType) + .collect(Collectors.toSet()); + + // extract operators + Set operators = + Stream.of( + nodes, + lines, + transformer2Ws, + transformer3Ws, + switches, + measurementUnits, + bmPlants, + chpPlants, + evCS, + evs, + fixedFeedIns, + heatPumps, + loads, + pvPlants, + storages, + wecPlants, + emSystems) + .flatMap(Collection::stream) + .map(Extractor::extractOperator) + .flatMap(Optional::stream) + .collect(Collectors.toSet()); + + List toAdd = new LinkedList<>(); + toAdd.addAll(rawGridElements.allEntitiesAsList()); + toAdd.addAll(systemParticipants.allEntitiesAsList()); + toAdd.addAll(graphicElements.allEntitiesAsList()); + toAdd.addAll(types); + toAdd.addAll(operators); + + // persist all entities + persistAll(toAdd, identifier); + } + + private void insert(C entity, DbGridMetadata identifier) + throws SQLException { + try { + String[] headerElements = processorProvider.getHeaderElements(entity.getClass()); + String query = + basicInsertQueryValuesGrid( + schemaName, + databaseNamingStrategy.getEntityName(entity.getClass()).orElseThrow(), + headerElements) + + queryValueLine(entity, headerElements, identifier) + + ";"; + connector.executeUpdate(query); + } catch (ProcessorProviderException e) { + log.error( + "Exception occurred during receiving of header elements. Cannot write this element.", e); } + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Provides the value lists for an insertion query. Conflicts because of the primary key 'uuid' + * will be ignored. Conflicts can occur if an entity (e.g. node) already exist. WARNING: It's + * assumed that all entities are from the same class C. + */ + private String createInsertQueryBodyIgnoreConflict( + List entities, String[] headerElements, DbGridMetadata identifier) + throws ProcessorProviderException { + Set> entityFieldData = processorProvider.handleEntities(entities); + String queryBody = ""; + queryBody = + queryBody + + entityFieldData.stream() + .map(data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)) + .collect(Collectors.joining(",\n", "", "\nON CONFLICT (uuid) DO NOTHING;")); + return queryBody; + } + + /** + * Provides the value lists for an insertion query. + * + *

WARNING: It's assumed that all entities are from the same class C. + */ + private String createInsertQueryBody( + List entities, String[] headerElements, DbGridMetadata identifier) + throws ProcessorProviderException { + Set> entityFieldData = processorProvider.handleEntities(entities); + String queryBody = ""; + queryBody = + queryBody + + entityFieldData.stream() + .map(data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)) + .collect(Collectors.joining(",\n", "", ";")); + return queryBody; + } + + /** + * Creates a line with the values of one entity for an insertion query using the entityFieldData. + */ + private String queryValueLine( + LinkedHashMap entityFieldData, + String[] headerElements, + DbGridMetadata identifier) { + return writeOneLine( + Stream.concat( + Arrays.stream(headerElements).map(entityFieldData::get), + identifier.getStreamForQuery())); + } + + /** Creates a line with the values of one entity for an insertion query. */ + private String queryValueLine( + C entity, String[] headerElements, DbGridMetadata identifier) + throws ProcessorProviderException { + return queryValueLine( + processorProvider.handleEntity(entity).map(this::sqlEntityFieldData).getOrThrow(), + headerElements, + identifier); + } + + private String queryTimeSeriesValueLine( + Map entityFieldData, + String[] headerElements, + DbGridMetadata identifier, + String TSuuid) { + return writeOneLine( + Stream.concat( + Stream.concat( + Arrays.stream(headerElements).map(entityFieldData::get), + identifier.getStreamForQuery()), + Stream.of(quote(TSuuid, "'")))); + } + + private LinkedHashMap sqlEntityFieldData( + LinkedHashMap entityFieldData) { + LinkedHashMap quotedEntityFieldData = new LinkedHashMap<>(entityFieldData); + quotedEntityFieldData.replaceAll((key, ent) -> quote(ent, "'")); + + return quotedEntityFieldData; + } + + /** "INSERT INTO" line with schemaName.tableName */ + private static String basicInsertQuery(String schemaName, String tableName) { + return "INSERT INTO\n\t" + schemaName + "." + tableName; + } + + /** Provides the insert, column names, grid identifier and the VALUES statement for a query. */ + private String basicInsertQueryValuesGrid( + String schemaName, String tableName, String[] headerElements) { + String[] addParams = {DbGridMetadata.GRID_UUID}; + return basicInsertQuery(schemaName, tableName) + + " " + + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + + "\nVALUES\n"; + } + + /** + * Provides the insert, column names, grid identifier, time_series uuid and the VALUES statement + * for a query. + */ + private String basicInsertQueryValuesITS( + String schemaName, String tableName, String[] headerElements) { + String[] addParams = {DbGridMetadata.GRID_UUID, TIME_SERIES}; + return basicInsertQuery(schemaName, tableName) + + " " + + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + + "\nVALUES\n"; + } + + /** Converts a stream of strings into an one line string with brackets. */ + private String writeOneLine(Stream entries) { + return "(" + entries.collect(Collectors.joining(",")) + ")"; + } + + /** + * Converts an array of strings and an array of strings (for additional parameters) into an one + * line string with brackets. + */ + private String writeOneLine(String[] entries, String[] addParams) { + return writeOneLine(Stream.concat(Arrays.stream(entries), Arrays.stream(addParams))); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + public void createClassTable(Class cls) + throws SQLException, ProcessorProviderException, EntityProcessorException { + String query = getDataTypes(cls); + connector.executeUpdate(query); + } + + public void createGridTable(String schemaName, String tableName) throws SQLException { + String query = queryForGridTable(schemaName, tableName); + connector.executeUpdate(query); + } + + /** @return insertion order for unique entities */ + private static List> hierarchicInsert() { + List> sortedInsert = new ArrayList<>(); + sortedInsert.add(AssetTypeInput.class); // 1. Types + sortedInsert.add(OperatorInput.class); // 2. Operators + sortedInsert.add(NodeInput.class); // 3. Nodes + sortedInsert.add(ThermalBusInput.class); // 4. ThermalBus + sortedInsert.add(ThermalUnitInput.class); // 5. ThermalUnit + sortedInsert.add(ConnectorInput.class); // 6a. ConnectorInput + sortedInsert.add(SystemParticipantInput.class); // 6b. SystemParticipantInput + sortedInsert.add(GraphicInput.class); // 7. GraphicInput + // 8. Rest + return sortedInsert; + } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index cba22bd12..bbff8af0d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -1,3 +1,8 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ package edu.ie3.datamodel.io.sink import edu.ie3.datamodel.io.DbGridMetadata @@ -67,307 +72,306 @@ import static tech.units.indriya.unit.Units.PERCENT @Testcontainers class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeriesTestData { - @Shared - PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:14.2") + @Shared + PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:14.2") - @Shared - SqlConnector connector + @Shared + SqlConnector connector - @Shared - SqlDataSource sqlSource + @Shared + SqlDataSource sqlSource - @Shared - DatabaseNamingStrategy namingStrategy + @Shared + DatabaseNamingStrategy namingStrategy - @Shared - DbGridMetadata identifier + @Shared + DbGridMetadata identifier - static String schemaName = "public" + static String schemaName = "public" - def setupSpec() { - // Copy sql import scripts into docker - MountableFile sqlImportFile = getMountableFile("_sql/") - postgreSQLContainer.copyFileToContainer(sqlImportFile, "/home/") - postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + "setup.sql") + def setupSpec() { + // Copy sql import scripts into docker + MountableFile sqlImportFile = getMountableFile("_sql/") + postgreSQLContainer.copyFileToContainer(sqlImportFile, "/home/") + postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + "setup.sql") - connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) + connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) - namingStrategy = new DatabaseNamingStrategy() + namingStrategy = new DatabaseNamingStrategy() - identifier = new DbGridMetadata("vn_simona", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120002")) - - sqlSource = new SqlDataSource(connector, schemaName, namingStrategy) - } - - def setup() { - // Execute import script - Iterable importFiles = Arrays.asList( - "grids.sql", - "types.sql", - "result_entities.sql", - "input_entities.sql", - "time_series.sql", - "load_profile.sql" - ) - for (String file: importFiles) { - Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) - assert res.stderr.empty - } - } - - def cleanup() { - postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + "cleanup.sql") - } - - def "SQL sink can persist provided elements correctly"() { - given: - TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - HashMap timeSeriesProcessorMap = new HashMap<>() - timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) - IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries - - SqlSink sink = new SqlSink(schemaName, - new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(WecResult), - new ResultEntityProcessor(EvResult), - new ResultEntityProcessor(EvcsResult), - new ResultEntityProcessor(EmResult), - new ResultEntityProcessor(FlexOptionsResult), - new InputEntityProcessor(Transformer2WInput), - new InputEntityProcessor(NodeInput), - new InputEntityProcessor(EvcsInput), - new InputEntityProcessor(Transformer2WTypeInput), - new InputEntityProcessor(LineGraphicInput), - new InputEntityProcessor(NodeGraphicInput), - new InputEntityProcessor(CylindricalStorageInput), - new InputEntityProcessor(ThermalHouseInput), - new InputEntityProcessor(OperatorInput), - new InputEntityProcessor(LineInput), - new InputEntityProcessor(ThermalBusInput), - new InputEntityProcessor(LineTypeInput), - new InputEntityProcessor(LoadInput), - new InputEntityProcessor(EmInput) - ], timeSeriesProcessorMap), - namingStrategy, - connector) - UUID uuid = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") - UUID inputModel = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") - Quantity p = Quantities.getQuantity(10, StandardUnits.ACTIVE_POWER_IN) - Quantity q = Quantities.getQuantity(10, StandardUnits.REACTIVE_POWER_IN) - PvResult pvResult = new PvResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - WecResult wecResult = new WecResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - EvcsResult evcsResult = new EvcsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - EmResult emResult = new EmResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - - Quantity pRef = Quantities.getQuantity(5.1, StandardUnits.ACTIVE_POWER_RESULT) - Quantity pMin = Quantities.getQuantity(-6, StandardUnits.ACTIVE_POWER_RESULT) - Quantity pMax = Quantities.getQuantity(6, StandardUnits.ACTIVE_POWER_RESULT) - FlexOptionsResult flexOptionsResult = new FlexOptionsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, pRef, pMin, pMax) - - when: - sink.persistAll([ - pvResult, - wecResult, - evcsResult, - emResult, - flexOptionsResult, - GridTestData.transformerCtoG, - GridTestData.lineGraphicCtoD, - GridTestData.nodeGraphicC, - ThermalUnitInputTestData.cylindricStorageInput, - ThermalUnitInputTestData.thermalHouseInput, - SystemParticipantTestData.evcsInput, - SystemParticipantTestData.loadInput, - SystemParticipantTestData.emInput, - individualTimeSeries - ], identifier) - - then: - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "pv_res", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_res", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "evcs_res", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_res", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "flex_options_res", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_type_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_input", ps -> {}).count() == 4 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "operator_input", ps -> {}).count() == 2 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "cylindrical_storage_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_graphic_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_graphic_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_bus_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_house_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "ev_res", ps -> {}).count() == 0 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 - - cleanup: - sink.shutdown() - } - - - def "A SqlSink can persist a time series."() { - given: - TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - HashMap timeSeriesProcessorMap = new HashMap<>() - timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) - IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries - SqlSink sink = new SqlSink(schemaName, namingStrategy, connector) - - when: - sink.persist(individualTimeSeries, identifier) - - then: - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 - - cleanup: - sink.shutdown() - } - - def "A valid SqlSink persists a bunch of time series correctly"() { - given: - SqlSink sink = new SqlSink(schemaName, namingStrategy, connector) - SqlDataSource source = new SqlDataSource(connector, schemaName, namingStrategy) - - when: - sink.persistAll(allTimeSeries, identifier) - - then: - source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 - source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_p", ps -> {}).count() == 3 - source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pq", ps -> {}).count() == 3 - source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_ph", ps -> {}).count() == 3 - source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pqh", ps -> {}).count() == 3 - source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_weather", ps -> {}).count() == 3 - - cleanup: - sink.shutdown() - } - - def "A valid SqlSink throws an exception if an entity has null for a not null attribute."() { - given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - def nestedInput = new PvInput( - UUID.fromString("d56f15b7-8293-4b98-b5bd-58f6273ce229"), - "test_pvInput", - OperatorInput.NO_OPERATOR_ASSIGNED, - OperationTime.notLimited(), - Mock(NodeInput), - new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), - 0.2, - Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), - Quantities.getQuantity(95d, PERCENT), - Quantities.getQuantity(41.01871871948242, DEGREE_GEOM), - 0.8999999761581421, - 1, - false, - Quantities.getQuantity(25d, KILOVOLTAMPERE), - 0.95 - ) - - when: - sink.persistIgnoreNested(nestedInput, identifier) - - then: - def exception = thrown(SQLException) - exception.message.contains("ERROR: invalid input syntax for type uuid: \"null\"\n") - - cleanup: - sink.shutdown() - } + identifier = new DbGridMetadata("vn_simona", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120002")) + sqlSource = new SqlDataSource(connector, schemaName, namingStrategy) + } - def "A valid SqlSink refuses to persist an entity, if no processor can be found for a specific input"() { - given: - def sink = new SqlSink( - schemaName, - new ProcessorProvider( - ProcessorProvider.allEntityProcessors(), - new HashMap, Value>, TimeSeriesEntry, Value>>()), - namingStrategy, - connector) - - when: - sink.persist(individualEnergyPriceTimeSeries, identifier) - - then: - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 0 - - cleanup: - sink.shutdown() + def setup() { + // Execute import script + Iterable importFiles = Arrays.asList( + "grids.sql", + "types.sql", + "result_entities.sql", + "input_entities.sql", + "time_series.sql", + "load_profile.sql" + ) + for (String file: importFiles) { + Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) + assert res.stderr.empty } - - def "A valid SqlSink throws an exception if a nested entity hasn't all of its nested entity."() { - given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - - when: - sink.persistIgnoreNested(SystemParticipantTestData.loadInput, identifier) - - then: - def exception = thrown(SQLException) - exception.message == "ERROR: insert or update on table \"load_input\" violates foreign key constraint \"load_input_node_fkey\"\n" + - " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\"." - - cleanup: - sink.shutdown() - } - - def "A valid SqlSink can create a table for class."() { - given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - def wec = SystemParticipantTestData.wecInput - - when: - sink.createClassTable(wec.getClass()) - - then: - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_input", ps -> {}).count() == 0 - } - - def "A valid SqlSink throws an exception if a grid does not exist."() { - given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - - when: - def failIdentifier = new DbGridMetadata("fail_grid", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120003")) - - sink.persist(individualEnergyPriceTimeSeries, failIdentifier) - - then: - def exception = thrown(RuntimeException) - exception.message.contains("Detail: Key (grid_uuid)=(8e6bd444-4580-11ee-be56-0242ac120003) is not present in table \"grids\".") - - cleanup: - sink.shutdown() - } - - def "A valid SqlSink should persist a valid joint grid container correctly"() { - given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - - when: - sink.persistJointGrid(SampleJointGrid.grid(), UUID.fromString("297dfac8-83cc-11ee-b962-0242ac120002")) - - then: - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 6 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_type_input", ps -> {}).count() == 2 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 2 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_input", ps -> {}).count() == 7 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "operator_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "pv_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "storage_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "storage_type_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_type_input", ps -> {}).count() == 2 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_input", ps -> {}).count() == 2 - - cleanup: - sink.shutdown() - } - + } + + def cleanup() { + postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + "cleanup.sql") + } + + def "SQL sink can persist provided elements correctly"() { + given: + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + HashMap timeSeriesProcessorMap = new HashMap<>() + timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) + IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries + + SqlSink sink = new SqlSink(schemaName, + new ProcessorProvider([ + new ResultEntityProcessor(PvResult), + new ResultEntityProcessor(WecResult), + new ResultEntityProcessor(EvResult), + new ResultEntityProcessor(EvcsResult), + new ResultEntityProcessor(EmResult), + new ResultEntityProcessor(FlexOptionsResult), + new InputEntityProcessor(Transformer2WInput), + new InputEntityProcessor(NodeInput), + new InputEntityProcessor(EvcsInput), + new InputEntityProcessor(Transformer2WTypeInput), + new InputEntityProcessor(LineGraphicInput), + new InputEntityProcessor(NodeGraphicInput), + new InputEntityProcessor(CylindricalStorageInput), + new InputEntityProcessor(ThermalHouseInput), + new InputEntityProcessor(OperatorInput), + new InputEntityProcessor(LineInput), + new InputEntityProcessor(ThermalBusInput), + new InputEntityProcessor(LineTypeInput), + new InputEntityProcessor(LoadInput), + new InputEntityProcessor(EmInput) + ], timeSeriesProcessorMap), + namingStrategy, + connector) + UUID uuid = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") + UUID inputModel = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") + Quantity p = Quantities.getQuantity(10, StandardUnits.ACTIVE_POWER_IN) + Quantity q = Quantities.getQuantity(10, StandardUnits.REACTIVE_POWER_IN) + PvResult pvResult = new PvResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + WecResult wecResult = new WecResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + EvcsResult evcsResult = new EvcsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + EmResult emResult = new EmResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + + Quantity pRef = Quantities.getQuantity(5.1, StandardUnits.ACTIVE_POWER_RESULT) + Quantity pMin = Quantities.getQuantity(-6, StandardUnits.ACTIVE_POWER_RESULT) + Quantity pMax = Quantities.getQuantity(6, StandardUnits.ACTIVE_POWER_RESULT) + FlexOptionsResult flexOptionsResult = new FlexOptionsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, pRef, pMin, pMax) + + when: + sink.persistAll([ + pvResult, + wecResult, + evcsResult, + emResult, + flexOptionsResult, + GridTestData.transformerCtoG, + GridTestData.lineGraphicCtoD, + GridTestData.nodeGraphicC, + ThermalUnitInputTestData.cylindricStorageInput, + ThermalUnitInputTestData.thermalHouseInput, + SystemParticipantTestData.evcsInput, + SystemParticipantTestData.loadInput, + SystemParticipantTestData.emInput, + individualTimeSeries + ], identifier) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "pv_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "evcs_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "flex_options_res", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_type_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_input", ps -> {}).count() == 4 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "operator_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "cylindrical_storage_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_graphic_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_graphic_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_bus_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_house_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "ev_res", ps -> {}).count() == 0 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 + + cleanup: + sink.shutdown() + } + + + def "A SqlSink can persist a time series."() { + given: + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + HashMap timeSeriesProcessorMap = new HashMap<>() + timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) + IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries + SqlSink sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + sink.persist(individualTimeSeries, identifier) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink persists a bunch of time series correctly"() { + given: + SqlSink sink = new SqlSink(schemaName, namingStrategy, connector) + SqlDataSource source = new SqlDataSource(connector, schemaName, namingStrategy) + + when: + sink.persistAll(allTimeSeries, identifier) + + then: + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_p", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pq", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_ph", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pqh", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_weather", ps -> {}).count() == 3 + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink throws an exception if an entity has null for a not null attribute."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + def nestedInput = new PvInput( + UUID.fromString("d56f15b7-8293-4b98-b5bd-58f6273ce229"), + "test_pvInput", + OperatorInput.NO_OPERATOR_ASSIGNED, + OperationTime.notLimited(), + Mock(NodeInput), + new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), + 0.2, + Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), + Quantities.getQuantity(95d, PERCENT), + Quantities.getQuantity(41.01871871948242, DEGREE_GEOM), + 0.8999999761581421, + 1, + false, + Quantities.getQuantity(25d, KILOVOLTAMPERE), + 0.95 + ) + + when: + sink.persistIgnoreNested(nestedInput, identifier) + + then: + def exception = thrown(SQLException) + exception.message.contains("ERROR: invalid input syntax for type uuid: \"null\"\n") + + cleanup: + sink.shutdown() + } + + + def "A valid SqlSink refuses to persist an entity, if no processor can be found for a specific input"() { + given: + def sink = new SqlSink( + schemaName, + new ProcessorProvider( + ProcessorProvider.allEntityProcessors(), + new HashMap, Value>, TimeSeriesEntry, Value>>()), + namingStrategy, + connector) + + when: + sink.persist(individualEnergyPriceTimeSeries, identifier) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 0 + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink throws an exception if a nested entity hasn't all of its nested entity."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + sink.persistIgnoreNested(SystemParticipantTestData.loadInput, identifier) + + then: + def exception = thrown(SQLException) + exception.message == "ERROR: insert or update on table \"load_input\" violates foreign key constraint \"load_input_node_fkey\"\n" + + " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\"." + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink can create a table for class."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + def wec = SystemParticipantTestData.wecInput + + when: + sink.createClassTable(wec.getClass()) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_input", ps -> {}).count() == 0 + } + + def "A valid SqlSink throws an exception if a grid does not exist."() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + def failIdentifier = new DbGridMetadata("fail_grid", UUID.fromString("8e6bd444-4580-11ee-be56-0242ac120003")) + + sink.persist(individualEnergyPriceTimeSeries, failIdentifier) + + then: + def exception = thrown(RuntimeException) + exception.message.contains("Detail: Key (grid_uuid)=(8e6bd444-4580-11ee-be56-0242ac120003) is not present in table \"grids\".") + + cleanup: + sink.shutdown() + } + + def "A valid SqlSink should persist a valid joint grid container correctly"() { + given: + def sink = new SqlSink(schemaName, namingStrategy, connector) + + when: + sink.persistJointGrid(SampleJointGrid.grid(), UUID.fromString("297dfac8-83cc-11ee-b962-0242ac120002")) + + then: + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_input", ps -> {}).count() == 6 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "line_type_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "node_input", ps -> {}).count() == 7 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "operator_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "pv_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "storage_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "storage_type_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_type_input", ps -> {}).count() == 2 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "transformer_2_w_input", ps -> {}).count() == 2 + + cleanup: + sink.shutdown() + } } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 0da55b6cd..2e9dd837f 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -55,8 +55,8 @@ trait TimeSeriesTestData { ) IndividualTimeSeriesMetaInformation individualEnergyPriceTimeSeriesMeta = new IndividualTimeSeriesMetaInformation( - UUID.fromString("a4bbcb77-b9d0-4b88-92be-b9a14a3e332b"), - ColumnScheme.ENERGY_PRICE + UUID.fromString("a4bbcb77-b9d0-4b88-92be-b9a14a3e332b"), + ColumnScheme.ENERGY_PRICE ) Set> individualEnergyPriceTimeSeriesProcessed = [ From b712f172711d0ae8b216e28df83491719649e1ef Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Wed, 22 Nov 2023 09:29:33 +0100 Subject: [PATCH 006/310] Improve SqlUtils --- .../edu/ie3/datamodel/io/DbGridMetadata.java | 1 + .../java/edu/ie3/datamodel/io/SqlUtils.java | 41 +++++++++++-------- .../edu/ie3/datamodel/io/sink/SqlSink.java | 8 ++-- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 2 +- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java index c9bf2fc2f..29df2bd90 100644 --- a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java +++ b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java @@ -13,6 +13,7 @@ /** Class for identification of entities and results from grids in SQL databases. */ public record DbGridMetadata(String gridName, UUID uuid) { + public static final String GRID_TABLE = "grids"; public static final String GRID_NAME = "grid_name"; public static final String GRID_UUID = "grid_uuid"; diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index 358d3c83c..e78427934 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory; public class SqlUtils { + protected static final Logger log = LoggerFactory.getLogger(SqlUtils.class); private static final String endQueryCreateTable = ")\n" + "\t WITHOUT OIDS\n" + "\t TABLESPACE pg_default;"; @@ -29,38 +30,35 @@ private SqlUtils() { throw new IllegalStateException("Utility classes cannot be instantiated"); } - public static String queryForCreation( - String schemaName, String tableName, Stream> columnsWithDataTypes) { - return beginQueryCreateTable(schemaName, tableName) + " " + endQueryCreateTable; - } - - public static String getEndQueryCreateTable() { - return endQueryCreateTable; - } - private static String beginQueryCreateTable(String schemaName, String tableName) { return "CREATE TABLE " + schemaName + "." + tableName + "\n(\n"; } - public static String queryForGridTable(String schemaName, String tableName) { - return beginQueryCreateTable(schemaName, tableName) + /** @return query to create a SQL table for a grid */ + public static String queryCreateGridTable(String schemaName) { + return beginQueryCreateTable(schemaName, DbGridMetadata.GRID_TABLE) + "\tuuid uuid PRIMARY KEY,\n\tname TEXT NOT NULL\n" + endQueryCreateTable; } - public static String getDataTypes(Class cls) + /** @return query to create a SQL table for an unique entity */ + public static String queryCreateTableUniqueEntity( + Class cls, String schemaName) throws EntityProcessorException, ProcessorProviderException { ProcessorProvider processorProvider = new ProcessorProvider(); DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); String[] headerElements = processorProvider.getHeaderElements(cls); - Stream strHeader = Stream.concat(Arrays.stream(headerElements), Stream.of("grid_uuid")); + Stream strHeader = + Stream.concat(Arrays.stream(headerElements), Stream.of(DbGridMetadata.GRID_UUID)); Stream dtHeader = strHeader.map( element -> camelCaseToSnakeCase(element) + " " - + classToDataType().get(camelCaseToSnakeCase(element))); - return "CREATE TABLE public." + + columnToSqlDataType().get(camelCaseToSnakeCase(element))); + return "CREATE TABLE " + + schemaName + + "." + namingStrategy.getEntityName(cls).orElseThrow() + "\n(\n\t" + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) @@ -70,7 +68,12 @@ public static String getDataTypes(Class cls) + "TABLESPACE pg_default;\n"; } - public static Map classToDataType() { + /** + * Map to create a SQL table for an entity with the right data types. + * + * @return Map column name -> data type + */ + public static Map columnToSqlDataType() { HashMap map = new HashMap(); map.put("uuid", "uuid PRIMARY KEY"); @@ -94,7 +97,6 @@ public static Map classToDataType() { map.put("length", "double precision NOT NULL"); map.put("node_a", "uuid NOT NULL"); map.put("node_b", "uuid NOT NULL"); - map.put("type", "uuid NOT NULL"); // EVCS map.put("olm_characteristic", "TEXT NOT NULL"); map.put("parallel_devices", "int NOT NULL"); map.put("cos_phi_rated", "TEXT NOT NULL"); @@ -182,6 +184,11 @@ public static Map classToDataType() { return map; } + /** + * To avoid data type conflicts while insertion into a SQL table all columns should be quoted. + * + * @return input with quoteSymbol + */ public static String quote(String input, String quoteSymbol) { if (input == "") { return "NULL"; diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 59d95b8ce..dee078f9d 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -544,14 +544,14 @@ private String writeOneLine(String[] entries, String[] addParams) { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - public void createClassTable(Class cls) + public void createClassTable(Class cls, String schemaName) throws SQLException, ProcessorProviderException, EntityProcessorException { - String query = getDataTypes(cls); + String query = queryCreateTableUniqueEntity(cls, schemaName); connector.executeUpdate(query); } - public void createGridTable(String schemaName, String tableName) throws SQLException { - String query = queryForGridTable(schemaName, tableName); + public void createGridTable(String schemaName) throws SQLException { + String query = queryCreateGridTable(schemaName); connector.executeUpdate(query); } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index bbff8af0d..5997f65d6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -323,7 +323,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri sink.shutdown() } - def "A valid SqlSink can create a table for class."() { + def "A valid SqlSink can create a table for entity class."() { given: def sink = new SqlSink(schemaName, namingStrategy, connector) def wec = SystemParticipantTestData.wecInput From 75c57f9d4b4a6ccedee57136a696e753983fd99a Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Wed, 22 Nov 2023 16:08:19 +0100 Subject: [PATCH 007/310] Temprorary --- src/main/java/edu/ie3/datamodel/io/processor/Processor.java | 3 ++- src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 4d2a48454..11118e68a 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -19,6 +19,7 @@ import edu.ie3.datamodel.models.voltagelevels.VoltageLevel; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; +import edu.ie3.util.TimeUtil; import edu.ie3.util.exceptions.QuantityException; import java.beans.Introspector; import java.lang.reflect.InvocationTargetException; @@ -412,7 +413,7 @@ protected String processOperationTime(OperationTime operationTime, String fieldN * @return string representation of the ZonedDateTime */ protected String processZonedDateTime(ZonedDateTime zonedDateTime) { - return zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z")); + return TimeUtil.withDefaults.toString(zonedDateTime); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index dee078f9d..b8e0c7a46 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -262,6 +262,7 @@ private void insertListIgnoreNested( basicInsertQueryValuesGrid( schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier); + System.out.println(query); connector.executeUpdate(query); } catch (ProcessorProviderException e) { log.error("Exception occurred during processor request: ", e); From 4955b93c978976161aa74ef7a062b898c481c1f0 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Fri, 24 Nov 2023 10:27:45 +0100 Subject: [PATCH 008/310] temp --- src/main/java/edu/ie3/datamodel/io/processor/Processor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 11118e68a..86bdcaf5c 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -400,7 +400,6 @@ protected String processOperationTime(OperationTime operationTime, String fieldN operationTime .getEndDate() .ifPresent(endDate -> resultStringBuilder.append(processZonedDateTime(endDate))); - return resultStringBuilder.toString(); } From 920aea45675c591cdbfa626e0819d162652855f4 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 8 Apr 2024 17:59:40 +0200 Subject: [PATCH 009/310] Enhancing `TimeSeriesSource`s with method to extract future activation ticks. --- CHANGELOG.md | 2 + .../datamodel/io/source/TimeSeriesSource.java | 8 ++ .../datamodel/io/source/WeatherSource.java | 10 +- .../couchbase/CouchbaseWeatherSource.java | 44 +++++++++ .../io/source/csv/CsvTimeSeriesSource.java | 5 + .../io/source/csv/CsvWeatherSource.java | 9 +- .../influxdb/InfluxDbWeatherSource.java | 59 ++++++++++++ .../io/source/sql/SqlTimeSeriesSource.java | 33 +++++++ .../io/source/sql/SqlWeatherSource.java | 92 +++++++++++++++++++ .../models/timeseries/TimeSeries.java | 8 ++ .../individual/IndividualTimeSeries.java | 5 + .../repetitive/LoadProfileInput.java | 11 ++- .../CouchbaseWeatherSourceCosmoIT.groovy | 17 ++++ .../CouchbaseWeatherSourceIconIT.groovy | 17 ++++ .../source/csv/CsvTimeSeriesSourceTest.groovy | 16 ++++ .../csv/CsvWeatherSourceCosmoTest.groovy | 20 ++++ .../csv/CsvWeatherSourceIconTest.groovy | 19 ++++ .../InfluxDbWeatherSourceCosmoIT.groovy | 18 ++++ .../InfluxDbWeatherSourceIconIT.groovy | 17 ++++ .../source/sql/SqlTimeSeriesSourceIT.groovy | 15 +++ .../source/sql/SqlWeatherSourceCosmoIT.groovy | 17 ++++ .../source/sql/SqlWeatherSourceIconIT.groovy | 17 ++++ .../IndividualTimeSeriesTest.groovy | 20 ++++ .../ie3/test/common/WeatherTestData.groovy | 10 +- 24 files changed, 477 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b431ade12..aef8ced4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added test for invalid input data in `CsvRawGridSource` [#1021](https://github.com/ie3-institute/PowerSystemDataModel/issues/1021) - Added `CsvThermalGridSource` [#1009](https://github.com/ie3-institute/PowerSystemDataModel/issues/1009) - Enhance documentation for CSV timeseries [#825](https://github.com/ie3-institute/PowerSystemDataModel/issues/825) +- Enhance `TimeSeriesSource` with method to retrieve all time keys after a given key [#543](https://github.com/ie3-institute/PowerSystemDataModel/issues/543) +- Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) ### Fixed - Fixed Couchbase integration tests that randomly failed [#755](https://github.com/ie3-institute/PowerSystemDataModel/issues/755) diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java index fe45ee751..2d656b744 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java @@ -51,4 +51,12 @@ public abstract IndividualTimeSeries getTimeSeries(ClosedInterval getValue(ZonedDateTime time) throws SourceException; + + /** + * Method to return all time keys after a given timestamp. + * + * @param time given time + * @return a list of time keys + */ + public abstract List getTimeKeysAfter(ZonedDateTime time); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java index 1cf672164..0b4269299 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java @@ -28,8 +28,6 @@ public abstract class WeatherSource { protected TimeBasedWeatherValueFactory weatherFactory; - protected Map> coordinateToTimeSeries; - protected IdCoordinateSource idCoordinateSource; protected static final String COORDINATE_ID = "coordinateid"; @@ -61,6 +59,14 @@ public abstract Map> getWeather( public abstract Optional> getWeather( ZonedDateTime date, Point coordinate) throws SourceException; + public abstract Map> getTimeKeysAfter(ZonedDateTime time) + throws SourceException; + + public List getTimeKeysAfter(ZonedDateTime time, Point coordinate) + throws SourceException { + return getTimeKeysAfter(time).getOrDefault(coordinate, Collections.emptyList()); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java index ac9ae8294..9e5c7b9f4 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java @@ -182,6 +182,37 @@ public Optional> getWeather(ZonedDateTime date, Poi } } + @Override + public Map> getTimeKeysAfter(ZonedDateTime time) { + String query = createQueryStringForFollowingTimeKeys(time); + CompletableFuture futureResult = connector.query(query); + QueryResult queryResult = futureResult.join(); + List jsonWeatherInputs = Collections.emptyList(); + try { + jsonWeatherInputs = queryResult.rowsAsObject(); + } catch (DecodingFailureException ex) { + logger.error("Querying weather inputs failed!", ex); + } + if (jsonWeatherInputs != null && !jsonWeatherInputs.isEmpty()) { + + Map>> timeBasedValues = + jsonWeatherInputs.stream() + .map(this::toTimeBasedWeatherValue) + .flatMap(Optional::stream) + .filter(t -> t.getTime().isAfter(time)) + .collect( + Collectors.groupingBy(t -> t.getValue().getCoordinate(), Collectors.toSet())); + + return timeBasedValues.entrySet().stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + t -> t.getValue().stream().map(TimeBasedValue::getTime).sorted().toList())); + } + + return Collections.emptyMap(); + } + /** * Generates a key for weather documents with the pattern: {@code * weather::::

WARNING: It's assumed that all entities are from the same class C. */ - private String createInsertQueryBody( + private String createInsertQueryBody( List entities, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { Set> entityFieldData = processorProvider.handleEntities(entities); @@ -472,7 +481,7 @@ private String queryValueLine( } /** Creates a line with the values of one entity for an insertion query. */ - private String queryValueLine( + private String queryValueLine( C entity, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { return queryValueLine( @@ -510,7 +519,9 @@ private static String basicInsertQuery(String schemaName, String tableName) { /** Provides the insert, column names, grid identifier and the VALUES statement for a query. */ private String basicInsertQueryValuesGrid( String schemaName, String tableName, String[] headerElements) { - String[] addParams = {DbGridMetadata.GRID_UUID}; + String[] addParams = { + DbGridMetadata.GRID_UUID + }; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) @@ -523,7 +534,10 @@ private String basicInsertQueryValuesGrid( */ private String basicInsertQueryValuesITS( String schemaName, String tableName, String[] headerElements) { - String[] addParams = {DbGridMetadata.GRID_UUID, TIME_SERIES}; + String[] addParams = { + DbGridMetadata.GRID_UUID, + TIME_SERIES + }; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) @@ -545,7 +559,7 @@ private String writeOneLine(String[] entries, String[] addParams) { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - public void createClassTable(Class cls, String schemaName) + public void createClassTable(Class cls, String schemaName) throws SQLException, ProcessorProviderException, EntityProcessorException { String query = queryCreateTableUniqueEntity(cls, schemaName); connector.executeUpdate(query); diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java index 08aaef7ec..576e7dc74 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java @@ -179,7 +179,6 @@ protected Stream> buildStreamByTableName(String tableName) { protected Stream> executeQuery(String query, AddParams addParams) { try (PreparedStatement ps = connector.getConnection().prepareStatement(query)) { addParams.addParams(ps); - ResultSet resultSet = ps.executeQuery(); return connector.extractFieldMaps(resultSet).stream(); } catch (SQLException e) { @@ -191,4 +190,10 @@ protected Stream> executeQuery(String query, AddParams addPa protected Stream> executeQuery(String query) { return executeQuery(query, x -> {}); } + + public boolean checkExistingTable(String tableName) throws SQLException { + return connector.tableExistsSQL(tableName); + } + + } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 5997f65d6..d8860073f 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -16,6 +16,7 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.io.source.sql.SqlDataSource import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.connector.LineInput @@ -24,7 +25,6 @@ import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput @@ -161,15 +161,15 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri UUID inputModel = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") Quantity p = Quantities.getQuantity(10, StandardUnits.ACTIVE_POWER_IN) Quantity q = Quantities.getQuantity(10, StandardUnits.REACTIVE_POWER_IN) - PvResult pvResult = new PvResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - WecResult wecResult = new WecResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - EvcsResult evcsResult = new EvcsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) - EmResult emResult = new EmResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, p, q) + PvResult pvResult = new PvResult(TimeUtil.withDefaults.toZonedDateTime("2020-01-30T17:26:44Z"), inputModel, p, q) + WecResult wecResult = new WecResult(TimeUtil.withDefaults.toZonedDateTime("2020-01-30T17:26:44Z"), inputModel, p, q) + EvcsResult evcsResult = new EvcsResult(TimeUtil.withDefaults.toZonedDateTime("2020-01-30T17:26:44Z"), inputModel, p, q) + EmResult emResult = new EmResult(TimeUtil.withDefaults.toZonedDateTime("2020-01-30T17:26:44Z"), inputModel, p, q) Quantity pRef = Quantities.getQuantity(5.1, StandardUnits.ACTIVE_POWER_RESULT) Quantity pMin = Quantities.getQuantity(-6, StandardUnits.ACTIVE_POWER_RESULT) Quantity pMax = Quantities.getQuantity(6, StandardUnits.ACTIVE_POWER_RESULT) - FlexOptionsResult flexOptionsResult = new FlexOptionsResult(uuid, TimeUtil.withDefaults.toZonedDateTime("2020-01-30 17:26:44"), inputModel, pRef, pMin, pMax) + FlexOptionsResult flexOptionsResult = new FlexOptionsResult(TimeUtil.withDefaults.toZonedDateTime("2020-01-30T17:26:44Z"), inputModel, pRef, pMin, pMax) when: sink.persistAll([ @@ -185,8 +185,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, - SystemParticipantTestData.emInput, - individualTimeSeries + SystemParticipantTestData.emInput ], identifier) then: @@ -206,9 +205,8 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_bus_input", ps -> {}).count() == 1 sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "thermal_house_input", ps -> {}).count() == 1 sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "load_input", ps -> {}).count() == 1 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_input", ps -> {}).count() == 1 + sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "em_input", ps -> {}).count() == 2 sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "ev_res", ps -> {}).count() == 0 - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_c", ps -> {}).count() == 3 cleanup: sink.shutdown() @@ -264,6 +262,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri OperationTime.notLimited(), Mock(NodeInput), new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), + null, 0.2, Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), Quantities.getQuantity(95d, PERCENT), @@ -309,32 +308,32 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri def "A valid SqlSink throws an exception if a nested entity hasn't all of its nested entity."() { given: - def sink = new SqlSink(schemaName, namingStrategy, connector) + def sink = new SqlSink( + schemaName, + namingStrategy, + connector) + def load = SystemParticipantTestData.loadInput when: - sink.persistIgnoreNested(SystemParticipantTestData.loadInput, identifier) + sink.persistIgnoreNested(load, identifier) then: def exception = thrown(SQLException) exception.message == "ERROR: insert or update on table \"load_input\" violates foreign key constraint \"load_input_node_fkey\"\n" + " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\"." - - cleanup: - sink.shutdown() } def "A valid SqlSink can create a table for entity class."() { given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - def wec = SystemParticipantTestData.wecInput + def sink = new SqlSink(schemaName, namingStrategy, connector) + def hp = SystemParticipantTestData.hpInput when: - sink.createClassTable(wec.getClass()) + sink.createClassTable(hp.getClass(), schemaName) then: - sqlSource.executeQuery("SELECT * FROM " + schemaName + "." + "wec_input", ps -> {}).count() == 0 + sqlSource.checkExistingTable("hp_input") } - def "A valid SqlSink throws an exception if a grid does not exist."() { given: def sink = new SqlSink(schemaName, namingStrategy, connector) diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index 1c3bddf01..0671b350e 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -38,6 +38,7 @@ CREATE TABLE public.evcs_input ( uuid uuid PRIMARY KEY, charging_points int NOT NULL, + controlling_em uuid, cos_phi_rated TEXT NOT NULL, id TEXT NOT NULL, location_type TEXT NOT NULL, @@ -48,7 +49,7 @@ CREATE TABLE public.evcs_input q_characteristics TEXT NOT NULL, type TEXT NOT NULL, v_2g_support bool NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; @@ -155,6 +156,7 @@ CREATE TABLE public.thermal_bus_input CREATE TABLE public.load_input ( uuid uuid PRIMARY KEY, + controlling_em uuid NOT NULL, cos_phi_rated TEXT NOT NULL, dsm bool NOT NULL, e_cons_annual double precision NOT NULL, @@ -166,7 +168,7 @@ CREATE TABLE public.load_input operator uuid, q_characteristics TEXT NOT NULL, s_rated double precision NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; @@ -174,15 +176,13 @@ CREATE TABLE public.load_input CREATE TABLE public.em_input ( uuid uuid PRIMARY KEY, - connected_assets TEXT NOT NULL, control_strategy TEXT NOT NULL, + controlling_em uuid, id TEXT NOT NULL, - node uuid NOT NULL, operates_from timestamp with time zone, operates_until timestamp with time zone, operator uuid, - q_characteristics TEXT NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; @@ -192,6 +192,7 @@ CREATE TABLE public.pv_input uuid uuid PRIMARY KEY, albedo double precision NOT NULL, azimuth double precision NOT NULL, + controlling_em uuid, cos_phi_rated TEXT NOT NULL, elevation_angle double precision NOT NULL, eta_conv double precision NOT NULL, @@ -205,7 +206,7 @@ CREATE TABLE public.pv_input operator uuid, q_characteristics TEXT NOT NULL, s_rated double precision NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; @@ -213,6 +214,7 @@ CREATE TABLE public.pv_input CREATE TABLE public.storage_input ( uuid uuid PRIMARY KEY, + controlling_em uuid NOT NULL, id TEXT NOT NULL, node uuid NOT NULL, operates_from timestamp with time zone, @@ -220,7 +222,7 @@ CREATE TABLE public.storage_input operator uuid, q_characteristics TEXT NOT NULL, type uuid NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql index 5f3268340..3ef2160f7 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql @@ -1,6 +1,5 @@ CREATE TABLE public.load_profile_g2 ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, day_of_week TEXT NOT NULL, quarter_hour_of_day TEXT NOT NULL, diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql index 924d8efb1..208f1f655 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql @@ -1,6 +1,5 @@ CREATE TABLE public.pv_res ( - uuid uuid PRIMARY KEY, input_model uuid NOT NULL, p double precision NOT NULL, q double precision NOT NULL, @@ -12,7 +11,6 @@ CREATE TABLE public.pv_res CREATE TABLE public.wec_res ( - uuid uuid PRIMARY KEY, input_model uuid NOT NULL, p double precision NOT NULL, q double precision NOT NULL, @@ -24,7 +22,6 @@ CREATE TABLE public.wec_res CREATE TABLE public.ev_res ( - uuid uuid PRIMARY KEY, input_model uuid NOT NULL, p double precision NOT NULL, q double precision NOT NULL, @@ -37,7 +34,6 @@ CREATE TABLE public.ev_res CREATE TABLE public.evcs_res ( - uuid uuid PRIMARY KEY, input_model uuid NOT NULL, p double precision NOT NULL, q double precision NOT NULL, @@ -49,7 +45,6 @@ CREATE TABLE public.evcs_res CREATE TABLE public.em_res ( - uuid uuid PRIMARY KEY, input_model uuid NOT NULL, p double precision NOT NULL, q double precision NOT NULL, @@ -61,7 +56,6 @@ CREATE TABLE public.em_res CREATE TABLE public.flex_options_res ( - uuid uuid PRIMARY KEY, input_model uuid NOT NULL, p_max double precision NOT NULL, p_min double precision NOT NULL, diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql index d77ad1895..be58fda6a 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql @@ -1,6 +1,5 @@ CREATE TABLE public.time_series_c ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, price double precision, @@ -18,7 +17,6 @@ CREATE UNIQUE INDEX time_series_c_series_time ON time_series_c USING btree (time CREATE TABLE public.time_series_p ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, p double precision, @@ -33,7 +31,6 @@ CREATE UNIQUE INDEX time_series_p_series_time ON time_series_p USING btree (time CREATE TABLE public.time_series_pq ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, p double precision, @@ -49,7 +46,6 @@ CREATE UNIQUE INDEX time_series_pq_series_time ON time_series_pq USING btree (ti CREATE TABLE public.time_series_h ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, heat_demand double precision, @@ -64,7 +60,6 @@ CREATE UNIQUE INDEX time_series_h_series_time ON time_series_h USING btree (time CREATE TABLE public.time_series_ph ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, p double precision, @@ -80,7 +75,6 @@ CREATE UNIQUE INDEX time_series_ph_series_time ON time_series_ph USING btree (ti CREATE TABLE public.time_series_pqh ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, time timestamp with time zone NOT NULL, p double precision, @@ -97,7 +91,6 @@ CREATE UNIQUE INDEX time_series_pqh_series_time ON time_series_pqh USING btree ( CREATE TABLE public.time_series_weather ( - uuid uuid PRIMARY KEY, time_series uuid NOT NULL, coordinate TEXT NOT NULL, time timestamp with time zone NOT NULL, diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql index 3c4579882..cddf9f995 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql @@ -42,17 +42,13 @@ CREATE TABLE public.storage_type_input active_power_gradient double precision NOT NULL, capex double precision NOT NULL, cos_phi_rated TEXT NOT NULL, - dod double precision NOT NULL, e_storage double precision NOT NULL, eta double precision NOT NULL, id TEXT NOT NULL, - life_cycle double precision NOT NULL, - life_time double precision NOT NULL, opex double precision NOT NULL, p_max double precision NOT NULL, s_rated double precision NOT NULL, - - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; From fef513d4ccaed1cd61d07c15371d6e2e9d2e3dd8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Thu, 20 Jun 2024 15:29:43 +0200 Subject: [PATCH 020/310] Implementing requested changes. --- .../datamodel/io/connectors/SqlConnector.java | 17 +++-- .../io/source/sql/SqlDataSource.java | 7 +-- .../io/source/sql/SqlIdCoordinateSource.java | 62 ++++++++++--------- 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index c79c07e9c..b104c4434 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -131,12 +131,21 @@ public void shutdown() { public Stream> toStream(PreparedStatement ps, int fetchSize) throws SQLException { ps.setFetchSize(fetchSize); - Iterator> sqlIterator = getSqlIterator(ps.executeQuery()); + ResultSet resultSet = ps.executeQuery(); + Iterator> sqlIterator = getSqlIterator(resultSet); return StreamSupport.stream( - Spliterators.spliteratorUnknownSize( - sqlIterator, Spliterator.NONNULL | Spliterator.IMMUTABLE), - true); + Spliterators.spliteratorUnknownSize( + sqlIterator, Spliterator.NONNULL | Spliterator.IMMUTABLE), + true) + .onClose( + () -> { + try (resultSet) { + log.debug("Resources successfully closed."); + } catch (SQLException e) { + log.warn("Failed to properly close sources.", e); + } + }); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java index 872c90d32..3b5ca4783 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java @@ -180,11 +180,10 @@ protected Stream> executeQuery(String query, AddParams addPa PreparedStatement ps = connector.getConnection().prepareStatement(query); addParams.addParams(ps); - Stream> stream = connector.toStream(ps, 1000); - - // don't work with `try with resource`, but is necessary to get results + // don't work with `try with resource`, therefore manual closing is necessary ps.closeOnCompletion(); - return stream; + + return connector.toStream(ps, 1000); } catch (SQLException e) { log.error("Error during execution of query {}", query, e); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java index 4424d3adf..152389b79 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java @@ -19,8 +19,8 @@ import edu.ie3.util.geo.CoordinateDistance; import edu.ie3.util.geo.GeoUtils; import java.sql.Array; -import java.sql.PreparedStatement; import java.util.*; +import java.util.stream.Stream; import javax.measure.quantity.Length; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Point; @@ -109,7 +109,8 @@ public Optional> getSourceFields() { @Override public Optional getCoordinate(int id) { - List values = executeQueryToList(queryForPoint, ps -> ps.setInt(1, id)); + List values = + executeQueryToStream(queryForPoint, ps -> ps.setInt(1, id)).toList(); if (values.isEmpty()) { return Optional.empty(); @@ -122,15 +123,14 @@ public Optional getCoordinate(int id) { public Collection getCoordinates(int... ids) { Object[] idSet = Arrays.stream(ids).boxed().distinct().toArray(); - List values = - executeQueryToList( + return executeQueryToStream( queryForPoints, ps -> { Array sqlArray = ps.getConnection().createArrayOf("int", idSet); ps.setArray(1, sqlArray); - }); - - return values.stream().map(value -> value.coordinate).toList(); + }) + .map(value -> value.coordinate) + .toList(); } @Override @@ -139,12 +139,13 @@ public Optional getId(Point coordinate) { double longitude = coordinate.getX(); List values = - executeQueryToList( - queryForId, - ps -> { - ps.setDouble(1, longitude); - ps.setDouble(2, latitude); - }); + executeQueryToStream( + queryForId, + ps -> { + ps.setDouble(1, longitude); + ps.setDouble(2, latitude); + }) + .toList(); if (values.isEmpty()) { return Optional.empty(); @@ -155,23 +156,21 @@ public Optional getId(Point coordinate) { @Override public Collection getAllCoordinates() { - List values = executeQueryToList(basicQuery + ";", PreparedStatement::execute); - - return values.stream().map(value -> value.coordinate).toList(); + return executeQuerytoStream(basicQuery + ";").map(value -> value.coordinate).toList(); } @Override public List getNearestCoordinates(Point coordinate, int n) { - List values = - executeQueryToList( - queryForNearestPoints, - ps -> { - ps.setDouble(1, coordinate.getX()); - ps.setDouble(2, coordinate.getY()); - ps.setInt(3, n); - }); - - List points = values.stream().map(value -> value.coordinate).toList(); + List points = + executeQueryToStream( + queryForNearestPoints, + ps -> { + ps.setDouble(1, coordinate.getX()); + ps.setDouble(2, coordinate.getY()); + ps.setInt(3, n); + }) + .map(value -> value.coordinate) + .toList(); return calculateCoordinateDistances(coordinate, n, points); } @@ -196,7 +195,7 @@ private List getCoordinatesInBoundingBox( Point coordinate, ComparableQuantity distance) { Envelope envelope = GeoUtils.calculateBoundingBox(coordinate, distance); - return executeQueryToList( + return executeQueryToStream( queryForBoundingBox, ps -> { ps.setDouble(1, envelope.getMinX()); @@ -204,7 +203,6 @@ private List getCoordinatesInBoundingBox( ps.setDouble(3, envelope.getMaxX()); ps.setDouble(4, envelope.getMaxY()); }) - .stream() .map(value -> value.coordinate) .toList(); } @@ -219,9 +217,13 @@ private CoordinateValue createCoordinateValue(Map fieldToValues) return new CoordinateValue(idCoordinate.id(), idCoordinate.point()); } - private List executeQueryToList( + private Stream executeQuerytoStream(String query) { + return dataSource.executeQuery(query).map(this::createCoordinateValue); + } + + private Stream executeQueryToStream( String query, SqlDataSource.AddParams addParams) { - return dataSource.executeQuery(query, addParams).map(this::createCoordinateValue).toList(); + return dataSource.executeQuery(query, addParams).map(this::createCoordinateValue); } /** From 3c7b16738d1b219f6ced445e737f2c80a446ab5a Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 24 Jun 2024 10:34:01 +0200 Subject: [PATCH 021/310] Adding some comments. --- .../models/timeseries/repetitive/LoadProfileInput.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java index fa571d664..d4450568b 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java @@ -35,21 +35,25 @@ public LoadProfileInput(StandardLoadProfile type, Set values) @Override public PValue calc(ZonedDateTime time) { + // dummy value return dayOfWeekToHourlyValues.get(time.getDayOfWeek()).get(time.getHour()); } @Override protected Optional getPreviousDateTime(ZonedDateTime time) { + // dummy value return Optional.of(time.minusHours(1)); } @Override protected Optional getNextDateTime(ZonedDateTime time) { + // dummy value return Optional.of(time.plusHours(1)); } @Override public List getTimeKeysAfter(ZonedDateTime time) { + // dummy value return List.of(time.plusHours(1)); } From a97201b5f10b327dd227ce2ab46835142473382a Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 24 Jun 2024 10:40:30 +0200 Subject: [PATCH 022/310] Adding some comments. --- .../ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java index bba31d23b..ba1ade212 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java @@ -255,11 +255,13 @@ private String createQueryStringForTimeInterval(ClosedInterval ti } private String createQueryStringForTimeKeysAfter(ZonedDateTime time) { + // this could be more efficient with fetching only the coordinate column return BASIC_QUERY_STRING + WHERE + createTimeConstraintAfter(time); } private String createQueryStringForTimeKeysAfterWithCoordinate( ZonedDateTime time, int coordinateId) { + // this could be more efficient with fetching only the coordinate column return BASIC_QUERY_STRING + WHERE + createCoordinateConstraintString(coordinateId) From fcf58c7c029dc1c043ccb20d1c7386c0cf7141d9 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 24 Jun 2024 10:45:28 +0200 Subject: [PATCH 023/310] Adding some comments. --- src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java index 3b5ca4783..86122a69a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java @@ -181,6 +181,7 @@ protected Stream> executeQuery(String query, AddParams addPa addParams.addParams(ps); // don't work with `try with resource`, therefore manual closing is necessary + // closes automatically after all dependent resultSets are closed ps.closeOnCompletion(); return connector.toStream(ps, 1000); From b998e539243f26349be8dda1fd93f06b0a474111 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 24 Jun 2024 12:52:19 +0200 Subject: [PATCH 024/310] Adapt to changes. --- CHANGELOG.md | 2 +- .../edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf27fa794..f86d544d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed `MappingEntryies` not getting processed by adding `Getter` methods for record fields [#1084](https://github.com/ie3-institute/PowerSystemDataModel/issues/1084) - Fixed "depth of discharge" in documentation [#872](https://github.com/ie3-institute/PowerSystemDataModel/issues/872) -- Fixed project beiing build twice in CI [#994](https://github.com/ie3-institute/PowerSystemDataModel/issues/994) +- Fixed project being build twice in CI [#994](https://github.com/ie3-institute/PowerSystemDataModel/issues/994) ### Changed - Improvements to the search for corner points in `IdCoordinateSource` [#1016](https://github.com/ie3-institute/PowerSystemDataModel/issues/1016) diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java index 3ac10c3ad..c75e8b949 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java @@ -23,10 +23,7 @@ import java.sql.Timestamp; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 334d50ec50b5b5fdcd0974fc55115128ac96b777 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Mon, 24 Jun 2024 13:26:27 +0200 Subject: [PATCH 025/310] snapshot version --- version.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/version.properties b/version.properties index f9c849a07..18a1ed5d0 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ #Generated by the Semver Plugin for Gradle -#Mon Jun 24 12:43:47 CEST 2024 +#Mon Jun 24 13:26:11 CEST 2024 version.buildmeta= -version.major=5 -version.minor=1 +version.major=6 +version.minor=0 version.patch=0 version.prerelease= -version.semver=5.1.0 +version.semver=6.0.0 From 31011662ff7340497f266366ee1c5a0640423fd5 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 24 Jun 2024 13:47:59 +0200 Subject: [PATCH 026/310] Update `CHANGELOG`. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed657802b..9a9716641 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Changed +- Improving usage of streams on sql fetches [#827](https://github.com/ie3-institute/PowerSystemDataModel/issues/827) ## [5.1.0] - 2024-06-24 @@ -30,7 +31,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Refactor `CsvFileConnector` and `CsvDataSource` [#1007](https://github.com/ie3-institute/PowerSystemDataModel/issues/1007) - Make `EntitySource` completely static [#975](https://github.com/ie3-institute/PowerSystemDataModel/issues/975) - Abstract commonly used functionality from `EntitySource` [#981](https://github.com/ie3-institute/PowerSystemDataModel/issues/981) -- Improving usage of streams on sql fetches [#827](https://github.com/ie3-institute/PowerSystemDataModel/issues/827) ## [5.0.1] - 2024-03-07 From f7ce1368183a43ef31f7b55989bfe7f9ff3b9db1 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 24 Jun 2024 13:48:56 +0200 Subject: [PATCH 027/310] Update `CHANGELOG`. --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 107eb5c8e..421eb843d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased/Snapshot] ### Added +- Enhance `TimeSeriesSource` with method to retrieve all time keys after a given key [#543](https://github.com/ie3-institute/PowerSystemDataModel/issues/543) +- Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) ### Fixed @@ -19,8 +21,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ConnectorValidationUtils` checks if parallel devices is > 0 [#1077](https://github.com/ie3-institute/PowerSystemDataModel/issues/1077) - `GridContainerValidationUtils` checks the connectivity for all defined operation time intervals [#1091](https://github.com/ie3-institute/PowerSystemDataModel/issues/1091) - Implemented a `CongestionResult` [#1097](https://github.com/ie3-institute/PowerSystemDataModel/issues/1097) -- Enhance `TimeSeriesSource` with method to retrieve all time keys after a given key [#543](https://github.com/ie3-institute/PowerSystemDataModel/issues/543) -- Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) ### Fixed - Fixed `MappingEntryies` not getting processed by adding `Getter` methods for record fields [#1084](https://github.com/ie3-institute/PowerSystemDataModel/issues/1084) From 9dc572a2523ebaace4f85aee7176fabdc3a21a26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Jun 2024 09:44:52 +0000 Subject: [PATCH 028/310] Bump org.junit.jupiter:junit-jupiter from 5.10.2 to 5.10.3 (#1110) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3a97a0b6a..a277cc41d 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.14.17' // Mocks of classes From 15d97ccb0f2590fd42b93dfc029106fbda2a3c6b Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Mon, 1 Jul 2024 08:06:51 +0200 Subject: [PATCH 029/310] replace UniqueEntity --- src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 59fe40c1f..06510927d 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -164,7 +164,7 @@ public void persist(C entity, DbGridMetadata identifier) * @param identifier identifier of the grid * @throws SQLException */ - public void persistIgnoreNested(C entity, DbGridMetadata identifier) + public void persistIgnoreNested(C entity, DbGridMetadata identifier) throws SQLException { insert(entity, identifier); } From d77e478f2bb81212eae906dc5dd7e23d6c879ebb Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Mon, 1 Jul 2024 08:07:35 +0200 Subject: [PATCH 030/310] Main Method --- src/main/java/edu/ie3/datamodel/Main.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/edu/ie3/datamodel/Main.java diff --git a/src/main/java/edu/ie3/datamodel/Main.java b/src/main/java/edu/ie3/datamodel/Main.java new file mode 100644 index 000000000..f1daddcc6 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/Main.java @@ -0,0 +1,21 @@ +package edu.ie3.datamodel; + +import edu.ie3.datamodel.exceptions.EntityProcessorException; +import edu.ie3.datamodel.exceptions.ProcessorProviderException; +import edu.ie3.datamodel.io.SqlUtils; +import edu.ie3.datamodel.models.input.system.type.StorageTypeInput; + +public class Main { + public static void main(String[] args) { + try { + System.out.println(SqlUtils.queryCreateTableUniqueEntity( + StorageTypeInput.class, + "public" + )); + } catch (EntityProcessorException e) { + throw new RuntimeException(e); + } catch (ProcessorProviderException e) { + throw new RuntimeException(e); + } + } +} From 1623d7fce7bb8f387e07fa82f24712944d974c3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 08:50:32 +0000 Subject: [PATCH 031/310] Bump org.apache.groovy:groovy from 4.0.21 to 4.0.22 (#1111) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a277cc41d..e39a59206 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ ext { //version (changing these should be considered thoroughly!) javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" - groovyBinaryVersion = "4.0.21" + groovyBinaryVersion = "4.0.22" testcontainersVersion = '1.19.8' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins From e2efdd9d5c24c2c82037c5bd477adecd6132fd10 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 1 Jul 2024 12:51:44 +0200 Subject: [PATCH 032/310] Improving error message when using the outdated csv format --- CHANGELOG.md | 2 ++ .../edu/ie3/datamodel/io/source/csv/CsvDataSource.java | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083590698..b929ed3b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Changed +- Improving error message when using the outdated csv format [#1112](https://github.com/ie3-institute/PowerSystemDataModel/issues/1112) + ## [5.1.0] - 2024-06-24 diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 3232f2a24..21cd53ce2 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -168,6 +168,14 @@ protected Map buildFieldsToAttributes( try { String[] fieldVals = parseCsvRow(csvRow, csvSep); + + if (fieldVals.length > headline.length) { + throw new SourceException( + "The size of the fields is greater than the size of the headline. This can happen when using the old" + + " and now unsupported csv input format! Please refer to the docs to find the way to convert the" + + " input data into the new input format."); + } + insensitiveFieldsToAttributes.putAll( IntStream.range(0, fieldVals.length) .boxed() From 6b13e7353c6364f6f0b00c30f184e1768ce19033 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 1 Jul 2024 14:44:37 +0200 Subject: [PATCH 033/310] Improving log message. --- .../java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 21cd53ce2..26e348591 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -197,9 +197,9 @@ protected Map buildFieldsToAttributes( + csvSep + "') and does the number of columns match the number of headline fields?"); } - } catch (Exception e) { + } catch (SourceException e) { log.error( - "Cannot build fields to attributes map for row '{}' with headline '{}'.\nException: {}", + "Cannot build fields to attributes map for row '{}' with headline '{}'.", csvRow.trim(), String.join(",", headline), e); From 6667c3d0e8a1d9861c5b821511bb2597bc5d9076 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Tue, 2 Jul 2024 11:51:49 +0200 Subject: [PATCH 034/310] Code Cleaning --- src/main/java/edu/ie3/datamodel/Main.java | 24 +-- .../edu/ie3/datamodel/io/DbGridMetadata.java | 3 +- .../java/edu/ie3/datamodel/io/IoUtil.java | 14 -- .../java/edu/ie3/datamodel/io/SqlUtils.java | 11 +- .../datamodel/io/connectors/SqlConnector.java | 16 +- .../io/naming/DatabaseNamingStrategy.java | 2 +- .../ie3/datamodel/io/processor/Processor.java | 1 - .../io/processor/ProcessorProvider.java | 4 +- .../edu/ie3/datamodel/io/sink/SqlSink.java | 169 +++++++----------- .../io/source/sql/SqlDataSource.java | 2 - .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 30 ++-- .../ie3/test/common/TimeSeriesTestData.groovy | 1 - .../datamodel/io/source/sql/_types/types.sql | 2 +- 13 files changed, 112 insertions(+), 167 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/Main.java b/src/main/java/edu/ie3/datamodel/Main.java index f1daddcc6..28224b428 100644 --- a/src/main/java/edu/ie3/datamodel/Main.java +++ b/src/main/java/edu/ie3/datamodel/Main.java @@ -1,3 +1,8 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ package edu.ie3.datamodel; import edu.ie3.datamodel.exceptions.EntityProcessorException; @@ -6,16 +11,13 @@ import edu.ie3.datamodel.models.input.system.type.StorageTypeInput; public class Main { - public static void main(String[] args) { - try { - System.out.println(SqlUtils.queryCreateTableUniqueEntity( - StorageTypeInput.class, - "public" - )); - } catch (EntityProcessorException e) { - throw new RuntimeException(e); - } catch (ProcessorProviderException e) { - throw new RuntimeException(e); - } + public static void main(String[] args) { + try { + System.out.println(SqlUtils.queryCreateTableUniqueEntity(StorageTypeInput.class, "public")); + } catch (EntityProcessorException e) { + throw new RuntimeException(e); + } catch (ProcessorProviderException e) { + throw new RuntimeException(e); } + } } diff --git a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java index 29df2bd90..2a2d0d72c 100644 --- a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java +++ b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io; -import static edu.ie3.datamodel.io.IoUtil.quote; +import static edu.ie3.datamodel.io.SqlUtils.quote; import java.util.UUID; import java.util.stream.Stream; @@ -21,6 +21,7 @@ public String toString() { return GRID_NAME + "=" + gridName + ", " + GRID_UUID + "=" + uuid.toString(); } + /** @return Stream with grid uuid */ public Stream getStreamForQuery() { return Stream.of(quote(uuid.toString(), "'")); } diff --git a/src/main/java/edu/ie3/datamodel/io/IoUtil.java b/src/main/java/edu/ie3/datamodel/io/IoUtil.java index 9f9f12a74..0968b4f28 100644 --- a/src/main/java/edu/ie3/datamodel/io/IoUtil.java +++ b/src/main/java/edu/ie3/datamodel/io/IoUtil.java @@ -7,8 +7,6 @@ import java.io.File; import java.nio.file.Path; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.Optional; public class IoUtil { @@ -51,16 +49,4 @@ public static Path harmonizeFileSeparator(Path path) { public static Optional pathOption(String in) { return Optional.of(Path.of(in)); } - - public String timeFormatter(ZonedDateTime time, String timePattern) { - return time.format(DateTimeFormatter.ofPattern(timePattern)); - } - - public static String quote(String input, String quoteSymbol) { - if (input == "") { - return "NULL"; - } else { - return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; - } - } } diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index 1c40edea4..df884258b 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -12,10 +12,10 @@ import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; import edu.ie3.datamodel.io.processor.ProcessorProvider; import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.UniqueEntity; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; import org.slf4j.Logger; @@ -43,8 +43,7 @@ public static String queryCreateGridTable(String schemaName) { } /** @return query to create a SQL table for an unique entity */ - public static String queryCreateTableUniqueEntity( - Class cls, String schemaName) + public static String queryCreateTableUniqueEntity(Class cls, String schemaName) throws EntityProcessorException, ProcessorProviderException { ProcessorProvider processorProvider = new ProcessorProvider(); DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); @@ -75,7 +74,7 @@ public static String queryCreateTableUniqueEntity( * @return Map column name -> data type */ public static Map columnToSqlDataType() { - HashMap map = new HashMap(); + Map map = new HashMap<>(); map.put("uuid", "uuid PRIMARY KEY"); map.put("time_series", "uuid NOT NULL"); @@ -181,7 +180,7 @@ public static Map columnToSqlDataType() { map.put("opex", "double precision NOT NULL"); map.put("active_power_gradient", "double precision NOT NULL"); - // not all data types are implemented + // TODO: Not all data types are implemented return map; } @@ -192,7 +191,7 @@ public static Map columnToSqlDataType() { * @return input with quoteSymbol */ public static String quote(String input, String quoteSymbol) { - if (input == "") { + if (Objects.equals(input, "")) { return "NULL"; } else { return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index f43ff8f8b..b25d751ef 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -156,11 +156,19 @@ public Map extractFieldMap(ResultSet rs) { return insensitiveFieldsToAttributes; } + /** + * Executes a query to check if a table exists + * + * @param tableName Name of the table, that should be checked + * @return True, if the table exists + */ public boolean tableExistsSQL(String tableName) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement("SELECT count(*) " - + "FROM information_schema.tables " - + "WHERE table_name = ?" - + "LIMIT 1;"); + PreparedStatement preparedStatement = + connection.prepareStatement( + "SELECT count(*) " + + "FROM information_schema.tables " + + "WHERE table_name = ?" + + "LIMIT 1;"); preparedStatement.setString(1, tableName); ResultSet resultSet = preparedStatement.executeQuery(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 5e85512f8..b3b35172b 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -8,12 +8,12 @@ import static edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy.logger; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import edu.ie3.datamodel.models.value.Value; -import edu.ie3.datamodel.models.Entity; import java.util.Optional; /** A naming strategy for database entities */ diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index e8cce1ba7..faf79daa8 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -24,7 +24,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import javax.measure.Quantity; diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 7064107f7..58cad7354 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -78,8 +78,8 @@ Try, ProcessorProviderException> handleEntity(T en .transformF(ProcessorProviderException::new)); } - public Set> handleEntities( - List entities) throws ProcessorProviderException { + public Set> handleEntities(List entities) + throws ProcessorProviderException { Set setOfEntities = new HashSet<>(entities); Set> setOfMaps = new HashSet<>(); for (T entity : setOfEntities) { diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 06510927d..7d9e224a1 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -18,7 +18,6 @@ import edu.ie3.datamodel.io.processor.ProcessorProvider; import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.input.*; import edu.ie3.datamodel.models.input.connector.*; import edu.ie3.datamodel.models.input.container.GraphicElements; @@ -83,28 +82,25 @@ public void shutdown() { * @param identifier identifier of the grid * @param bounded to be all unique entities. Handling of specific entities is normally then * executed by a specific {@link EntityProcessor} - * @throws SQLException */ - public void persistAll(Collection entities, DbGridMetadata identifier) - throws SQLException { + public void persistAll(Collection entities, DbGridMetadata identifier) { // Extract nested entities and add them to the set of entities Set entitiesToAdd = new HashSet<>(entities); // entities to persist - entities.stream() - .forEach( - entity -> { - if (entity instanceof NestedEntity nestedEntity) { - try { - entitiesToAdd.addAll( - (List) Extractor.extractElements(nestedEntity).stream().toList()); - } catch (ExtractorException e) { - log.error( - String.format( - "An error occurred during extraction of nested entity'%s': ", - entity.getClass()), - e); - } - } - }); + entities.forEach( + entity -> { + if (entity instanceof NestedEntity nestedEntity) { + try { + entitiesToAdd.addAll( + (List) Extractor.extractElements(nestedEntity).stream().toList()); + } catch (ExtractorException e) { + log.error( + String.format( + "An error occurred during extraction of nested entity'%s': ", + entity.getClass()), + e); + } + } + }); // Persist the entities in hierarchic order to avoid failure because of foreign keys for (Class cls : hierarchicInsert()) { @@ -116,24 +112,12 @@ public void persistAll(Collection entities, DbGridMetadata entitiesToAdd.removeIf( ent -> cls.isAssignableFrom( - ent.getClass())); // maybe it's not necessary but I'm not sure if there are + ent.getClass())); // maybe it's not necessary, but I'm not sure if there are // entities who aren't in the hierarchic structure } persistMixedList(new ArrayList<>(entitiesToAdd), identifier); // persist left entities } - /** - * Persist multiple input entities in a collection. In contrast to {@link SqlSink#persistAll} this - * function does not extract nested entities. - * - * @param entities a collection of entities that should be persisted - * @param identifier identifier of the grid - */ - public void persistAllIgnoreNested( - Collection entities, DbGridMetadata identifier) { - persistMixedList(new ArrayList<>(entities), identifier); - } - /** * Persist an entity. By default this method take care about the extraction process of nested * entities (if any) @@ -142,8 +126,7 @@ public void persistAllIgnoreNested( * @param identifier identifier of the grid * @throws SQLException */ - public void persist(C entity, DbGridMetadata identifier) - throws SQLException { + public void persist(C entity, DbGridMetadata identifier) throws SQLException { if (entity instanceof InputEntity inputEntity) { persistIncludeNested(inputEntity, identifier); } else if (entity instanceof ResultEntity resultEntity) { @@ -162,50 +145,29 @@ public void persist(C entity, DbGridMetadata identifier) * * @param entity the entity that should be persisted * @param identifier identifier of the grid - * @throws SQLException */ public void persistIgnoreNested(C entity, DbGridMetadata identifier) throws SQLException { insert(entity, identifier); } - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - /* - protected void persistListIncludeNested( - List entities, Class cls, DbGridMetadata identifier) throws SQLException { - if (NestedEntity.class.isAssignableFrom(cls)) { - entities.forEach( - entity -> { - try { - List arr = - new ArrayList<>(Extractor.extractElements((NestedEntity) entity)); - persistAll(arr, identifier); - } catch (ExtractorException | SQLException e) { - log.error( - String.format( - "An error occurred during extraction of nested entity'%s': ", - cls.getSimpleName()), - e); - } - }); - insertListIgnoreNested(entities, cls, identifier); - } else { - insertListIgnoreNested(entities, cls, identifier); - } - } - + /** + * Persist an entity and all nested entities. + * + * @param entity the entity that should be persisted + * @param identifier identifier of the grid */ - - public void persistIncludeNested(C entity, DbGridMetadata identifier) - throws SQLException { + public void persistIncludeNested(C entity, DbGridMetadata identifier) { Set entitiesToAdd = new HashSet<>(); entitiesToAdd.add(entity); persistAll(entitiesToAdd, identifier); } - private void persistMixedList( - List entities, DbGridMetadata identifier) { + /** + * Persist a list of entities with different types. To minimize the number of queries, the + * entities will be grouped by their class. + */ + private void persistMixedList(List entities, DbGridMetadata identifier) { Map, List> entitiesPerClass = entities.stream().collect(groupingBy(entity -> (Class) entity.getClass())); entitiesPerClass.forEach( @@ -222,6 +184,10 @@ private void persistMixedList( }); } + /** + * Persist a list of entities with same types. To minimize the number of queries, the entities + * will be grouped by their class. + */ private , V extends Value> void persistList( List entities, Class cls, DbGridMetadata identifier) throws SQLException { // Check if there are only elements of the same class @@ -259,19 +225,24 @@ private , V extends Value> void p * class. */ private void insertListIgnoreNested( - List entities, Class cls, DbGridMetadata identifier, boolean ignoreConflict) throws SQLException { + List entities, Class cls, DbGridMetadata identifier, boolean ignoreConflict) + throws SQLException { try { String[] headerElements = processorProvider.getHeaderElements(cls); String query = basicInsertQueryValuesGrid( schemaName, databaseNamingStrategy.getEntityName(cls).orElseThrow(), headerElements); - query = query + createInsertQueryBodyIgnoreConflict(entities, headerElements, identifier, ignoreConflict); + query = + query + + createInsertQueryBodyIgnoreConflict( + entities, headerElements, identifier, ignoreConflict); connector.executeUpdate(query); } catch (ProcessorProviderException e) { log.error("Exception occurred during processor request: ", e); } } + /** Persist one time series. */ protected , V extends Value> void persistTimeSeries( TimeSeries timeSeries, DbGridMetadata identifier) throws SQLException { try { @@ -288,7 +259,7 @@ protected , V extends Value> void persistTimeSeries private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) - throws ProcessorProviderException, IOException, SQLException { + throws ProcessorProviderException, IOException { try { String query = basicInsertQueryValuesITS( @@ -322,8 +293,8 @@ private , V extends Value> void persistTimeSeries( } } - public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) - throws SQLException { + /** Persists a whole {@link JointGridContainer}. */ + public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) { DbGridMetadata identifier = new DbGridMetadata(jointGridContainer.getGridName(), gridUUID); // get raw grid entities with types or operators @@ -399,12 +370,11 @@ public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUI toAdd.addAll(types); toAdd.addAll(operators); - // persist all entities persistAll(toAdd, identifier); } - private void insert(C entity, DbGridMetadata identifier) - throws SQLException { + /** Executes a query to insert a single entity to a SQL database. */ + private void insert(C entity, DbGridMetadata identifier) throws SQLException { try { String[] headerElements = processorProvider.getHeaderElements(entity.getClass()); String query = @@ -432,38 +402,18 @@ private String createInsertQueryBodyIgnoreConflict( List entities, String[] headerElements, DbGridMetadata identifier, boolean ignoreConflict) throws ProcessorProviderException { Set> entityFieldData = processorProvider.handleEntities(entities); - String queryBody = ""; + String suffix; if (ignoreConflict) { - queryBody = - queryBody - + entityFieldData.stream() - .map(data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)) - .collect(Collectors.joining(",\n", "", "\nON CONFLICT (uuid) DO NOTHING;")); + suffix = "\nON CONFLICT (uuid) DO NOTHING;"; } else { - queryBody = - queryBody - + entityFieldData.stream() - .map(data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)) - .collect(Collectors.joining(",\n", "", ";\n")); + suffix = ";\n"; } - return queryBody; - } - - /** - * Provides the value lists for an insertion query. - * - *

WARNING: It's assumed that all entities are from the same class C. - */ - private String createInsertQueryBody( - List entities, String[] headerElements, DbGridMetadata identifier) - throws ProcessorProviderException { - Set> entityFieldData = processorProvider.handleEntities(entities); String queryBody = ""; queryBody = queryBody + entityFieldData.stream() .map(data -> queryValueLine(sqlEntityFieldData(data), headerElements, identifier)) - .collect(Collectors.joining(",\n", "", ";")); + .collect(Collectors.joining(",\n", "", suffix)); return queryBody; } @@ -519,9 +469,7 @@ private static String basicInsertQuery(String schemaName, String tableName) { /** Provides the insert, column names, grid identifier and the VALUES statement for a query. */ private String basicInsertQueryValuesGrid( String schemaName, String tableName, String[] headerElements) { - String[] addParams = { - DbGridMetadata.GRID_UUID - }; + String[] addParams = {DbGridMetadata.GRID_UUID}; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) @@ -534,10 +482,7 @@ private String basicInsertQueryValuesGrid( */ private String basicInsertQueryValuesITS( String schemaName, String tableName, String[] headerElements) { - String[] addParams = { - DbGridMetadata.GRID_UUID, - TIME_SERIES - }; + String[] addParams = {DbGridMetadata.GRID_UUID, TIME_SERIES}; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) @@ -559,12 +504,23 @@ private String writeOneLine(String[] entries, String[] addParams) { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + /** + * Creates a table for an entity class + * + * @param cls The class for which a table should be created + * @param schemaName Schema name of the database + */ public void createClassTable(Class cls, String schemaName) throws SQLException, ProcessorProviderException, EntityProcessorException { String query = queryCreateTableUniqueEntity(cls, schemaName); connector.executeUpdate(query); } + /** + * Creates a table for a grid + * + * @param schemaName Schema name of the database + */ public void createGridTable(String schemaName) throws SQLException { String query = queryCreateGridTable(schemaName); connector.executeUpdate(query); @@ -581,7 +537,6 @@ private static List> hierarchicInsert() { sortedInsert.add(ConnectorInput.class); // 6a. ConnectorInput sortedInsert.add(SystemParticipantInput.class); // 6b. SystemParticipantInput sortedInsert.add(GraphicInput.class); // 7. GraphicInput - // 8. Rest return sortedInsert; } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java index 576e7dc74..6db92daa0 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java @@ -194,6 +194,4 @@ protected Stream> executeQuery(String query) { public boolean checkExistingTable(String tableName) throws SQLException { return connector.tableExistsSQL(tableName); } - - } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index d8860073f..d0f0a5487 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.io.sink +import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM +import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE +import static tech.units.indriya.unit.Units.PERCENT + import edu.ie3.datamodel.io.DbGridMetadata import edu.ie3.datamodel.io.connectors.SqlConnector import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy @@ -46,29 +50,23 @@ import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.Value import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SampleJointGrid +import edu.ie3.test.common.SystemParticipantTestData import edu.ie3.test.common.ThermalUnitInputTestData import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.test.helper.TestContainerHelper import edu.ie3.util.TimeUtil import org.testcontainers.containers.Container import org.testcontainers.containers.PostgreSQLContainer +import org.testcontainers.spock.Testcontainers import org.testcontainers.utility.MountableFile import spock.lang.Shared import spock.lang.Specification -import org.testcontainers.spock.Testcontainers import tech.units.indriya.quantity.Quantities +import java.sql.SQLException import javax.measure.Quantity import javax.measure.quantity.Power -import edu.ie3.test.common.SystemParticipantTestData - -import java.sql.SQLException - -import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM -import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE -import static tech.units.indriya.unit.Units.PERCENT - @Testcontainers class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeriesTestData { @@ -309,9 +307,9 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri def "A valid SqlSink throws an exception if a nested entity hasn't all of its nested entity."() { given: def sink = new SqlSink( - schemaName, - namingStrategy, - connector) + schemaName, + namingStrategy, + connector) def load = SystemParticipantTestData.loadInput when: @@ -325,14 +323,14 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri def "A valid SqlSink can create a table for entity class."() { given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - def hp = SystemParticipantTestData.hpInput + def sink = new SqlSink(schemaName, namingStrategy, connector) + def hp = SystemParticipantTestData.hpInput when: - sink.createClassTable(hp.getClass(), schemaName) + sink.createClassTable(hp.getClass(), schemaName) then: - sqlSource.checkExistingTable("hp_input") + sqlSource.checkExistingTable("hp_input") } def "A valid SqlSink throws an exception if a grid does not exist."() { given: diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 001bf35b9..18e5030d3 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -11,7 +11,6 @@ import static tech.units.indriya.unit.Units.METRE_PER_SECOND import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.IntValue diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql index 56251bb93..13bb195bf 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql +++ b/src/test/resources/edu/ie3/datamodel/io/source/sql/_types/types.sql @@ -1,6 +1,6 @@ CREATE TABLE public.line_type_input ( - uuid BINARY(16) NOT NULL, + uuid uuid NOT NULL, id varchar NOT NULL, v_rated double precision NOT NULL, i_max double precision NOT NULL, From 6bb4abe329fa42d7f73a5754028dda862a662abb Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Tue, 2 Jul 2024 14:49:07 +0200 Subject: [PATCH 035/310] Code Cleaning --- src/main/java/edu/ie3/datamodel/Main.java | 23 --- .../java/edu/ie3/datamodel/io/SqlUtils.java | 155 ------------------ .../edu/ie3/datamodel/io/sink/SqlSink.java | 22 --- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 11 -- 4 files changed, 211 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/Main.java diff --git a/src/main/java/edu/ie3/datamodel/Main.java b/src/main/java/edu/ie3/datamodel/Main.java deleted file mode 100644 index 28224b428..000000000 --- a/src/main/java/edu/ie3/datamodel/Main.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel; - -import edu.ie3.datamodel.exceptions.EntityProcessorException; -import edu.ie3.datamodel.exceptions.ProcessorProviderException; -import edu.ie3.datamodel.io.SqlUtils; -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput; - -public class Main { - public static void main(String[] args) { - try { - System.out.println(SqlUtils.queryCreateTableUniqueEntity(StorageTypeInput.class, "public")); - } catch (EntityProcessorException e) { - throw new RuntimeException(e); - } catch (ProcessorProviderException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index df884258b..79f286eb5 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -5,19 +5,7 @@ */ package edu.ie3.datamodel.io; -import static edu.ie3.util.StringUtils.camelCaseToSnakeCase; - -import edu.ie3.datamodel.exceptions.EntityProcessorException; -import edu.ie3.datamodel.exceptions.ProcessorProviderException; -import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; -import edu.ie3.datamodel.io.processor.ProcessorProvider; -import edu.ie3.datamodel.models.Entity; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,149 +30,6 @@ public static String queryCreateGridTable(String schemaName) { + endQueryCreateTable; } - /** @return query to create a SQL table for an unique entity */ - public static String queryCreateTableUniqueEntity(Class cls, String schemaName) - throws EntityProcessorException, ProcessorProviderException { - ProcessorProvider processorProvider = new ProcessorProvider(); - DatabaseNamingStrategy namingStrategy = new DatabaseNamingStrategy(); - String[] headerElements = processorProvider.getHeaderElements(cls); - Stream strHeader = - Stream.concat(Arrays.stream(headerElements), Stream.of(DbGridMetadata.GRID_UUID)); - Stream dtHeader = - strHeader.map( - element -> - camelCaseToSnakeCase(element) - + " " - + columnToSqlDataType().get(camelCaseToSnakeCase(element))); - return "CREATE TABLE " - + schemaName - + "." - + namingStrategy.getEntityName(cls).orElseThrow() - + "\n(\n\t" - + String.valueOf(dtHeader.collect(Collectors.joining(",\n\t"))) - + "\n)\n\t" - + "WITHOUT OIDS\n" - + "\t" - + "TABLESPACE pg_default;\n"; - } - - /** - * Map to create a SQL table for an entity with the right data types. - * - * @return Map column name -> data type - */ - public static Map columnToSqlDataType() { - Map map = new HashMap<>(); - - map.put("uuid", "uuid PRIMARY KEY"); - map.put("time_series", "uuid NOT NULL"); - map.put("time", "timestamp with time zone NOT NULL"); - map.put("p", "double precision NOT NULL"); - map.put("q", "double precision NOT NULL"); - map.put("c", "double precision NOT NULL"); - map.put("s_rated", "double precision NOT NULL"); - - map.put("cost_controlled", "bool NOT NULL"); - map.put("feed_in_tariff", "int NOT NULL"); - map.put("id", "TEXT NOT NULL"); - map.put("market_reaction", "bool NOT NULL"); - map.put("node", "uuid NOT NULL"); - map.put("operates_from", "timestamp with time zone"); - map.put("operates_until", "timestamp with time zone"); - map.put("operator", "uuid"); - map.put("q_characteristics", "TEXT NOT NULL"); - map.put("geo_position", "TEXT NOT NULL"); - map.put("length", "double precision NOT NULL"); - map.put("node_a", "uuid NOT NULL"); - map.put("node_b", "uuid NOT NULL"); - map.put("olm_characteristic", "TEXT NOT NULL"); - map.put("parallel_devices", "int NOT NULL"); - map.put("cos_phi_rated", "TEXT NOT NULL"); - map.put("dsm", "bool NOT NULL"); - map.put("e_cons_annual", "double precision NOT NULL"); - map.put("load_profile", "TEXT NOT NULL"); - map.put("controlling_em", "uuid NOT NULL"); - - map.put("auto_tap", "bool NOT NULL"); - map.put("tap_pos", "int NOT NULL"); - map.put("type", "uuid NOT NULL"); - - map.put("v_ang", "bool NOT NULL"); - map.put("v_mag", "bool NOT NULL"); - map.put("slack", "bool NOT NULL"); - map.put("subnet", "int NOT NULL"); - map.put("v_rated", "double precision NOT NULL"); - map.put("v_target", "double precision NOT NULL"); - map.put("volt_lvl", "TEXT NOT NULL"); - map.put("charging_points", "int NOT NULL"); - map.put("location_type", "TEXT NOT NULL"); - map.put("v_2g_support", "bool NOT NULL"); - - map.put("albedo", "double precision NOT NULL"); - map.put("azimuth", "double precision NOT NULL"); - map.put("elevation_angle", "double precision NOT NULL"); - map.put("eta_conv", "double precision NOT NULL"); - map.put("k_g", "double precision NOT NULL"); - map.put("k_t", "double precision NOT NULL"); - - map.put("grid_name", "TEXT NOT NULL"); - map.put("grid_uuid", "uuid NOT NULL"); - - map.put("b_m", "double precision NOT NULL"); - map.put("d_phi", "double precision NOT NULL"); - map.put("d_v", "double precision NOT NULL"); - map.put("g_m", "double precision NOT NULL"); - map.put("r_sc", "double precision NOT NULL"); - map.put("tap_max", "int NOT NULL"); - map.put("tap_min", "int NOT NULL"); - map.put("tap_neutr", "int NOT NULL"); - map.put("tap_side", "bool NOT NULL"); - map.put("v_rated_a", "int NOT NULL"); - map.put("v_rated_b", "int NOT NULL"); - map.put("x_sc", "int NOT NULL"); - map.put("graphic_layer", "TEXT NOT NULL"); - map.put("line", "uuid NOT NULL"); - map.put("path", "TEXT NOT NULL"); - map.put("point", "TEXT NOT NULL"); - map.put("inlet_temp", "double precision NOT NULL"); - map.put("return_temp", "double precision NOT NULL"); - map.put("storage_volume_lvl", "double precision NOT NULL"); - map.put("storage_volume_lvl_min", "double precision NOT NULL"); - map.put("thermal_bus", "uuid NOT NULL"); - map.put("eth_capa", "double precision NOT NULL"); - map.put("eth_losses", "double precision NOT NULL"); - map.put("lower_temperature_limit", "double precision NOT NULL"); - map.put("target_temperature", "double precision NOT NULL"); - map.put("upper_temperature_limit", "double precision NOT NULL"); - map.put("b", "double precision NOT NULL"); - map.put("g", "double precision NOT NULL"); - map.put("i_max", "double precision NOT NULL"); - map.put("r", "double precision NOT NULL"); - map.put("x", "double precision NOT NULL"); - - map.put("connected_assets", "TEXT NOT NULL"); - map.put("capex", "double precision NOT NULL"); - map.put("control_strategy", "TEXT NOT NULL"); - - map.put("input_model", "uuid NOT NULL"); - map.put("soc", "double precision NOT NULL"); - map.put("p_max", "double precision NOT NULL"); - map.put("p_min", "double precision NOT NULL"); - map.put("p_ref", "double precision NOT NULL"); - - map.put("dod", "double precision NOT NULL"); - map.put("e_storage", "double precision NOT NULL"); - map.put("eta", "double precision NOT NULL"); - map.put("life_cycle", "double precision NOT NULL"); - map.put("life_time", "double precision NOT NULL"); - map.put("opex", "double precision NOT NULL"); - map.put("active_power_gradient", "double precision NOT NULL"); - - // TODO: Not all data types are implemented - - return map; - } - /** * To avoid data type conflicts while insertion into a SQL table all columns should be quoted. * diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 7d9e224a1..d153ef12f 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -504,28 +504,6 @@ private String writeOneLine(String[] entries, String[] addParams) { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - /** - * Creates a table for an entity class - * - * @param cls The class for which a table should be created - * @param schemaName Schema name of the database - */ - public void createClassTable(Class cls, String schemaName) - throws SQLException, ProcessorProviderException, EntityProcessorException { - String query = queryCreateTableUniqueEntity(cls, schemaName); - connector.executeUpdate(query); - } - - /** - * Creates a table for a grid - * - * @param schemaName Schema name of the database - */ - public void createGridTable(String schemaName) throws SQLException { - String query = queryCreateGridTable(schemaName); - connector.executeUpdate(query); - } - /** @return insertion order for unique entities */ private static List> hierarchicInsert() { List> sortedInsert = new ArrayList<>(); diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index d0f0a5487..3147ba2ab 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -321,17 +321,6 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\"." } - def "A valid SqlSink can create a table for entity class."() { - given: - def sink = new SqlSink(schemaName, namingStrategy, connector) - def hp = SystemParticipantTestData.hpInput - - when: - sink.createClassTable(hp.getClass(), schemaName) - - then: - sqlSource.checkExistingTable("hp_input") - } def "A valid SqlSink throws an exception if a grid does not exist."() { given: def sink = new SqlSink(schemaName, namingStrategy, connector) From f62a10d1cd663defd9e43b90b32cadd6456ed8cd Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Tue, 2 Jul 2024 15:31:23 +0200 Subject: [PATCH 036/310] SQL Caps --- .../edu/ie3/datamodel/io/sink/_sql/grids.sql | 2 +- .../datamodel/io/sink/_sql/input_entities.sql | 216 +++++++++--------- .../datamodel/io/sink/_sql/load_profile.sql | 6 +- .../io/sink/_sql/result_entities.sql | 64 +++--- .../datamodel/io/sink/_sql/sql_test_data.sql | 8 +- .../datamodel/io/sink/_sql/time_series.sql | 72 +++--- .../edu/ie3/datamodel/io/sink/_sql/types.sql | 64 +++--- 7 files changed, 216 insertions(+), 216 deletions(-) diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql index 466aad358..4ba8069a0 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/grids.sql @@ -1,6 +1,6 @@ CREATE TABLE public.grids ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, name TEXT NOT NULL ) WITHOUT OIDS diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index 0671b350e..f53c01c27 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -1,228 +1,228 @@ CREATE TABLE public.node_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, geo_position TEXT NOT NULL, id TEXT NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, - slack bool NOT NULL, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, + slack BOOL NOT NULL, subnet int NOT NULL, - v_rated double precision NOT NULL, - v_target double precision NOT NULL, + v_rated DOUBLE PRECISION NOT NULL, + v_target DOUBLE PRECISION NOT NULL, volt_lvl TEXT NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.transformer_2_w_input ( - uuid uuid PRIMARY KEY, - auto_tap bool NOT NULL, + uuid UUID PRIMARY KEY, + auto_tap BOOL NOT NULL, id TEXT NOT NULL, - node_a uuid NOT NULL REFERENCES node_input(uuid), - node_b uuid NOT NULL REFERENCES node_input(uuid), - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, + node_a UUID NOT NULL REFERENCES node_input(uuid), + node_b UUID NOT NULL REFERENCES node_input(uuid), + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, parallel_devices int NOT NULL, tap_pos int NOT NULL, - type uuid NOT NULL REFERENCES transformer_2_w_type_input(uuid), - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + type UUID NOT NULL REFERENCES transformer_2_w_type_input(uuid), + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.evcs_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, charging_points int NOT NULL, - controlling_em uuid, + controlling_em UUID, cos_phi_rated TEXT NOT NULL, id TEXT NOT NULL, location_type TEXT NOT NULL, - node uuid NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, + node UUID NOT NULL, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, q_characteristics TEXT NOT NULL, type TEXT NOT NULL, - v_2g_support bool NOT NULL, - grid_uuid uuid NOT NULL + v_2g_support BOOL NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.line_graphic_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, graphic_layer TEXT NOT NULL, - line uuid NOT NULL, + line UUID NOT NULL, path TEXT, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.node_graphic_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, graphic_layer TEXT NOT NULL, - node uuid NOT NULL, + node UUID NOT NULL, path TEXT, point TEXT NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.cylindrical_storage_input ( - uuid uuid PRIMARY KEY, - c double precision NOT NULL, + uuid UUID PRIMARY KEY, + c DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - inlet_temp double precision NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, - return_temp double precision NOT NULL, - storage_volume_lvl double precision NOT NULL, - storage_volume_lvl_min double precision NOT NULL, - thermal_bus uuid NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + inlet_temp DOUBLE PRECISION NOT NULL, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, + return_temp DOUBLE PRECISION NOT NULL, + storage_volume_lvl DOUBLE PRECISION NOT NULL, + storage_volume_lvl_min DOUBLE PRECISION NOT NULL, + thermal_bus UUID NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.thermal_house_input ( - uuid uuid PRIMARY KEY, - eth_capa double precision NOT NULL, - eth_losses double precision NOT NULL, + uuid UUID PRIMARY KEY, + eth_capa DOUBLE PRECISION NOT NULL, + eth_losses DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - lower_temperature_limit double precision NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, - target_temperature double precision NOT NULL, - thermal_bus uuid NOT NULL, - upper_temperature_limit double precision NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + lower_temperature_limit DOUBLE PRECISION NOT NULL, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, + target_temperature DOUBLE PRECISION NOT NULL, + thermal_bus UUID NOT NULL, + upper_temperature_limit DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.operator_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, id TEXT NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.line_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, geo_position TEXT NOT NULL, id TEXT NOT NULL, - length double precision NOT NULL, - node_a uuid NOT NULL, - node_b uuid NOT NULL, + length DOUBLE PRECISION NOT NULL, + node_a UUID NOT NULL, + node_b UUID NOT NULL, olm_characteristic TEXT NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, parallel_devices int NOT NULL, - type uuid NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + type UUID NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.thermal_bus_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, id TEXT NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.load_input ( - uuid uuid PRIMARY KEY, - controlling_em uuid NOT NULL, + uuid UUID PRIMARY KEY, + controlling_em UUID NOT NULL, cos_phi_rated TEXT NOT NULL, - dsm bool NOT NULL, - e_cons_annual double precision NOT NULL, + dsm BOOL NOT NULL, + e_cons_annual DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, load_profile TEXT NOT NULL, - node uuid NOT NULL REFERENCES node_input(uuid), - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, + node UUID NOT NULL REFERENCES node_input(uuid), + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, q_characteristics TEXT NOT NULL, - s_rated double precision NOT NULL, - grid_uuid uuid NOT NULL + s_rated DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.em_input ( - uuid uuid PRIMARY KEY, + uuid UUID PRIMARY KEY, control_strategy TEXT NOT NULL, - controlling_em uuid, + controlling_em UUID, id TEXT NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, - grid_uuid uuid NOT NULL + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.pv_input ( - uuid uuid PRIMARY KEY, - albedo double precision NOT NULL, - azimuth double precision NOT NULL, - controlling_em uuid, + uuid UUID PRIMARY KEY, + albedo DOUBLE PRECISION NOT NULL, + azimuth DOUBLE PRECISION NOT NULL, + controlling_em UUID, cos_phi_rated TEXT NOT NULL, - elevation_angle double precision NOT NULL, - eta_conv double precision NOT NULL, + elevation_angle DOUBLE PRECISION NOT NULL, + eta_conv DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - k_g double precision NOT NULL, - k_t double precision NOT NULL, - market_reaction bool NOT NULL, - node uuid NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, + k_g DOUBLE PRECISION NOT NULL, + k_t DOUBLE PRECISION NOT NULL, + market_reaction BOOL NOT NULL, + node UUID NOT NULL, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, q_characteristics TEXT NOT NULL, - s_rated double precision NOT NULL, - grid_uuid uuid NOT NULL + s_rated DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.storage_input ( - uuid uuid PRIMARY KEY, - controlling_em uuid NOT NULL, + uuid UUID PRIMARY KEY, + controlling_em UUID NOT NULL, id TEXT NOT NULL, - node uuid NOT NULL, - operates_from timestamp with time zone, - operates_until timestamp with time zone, - operator uuid, + node UUID NOT NULL, + operates_from TIMESTAMP WITH TIME ZONE, + operates_until TIMESTAMP WITH TIME ZONE, + operator UUID, q_characteristics TEXT NOT NULL, - type uuid NOT NULL, - grid_uuid uuid NOT NULL + type UUID NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql index 3ef2160f7..474be75de 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql @@ -1,10 +1,10 @@ CREATE TABLE public.load_profile_g2 ( - time_series uuid NOT NULL, + time_series UUID NOT NULL, day_of_week TEXT NOT NULL, quarter_hour_of_day TEXT NOT NULL, - p double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + p DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql index 208f1f655..a924203fc 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/result_entities.sql @@ -1,67 +1,67 @@ CREATE TABLE public.pv_res ( - input_model uuid NOT NULL, - p double precision NOT NULL, - q double precision NOT NULL, - time timestamp with time zone NOT NULL, - grid_uuid uuid NOT NULL + input_model UUID NOT NULL, + p DOUBLE PRECISION NOT NULL, + q DOUBLE PRECISION NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.wec_res ( - input_model uuid NOT NULL, - p double precision NOT NULL, - q double precision NOT NULL, - time timestamp with time zone NOT NULL, - grid_uuid uuid NOT NULL + input_model UUID NOT NULL, + p DOUBLE PRECISION NOT NULL, + q DOUBLE PRECISION NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.ev_res ( - input_model uuid NOT NULL, - p double precision NOT NULL, - q double precision NOT NULL, - soc double precision NOT NULL, - time timestamp with time zone NOT NULL, - grid_uuid uuid NOT NULL + input_model UUID NOT NULL, + p DOUBLE PRECISION NOT NULL, + q DOUBLE PRECISION NOT NULL, + soc DOUBLE PRECISION NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.evcs_res ( - input_model uuid NOT NULL, - p double precision NOT NULL, - q double precision NOT NULL, - time timestamp with time zone NOT NULL, - grid_uuid uuid NOT NULL + input_model UUID NOT NULL, + p DOUBLE PRECISION NOT NULL, + q DOUBLE PRECISION NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.em_res ( - input_model uuid NOT NULL, - p double precision NOT NULL, - q double precision NOT NULL, - time timestamp with time zone NOT NULL, - grid_uuid uuid NOT NULL + input_model UUID NOT NULL, + p DOUBLE PRECISION NOT NULL, + q DOUBLE PRECISION NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.flex_options_res ( - input_model uuid NOT NULL, - p_max double precision NOT NULL, - p_min double precision NOT NULL, - p_ref double precision NOT NULL, - time timestamp with time zone NOT NULL, - grid_uuid uuid NOT NULL + input_model UUID NOT NULL, + p_max DOUBLE PRECISION NOT NULL, + p_min DOUBLE PRECISION NOT NULL, + p_ref DOUBLE PRECISION NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql index a5cb071e5..5a329811c 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql @@ -1,9 +1,9 @@ CREATE TABLE public.test_data_sql ( - uuid uuid PRIMARY KEY, - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - p double precision NOT NULL + uuid UUID PRIMARY KEY, + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + p DOUBLE PRECISION NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql index be58fda6a..cdceb0e52 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql @@ -1,9 +1,9 @@ CREATE TABLE public.time_series_c ( - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - price double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + price DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -17,10 +17,10 @@ CREATE UNIQUE INDEX time_series_c_series_time ON time_series_c USING btree (time CREATE TABLE public.time_series_p ( - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - p double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + p DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -31,11 +31,11 @@ CREATE UNIQUE INDEX time_series_p_series_time ON time_series_p USING btree (time CREATE TABLE public.time_series_pq ( - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - p double precision, - q double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + p DOUBLE PRECISION, + q DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -46,10 +46,10 @@ CREATE UNIQUE INDEX time_series_pq_series_time ON time_series_pq USING btree (ti CREATE TABLE public.time_series_h ( - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - heat_demand double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + heat_demand DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -60,11 +60,11 @@ CREATE UNIQUE INDEX time_series_h_series_time ON time_series_h USING btree (time CREATE TABLE public.time_series_ph ( - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - p double precision, - heat_demand double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + p DOUBLE PRECISION, + heat_demand DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -75,12 +75,12 @@ CREATE UNIQUE INDEX time_series_ph_series_time ON time_series_ph USING btree (ti CREATE TABLE public.time_series_pqh ( - time_series uuid NOT NULL, - time timestamp with time zone NOT NULL, - p double precision, - q double precision, - heat_demand double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time_series UUID NOT NULL, + time TIMESTAMP WITH TIME ZONE NOT NULL, + p DOUBLE PRECISION, + q DOUBLE PRECISION, + heat_demand DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; @@ -91,15 +91,15 @@ CREATE UNIQUE INDEX time_series_pqh_series_time ON time_series_pqh USING btree ( CREATE TABLE public.time_series_weather ( - time_series uuid NOT NULL, + time_series UUID NOT NULL, coordinate TEXT NOT NULL, - time timestamp with time zone NOT NULL, - diffuse_irradiance double precision, - direct_irradiance double precision, - direction double precision, - temperature double precision, - velocity double precision, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + time TIMESTAMP WITH TIME ZONE NOT NULL, + diffuse_irradiance DOUBLE PRECISION, + direct_irradiance DOUBLE PRECISION, + direction DOUBLE PRECISION, + temperature DOUBLE PRECISION, + velocity DOUBLE PRECISION, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql index cddf9f995..03efd5342 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/types.sql @@ -1,54 +1,54 @@ CREATE TABLE public.transformer_2_w_type_input ( - uuid uuid PRIMARY KEY, - b_m double precision NOT NULL, - d_phi double precision NOT NULL, - d_v double precision NOT NULL, - g_m double precision NOT NULL, + uuid UUID PRIMARY KEY, + b_m DOUBLE PRECISION NOT NULL, + d_phi DOUBLE PRECISION NOT NULL, + d_v DOUBLE PRECISION NOT NULL, + g_m DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - r_sc double precision NOT NULL, - s_rated double precision NOT NULL, - tap_max int NOT NULL, - tap_min int NOT NULL, - tap_neutr int NOT NULL, - tap_side bool NOT NULL, - v_rated_a double precision NOT NULL, - v_rated_b double precision NOT NULL, - x_sc double precision NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + r_sc DOUBLE PRECISION NOT NULL, + s_rated DOUBLE PRECISION NOT NULL, + tap_max INT NOT NULL, + tap_min INT NOT NULL, + tap_neutr INT NOT NULL, + tap_side BOOL NOT NULL, + v_rated_a DOUBLE PRECISION NOT NULL, + v_rated_b DOUBLE PRECISION NOT NULL, + x_sc DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.line_type_input ( - uuid uuid PRIMARY KEY, - b double precision NOT NULL, - g double precision NOT NULL, - i_max double precision NOT NULL, + uuid UUID PRIMARY KEY, + b DOUBLE PRECISION NOT NULL, + g DOUBLE PRECISION NOT NULL, + i_max DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - r double precision NOT NULL, - v_rated double precision NOT NULL, - x double precision NOT NULL, + r DOUBLE PRECISION NOT NULL, + v_rated DOUBLE PRECISION NOT NULL, + x DOUBLE PRECISION NOT NULL, - grid_uuid uuid NOT NULL REFERENCES grids(uuid) + grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS TABLESPACE pg_default; CREATE TABLE public.storage_type_input ( - uuid uuid PRIMARY KEY, - active_power_gradient double precision NOT NULL, - capex double precision NOT NULL, + uuid UUID PRIMARY KEY, + active_power_gradient DOUBLE PRECISION NOT NULL, + capex DOUBLE PRECISION NOT NULL, cos_phi_rated TEXT NOT NULL, - e_storage double precision NOT NULL, - eta double precision NOT NULL, + e_storage DOUBLE PRECISION NOT NULL, + eta DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - opex double precision NOT NULL, - p_max double precision NOT NULL, - s_rated double precision NOT NULL, - grid_uuid uuid NOT NULL + opex DOUBLE PRECISION NOT NULL, + p_max DOUBLE PRECISION NOT NULL, + s_rated DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; From 5d0a594c4a4502de0009b6d0d586211eff28b314 Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Wed, 3 Jul 2024 12:42:31 +0200 Subject: [PATCH 037/310] Fixing sonarqube --- .../java/edu/ie3/datamodel/io/SqlUtils.java | 4 +- .../datamodel/io/connectors/SqlConnector.java | 37 ++++++++++++------- .../edu/ie3/datamodel/io/sink/SqlSink.java | 21 ++--------- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 6 +-- src/test/resources/log4j2-test.xml | 2 +- 5 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index 79f286eb5..880a459ae 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -13,7 +13,7 @@ public class SqlUtils { protected static final Logger log = LoggerFactory.getLogger(SqlUtils.class); private static final String endQueryCreateTable = - ")\n" + "\t WITHOUT OIDS\n" + "\t TABLESPACE pg_default;"; + ")\n \t WITHOUT OIDS\n \t TABLESPACE pg_default;"; private SqlUtils() { throw new IllegalStateException("Utility classes cannot be instantiated"); @@ -36,7 +36,7 @@ public static String queryCreateGridTable(String schemaName) { * @return input with quoteSymbol */ public static String quote(String input, String quoteSymbol) { - if (Objects.equals(input, "")) { + if (Objects.equals(input, "") || Objects.equals(input, "null")) { return "NULL"; } else { return input.matches("^\".*\"$") ? input : quoteSymbol + input + quoteSymbol; diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index b25d751ef..e16d69a6b 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -61,11 +61,16 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException /** * Executes an update query * - * @param updateQuery the query to execute + * @param query the query to execute * @return The number of updates or a negative number if the execution failed */ - public int executeUpdate(String updateQuery) throws SQLException { - return getConnection().createStatement().executeUpdate(updateQuery); + public int executeUpdate(String query) throws SQLException { + try (Statement statement = getConnection().createStatement()) { + return statement.executeUpdate(query); + } catch (SQLException e) { + throw new SQLException( + String.format("Error at execution of query, SQLReason: '%s'", e.getMessage()), e); + } } /** @@ -162,17 +167,21 @@ public Map extractFieldMap(ResultSet rs) { * @param tableName Name of the table, that should be checked * @return True, if the table exists */ - public boolean tableExistsSQL(String tableName) throws SQLException { - PreparedStatement preparedStatement = - connection.prepareStatement( - "SELECT count(*) " - + "FROM information_schema.tables " - + "WHERE table_name = ?" - + "LIMIT 1;"); - preparedStatement.setString(1, tableName); + public boolean tableExistsSQL(String tableName) { + String query = + "SELECT count(*) " + + "FROM information_schema.tables " + + "WHERE table_name = ?" + + "LIMIT 1;"; + try (PreparedStatement ps = getConnection().prepareStatement(query)) { + ps.setString(1, tableName); - ResultSet resultSet = preparedStatement.executeQuery(); - resultSet.next(); - return resultSet.getInt(1) != 0; + ResultSet resultSet = ps.executeQuery(); + resultSet.next(); + return resultSet.getInt(1) != 0; + } catch (SQLException e) { + log.error("Error during execution of query {}", query, e); + } + return false; } } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index d153ef12f..f150e0065 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -33,7 +33,6 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import edu.ie3.util.StringUtils; -import java.io.IOException; import java.sql.SQLException; import java.util.*; import java.util.stream.Collectors; @@ -105,9 +104,7 @@ public void persistAll(Collection entities, DbGridMetadata // Persist the entities in hierarchic order to avoid failure because of foreign keys for (Class cls : hierarchicInsert()) { persistMixedList( - entitiesToAdd.stream() - .filter(ent -> cls.isAssignableFrom(ent.getClass())) - .collect(Collectors.toList()), + entitiesToAdd.stream().filter(ent -> cls.isAssignableFrom(ent.getClass())).toList(), identifier); entitiesToAdd.removeIf( ent -> @@ -202,15 +199,7 @@ private , V extends Value> void p } else if (TimeSeries.class.isAssignableFrom(cls)) { entities.forEach( ts -> { - try { - persistTimeSeries((TimeSeries) ts, identifier); - } catch (SQLException e) { - throw new RuntimeException( - String.format( - "An error occurred during extraction of entity '%s', SQLReason: '%s'", - cls.getSimpleName(), e.getMessage()), - e); - } + persistTimeSeries((TimeSeries) ts, identifier); }); } else { log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); @@ -244,7 +233,7 @@ private void insertListIgnoreNested( /** Persist one time series. */ protected , V extends Value> void persistTimeSeries( - TimeSeries timeSeries, DbGridMetadata identifier) throws SQLException { + TimeSeries timeSeries, DbGridMetadata identifier) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); String[] headerElements = processorProvider.getHeaderElements(key); @@ -252,14 +241,12 @@ protected , V extends Value> void persistTimeSeries } catch (ProcessorProviderException e) { log.error( "Exception occurred during receiving of header elements. Cannot write this element.", e); - } catch (IOException e) { - log.error("Exception occurred during closing of writer.", e); } } private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) - throws ProcessorProviderException, IOException { + throws ProcessorProviderException { try { String query = basicInsertQueryValuesITS( diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 3147ba2ab..0e64df0dc 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -277,7 +277,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri then: def exception = thrown(SQLException) - exception.message.contains("ERROR: invalid input syntax for type uuid: \"null\"\n") + exception.message.contains("ERROR: null value in column \"node\" of relation \"pv_input\" violates not-null constraint") cleanup: sink.shutdown() @@ -317,8 +317,8 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri then: def exception = thrown(SQLException) - exception.message == "ERROR: insert or update on table \"load_input\" violates foreign key constraint \"load_input_node_fkey\"\n" + - " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\"." + exception.message.contains("ERROR: insert or update on table \"load_input\" violates foreign key constraint \"load_input_node_fkey\"\n" + + " Detail: Key (node)=(4ca90220-74c2-4369-9afa-a18bf068840d) is not present in table \"node_input\".") } def "A valid SqlSink throws an exception if a grid does not exist."() { diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml index dd7c536aa..fd2d36637 100644 --- a/src/test/resources/log4j2-test.xml +++ b/src/test/resources/log4j2-test.xml @@ -25,7 +25,7 @@ - + From 4da951e1e47230d5ae2d93a4185305a53ed3b91e Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Wed, 3 Jul 2024 13:51:51 +0200 Subject: [PATCH 038/310] optimize tests --- src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 0e64df0dc..13be399c5 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -128,7 +128,6 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) HashMap timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) - IndividualTimeSeries individualTimeSeries = individualEnergyPriceTimeSeries SqlSink sink = new SqlSink(schemaName, new ProcessorProvider([ @@ -155,7 +154,6 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri ], timeSeriesProcessorMap), namingStrategy, connector) - UUID uuid = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") UUID inputModel = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") Quantity p = Quantities.getQuantity(10, StandardUnits.ACTIVE_POWER_IN) Quantity q = Quantities.getQuantity(10, StandardUnits.REACTIVE_POWER_IN) From c6afc53dac0f35692fdf494ab91db0bdfc82adef Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Thu, 4 Jul 2024 15:29:18 +0200 Subject: [PATCH 039/310] Implementing requested changes. --- .../io/source/csv/CsvDataSource.java | 32 +++++++------------ .../io/source/csv/CsvDataSourceTest.groovy | 20 +++++++++++- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 26e348591..61f79ad27 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -169,34 +169,26 @@ protected Map buildFieldsToAttributes( try { String[] fieldVals = parseCsvRow(csvRow, csvSep); - if (fieldVals.length > headline.length) { + if (fieldVals.length != headline.length) { throw new SourceException( - "The size of the fields is greater than the size of the headline. This can happen when using the old" - + " and now unsupported csv input format! Please refer to the docs to find the way to convert the" - + " input data into the new input format."); + "The size of the headline does not fit to the size of the attribute fields.\nHeadline: " + + String.join(", ", headline) + + "\nCsvRow: " + + csvRow.trim() + + ".\nPlease check:" + + "\n - is the csv separator in the file matching the separator provided in the constructor ('" + + csvSep + + "')" + + "\n - does the number of columns match the number of headline fields " + + "\n - are you using a valid RFC 4180 formatted csv row?"); } insensitiveFieldsToAttributes.putAll( - IntStream.range(0, fieldVals.length) + IntStream.range(0, headline.length) .boxed() .collect( Collectors.toMap( k -> StringUtils.snakeCaseToCamelCase(headline[k]), v -> fieldVals[v]))); - - if (insensitiveFieldsToAttributes.size() != headline.length) { - Set fieldsToAttributesKeySet = insensitiveFieldsToAttributes.keySet(); - insensitiveFieldsToAttributes = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - throw new SourceException( - "The size of the headline does not fit to the size of the resulting fields to attributes mapping.\nHeadline: " - + String.join(", ", headline) - + "\nResultingMap: " - + String.join(", ", fieldsToAttributesKeySet) - + "\nCsvRow: " - + csvRow.trim() - + ".\nIs the csv separator in the file matching the separator provided in the constructor ('" - + csvSep - + "') and does the number of columns match the number of headline fields?"); - } } catch (SourceException e) { log.error( "Cannot build fields to attributes map for row '{}' with headline '{}'.", diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index 4979f8b77..24a55820d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -243,7 +243,6 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { ] } - def "A CsvDataSource should build a valid fields to attributes map with valid data and empty value fields as expected"() { given: def validHeadline = [ @@ -298,6 +297,25 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,25.0,100.0,0.95,98.0,test_bmTypeInput,,,," || "too much columns" } + def "A CsvDataSource should be able to handle invalid headlines"() { + given: + def validCsvRow = "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8,0.95,test_bmTypeInput,25.0" + + expect: + dummyCsvSource.buildFieldsToAttributes(validCsvRow, invalidHeadline) == [:] + + where: + invalidHeadline || explaination + ["uuid", "cosphi_rated", "id"] as String[] || "headline too short" + [ + "uuid", + "cosphi_rated", + "id", + "s_rated", + "capex" + ] as String[] || "headline too long" + } + def "The CsvDataSource is able to provide correct paths to time series files"() { when: def actual = dummyCsvSource.getIndividualTimeSeriesFilePaths() From fdbe0a73b923cd830b67e31c5c857acf20b1087a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 06:56:15 +0000 Subject: [PATCH 040/310] Bump net.bytebuddy:byte-buddy from 1.14.17 to 1.14.18 (#1115) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e39a59206..37bf44079 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.14.17' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.14.18' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From f505d5233f3fb287bcc502e0c38ffae9fd333f64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 07:01:40 +0000 Subject: [PATCH 041/310] Bump org.sonarqube from 5.0.0.4638 to 5.1.0.4882 (#1114) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 37bf44079..46aa61ac1 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin - id "org.sonarqube" version "5.0.0.4638" // sonarqube + id "org.sonarqube" version "5.1.0.4882" // sonarqube id 'net.thauvin.erik.gradle.semver' version '1.0.4' // semantic versioning } From dde4f82ef13c6d848b005430e3d2c734d29cde68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:31:57 +0000 Subject: [PATCH 042/310] Bump testcontainersVersion from 1.19.8 to 1.20.0 (#1120) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 46aa61ac1..48042f310 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ ext { javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" groovyBinaryVersion = "4.0.22" - testcontainersVersion = '1.19.8' + testcontainersVersion = '1.20.0' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins } From e213af943b1cd27dce2c876cda386a1de9519131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 06:44:45 +0000 Subject: [PATCH 043/310] Bump com.github.spotbugs from 6.0.18 to 6.0.19 (#1116) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 48042f310..5e387729c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0' //code format - id 'com.github.spotbugs' version '6.0.18' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.19' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From c35b5cffffd96961416fd41eb27af809e149dbe0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 06:53:43 +0000 Subject: [PATCH 044/310] Bump sphinx from 7.3.7 to 7.4.7 in /docs/readthedocs (#1122) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index 143734da3..eb266a2b3 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 -Sphinx==7.3.7 +Sphinx==7.4.7 sphinx-rtd-theme==2.0.0 myst-parser==3.0.1 markdown-it-py==3.0.0 From 13cb4fba0f471fe6cb46d2058f889578852cb32a Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 23 Jul 2024 14:06:19 +0200 Subject: [PATCH 045/310] remove parameter storage minimum level from cylindrical thermal storage --- CHANGELOG.md | 1 + .../input/thermal/cylindricalstorage.md | 6 +--- .../main/input/ThermalDatamodelConcept.puml | 1 - .../input/CylindricalStorageInputFactory.java | 16 ++--------- .../thermal/CylindricalStorageInput.java | 28 +------------------ .../ThermalUnitValidationUtils.java | 16 +---------- .../CylindricalStorageInputFactoryTest.groovy | 1 - .../io/source/csv/CsvThermalSourceTest.groovy | 2 -- .../CylindricalStorageInputTest.groovy | 4 +-- .../ThermalUnitValidationUtilsTest.groovy | 6 ++-- .../common/SystemParticipantTestData.groovy | 2 -- .../common/ThermalUnitInputTestData.groovy | 2 -- 12 files changed, 9 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083590698..288162525 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Changed +- Storage minimum level parameter removed from cylindrical thermal storage [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1123) ## [5.1.0] - 2024-06-24 diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 553f63d3e..98358479a 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -38,11 +38,7 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. * - storageVolumeLvl - m³ - - Overall available storage volume - - * - storageVolumeLvlMin - - m³ - - Minimum permissible storage volume + - Overall usable storage volume * - inletTemp - °C diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 0a9801329..3f275bc5b 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -115,7 +115,6 @@ package models { class CylindricalStorageInput { - storageVolumeLvl: ComparableQuantity [m³] - - storageVolumeLvlMin: ComparableQuantity [m³] - inletTemp: ComparableQuantity [°C] - returnTemp: ComparableQuantity [°C] - c: ComparableQuantity [kWh/(K*m³)] diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 3b423465c..08545acd5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -19,7 +19,6 @@ public class CylindricalStorageInputFactory extends AssetInputEntityFactory { private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; - private static final String STORAGE_VOLUME_LVL_MIN = "storageVolumeLvlMin"; private static final String INLET_TEMP = "inletTemp"; private static final String RETURN_TEMP = "returnTemp"; private static final String C = "c"; @@ -30,7 +29,7 @@ public CylindricalStorageInputFactory() { @Override protected String[] getAdditionalFields() { - return new String[] {STORAGE_VOLUME_LVL, STORAGE_VOLUME_LVL_MIN, INLET_TEMP, RETURN_TEMP, C}; + return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C}; } @Override @@ -43,8 +42,6 @@ protected CylindricalStorageInput buildModel( final ThermalBusInput bus = data.getBusInput(); final ComparableQuantity storageVolumeLvl = data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); - final ComparableQuantity storageVolumeLvlMin = - data.getQuantity(STORAGE_VOLUME_LVL_MIN, StandardUnits.VOLUME); final ComparableQuantity inletTemp = data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); final ComparableQuantity returnTemp = @@ -52,15 +49,6 @@ protected CylindricalStorageInput buildModel( final ComparableQuantity c = data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); return new CylindricalStorageInput( - uuid, - id, - operator, - operationTime, - bus, - storageVolumeLvl, - storageVolumeLvlMin, - inletTemp, - returnTemp, - c); + uuid, id, operator, operationTime, bus, storageVolumeLvl, inletTemp, returnTemp, c); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 611c48e0a..3b1c2c473 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -19,8 +19,6 @@ public class CylindricalStorageInput extends ThermalStorageInput { /** Available storage volume (typically in m³) */ private final ComparableQuantity storageVolumeLvl; - /** Minimum permissible storage volume (typically in m³) */ - private final ComparableQuantity storageVolumeLvlMin; /** Temperature of the inlet (typically in C) */ private final ComparableQuantity inletTemp; /** Temperature of the outlet (typically in C) */ @@ -35,7 +33,6 @@ public class CylindricalStorageInput extends ThermalStorageInput { * @param operationTime operation time of the asset * @param bus Thermal bus, a thermal unit is connected to * @param storageVolumeLvl Available storage volume - * @param storageVolumeLvlMin Minimum permissible storage volume * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium @@ -47,13 +44,11 @@ public CylindricalStorageInput( OperationTime operationTime, ThermalBusInput bus, ComparableQuantity storageVolumeLvl, - ComparableQuantity storageVolumeLvlMin, ComparableQuantity inletTemp, ComparableQuantity returnTemp, ComparableQuantity c) { super(uuid, id, operator, operationTime, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); @@ -64,7 +59,6 @@ public CylindricalStorageInput( * @param id Identifier of the thermal unit * @param bus Thermal bus, a thermal unit is connected to * @param storageVolumeLvl Available storage volume - * @param storageVolumeLvlMin Minimum permissible storage volume * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium @@ -74,13 +68,11 @@ public CylindricalStorageInput( String id, ThermalBusInput bus, ComparableQuantity storageVolumeLvl, - ComparableQuantity storageVolumeLvlMin, ComparableQuantity inletTemp, ComparableQuantity returnTemp, ComparableQuantity c) { super(uuid, id, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); @@ -90,10 +82,6 @@ public ComparableQuantity getStorageVolumeLvl() { return storageVolumeLvl; } - public ComparableQuantity getStorageVolumeLvlMin() { - return storageVolumeLvlMin; - } - public ComparableQuantity getInletTemp() { return inletTemp; } @@ -117,7 +105,6 @@ public boolean equals(Object o) { if (!(o instanceof CylindricalStorageInput that)) return false; if (!super.equals(o)) return false; return storageVolumeLvl.equals(that.storageVolumeLvl) - && storageVolumeLvlMin.equals(that.storageVolumeLvlMin) && inletTemp.equals(that.inletTemp) && returnTemp.equals(that.returnTemp) && c.equals(that.c); @@ -125,8 +112,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash( - super.hashCode(), storageVolumeLvl, storageVolumeLvlMin, inletTemp, returnTemp, c); + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c); } @Override @@ -144,8 +130,6 @@ public String toString() { + getThermalBus().getUuid() + ", storageVolumeLvl=" + storageVolumeLvl - + ", storageVolumeLvlMin=" - + storageVolumeLvlMin + ", inletTemp=" + inletTemp + ", returnTemp=" @@ -164,7 +148,6 @@ public static class CylindricalStorageInputCopyBuilder extends ThermalStorageInputCopyBuilder { private ComparableQuantity storageVolumeLvl; - private ComparableQuantity storageVolumeLvlMin; private ComparableQuantity inletTemp; private ComparableQuantity returnTemp; private ComparableQuantity c; @@ -172,7 +155,6 @@ public static class CylindricalStorageInputCopyBuilder private CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); this.storageVolumeLvl = entity.getStorageVolumeLvl(); - this.storageVolumeLvlMin = entity.getStorageVolumeLvlMin(); this.inletTemp = entity.getInletTemp(); this.returnTemp = entity.getReturnTemp(); this.c = entity.getC(); @@ -184,12 +166,6 @@ public CylindricalStorageInputCopyBuilder storageVolumeLvl( return this; } - public CylindricalStorageInputCopyBuilder storageVolumeLvlMin( - ComparableQuantity storageVolumeLvlMin) { - this.storageVolumeLvlMin = storageVolumeLvlMin; - return this; - } - public CylindricalStorageInputCopyBuilder inletTemp(ComparableQuantity inletTemp) { this.inletTemp = inletTemp; return this; @@ -209,7 +185,6 @@ public CylindricalStorageInputCopyBuilder c(ComparableQuantity> checkThermalHouse( *

    *
  • it is not null *
  • its available storage volume is positive - *
  • its minimum permissible storage volume is positive and not greater than the available - * storage volume *
  • its inlet temperature is equal/greater than the outlet temperature *
  • its specific heat capacity is positive *
@@ -213,25 +211,13 @@ private static List> checkCylindricalStorage( new InvalidEntityException( "Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", cylindricalStorageInput))); - // Check if minimum permissible storage volume is lower than overall available storage volume - exceptions.add( - Try.ofVoid( - cylindricalStorageInput - .getStorageVolumeLvlMin() - .isGreaterThan(cylindricalStorageInput.getStorageVolumeLvl()), - () -> - new InvalidEntityException( - "Minimum permissible storage volume of the cylindrical storage cannot be higher than overall available storage volume", - cylindricalStorageInput))); exceptions.add( Try.ofVoid( () -> detectZeroOrNegativeQuantities( new Quantity[] { - cylindricalStorageInput.getStorageVolumeLvl(), - cylindricalStorageInput.getStorageVolumeLvlMin(), - cylindricalStorageInput.getC() + cylindricalStorageInput.getStorageVolumeLvl(), cylindricalStorageInput.getC() }, cylindricalStorageInput), InvalidEntityException.class)); diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy index cf75e1188..91cb1a5cf 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy @@ -53,7 +53,6 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto assert id == parameter["id"] assert thermalBus == thermalBusInput assert storageVolumeLvl == getQuant(parameter["storagevolumelvl"], StandardUnits.VOLUME) - assert storageVolumeLvlMin == getQuant(parameter["storagevolumelvlmin"], StandardUnits.VOLUME) assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index 7351cf1a2..915046bb6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -65,7 +65,6 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { operationTime == sptd.thermalStorage.operationTime thermalBus == sptd.thermalStorage.thermalBus storageVolumeLvl == sptd.storageVolumeLvl - storageVolumeLvlMin == sptd.storageVolumeLvlMin inletTemp == sptd.inletTemp returnTemp == sptd.returnTemp c == sptd.c @@ -84,7 +83,6 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { operationTime == sptd.thermalStorage.operationTime thermalBus == sptd.thermalStorage.thermalBus storageVolumeLvl == sptd.storageVolumeLvl - storageVolumeLvlMin == sptd.storageVolumeLvlMin inletTemp == sptd.inletTemp returnTemp == sptd.returnTemp c == sptd.c diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy index 815876368..eee911126 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy @@ -17,7 +17,7 @@ class CylindricalStorageInputTest extends Specification { when: def alteredUnit = cylindricalStorageInput.copy().storageVolumeLvl(ThermalUnitInputTestData.storageVolumeLvl) - .storageVolumeLvlMin(ThermalUnitInputTestData.storageVolumeLvlMin).inletTemp(ThermalUnitInputTestData.inletTemp) + .inletTemp(ThermalUnitInputTestData.inletTemp) .returnTemp(ThermalUnitInputTestData.returnTemp).c(ThermalUnitInputTestData.c) .thermalBus(ThermalUnitInputTestData.thermalBus).build() @@ -30,7 +30,6 @@ class CylindricalStorageInputTest extends Specification { assert operationTime == cylindricalStorageInput.operationTime assert thermalBus == cylindricalStorageInput.thermalBus assert storageVolumeLvl == ThermalUnitInputTestData.storageVolumeLvl - assert storageVolumeLvlMin == ThermalUnitInputTestData.storageVolumeLvlMin assert inletTemp == ThermalUnitInputTestData.inletTemp assert returnTemp == ThermalUnitInputTestData.returnTemp assert c == ThermalUnitInputTestData.c @@ -52,7 +51,6 @@ class CylindricalStorageInputTest extends Specification { assert operationTime == cylindricalStorageInput.operationTime assert thermalBus == cylindricalStorageInput.thermalBus assert storageVolumeLvl == cylindricalStorageInput.storageVolumeLvl * 2d - assert storageVolumeLvlMin == cylindricalStorageInput.storageVolumeLvlMin * 2d assert inletTemp == cylindricalStorageInput.inletTemp assert returnTemp == cylindricalStorageInput.returnTemp assert c == cylindricalStorageInput.c diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy index 5c1de7967..e903bdbfc 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy @@ -46,7 +46,6 @@ class ThermalUnitValidationUtilsTest extends Specification { // Specific data for thermal cylindric storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) - private static final ComparableQuantity storageVolumeLvlMin = Quantities.getQuantity(10, StandardUnits.VOLUME) private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) @@ -108,8 +107,7 @@ class ThermalUnitValidationUtilsTest extends Specification { where: invalidCylindricalStorage || expectedSize || expectedException - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, storageVolumeLvlMin, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(100, StandardUnits.VOLUME), Quantities.getQuantity(200, StandardUnits.VOLUME), inletTemp, returnTemp, c) || 1 || new InvalidEntityException("Minimum permissible storage volume of the cylindrical storage cannot be higher than overall available storage volume", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), Quantities.getQuantity(-200, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -200 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) } } diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index eca3b3d39..e77913cee 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -169,7 +169,6 @@ class SystemParticipantTestData { operationTime ) public static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(1.039154027, VOLUME) - public static final ComparableQuantity storageVolumeLvlMin = Quantities.getQuantity(0.3, VOLUME) public static final ComparableQuantity inletTemp = Quantities.getQuantity(110, TEMPERATURE) public static final ComparableQuantity returnTemp = Quantities.getQuantity(80, TEMPERATURE) public static final ComparableQuantity c = Quantities.getQuantity( @@ -181,7 +180,6 @@ class SystemParticipantTestData { OperationTime.notLimited(), thermalBus, storageVolumeLvl, - storageVolumeLvlMin, inletTemp, returnTemp, c diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index 2802dc2da..bf3f6a521 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -50,7 +50,6 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { // thermal cylindric storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) - private static final ComparableQuantity storageVolumeLvlMin = Quantities.getQuantity(10, StandardUnits.VOLUME) private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) @@ -62,7 +61,6 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { operationTime, thermalBus, storageVolumeLvl, - storageVolumeLvlMin, inletTemp, returnTemp, c) From 5bf99929fca4c349c945b6e4a5d2b2bfd73e3d12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:46:27 +0000 Subject: [PATCH 046/310] Bump com.couchbase.client:java-client from 3.7.0 to 3.7.1 (#1125) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5e387729c..e48238995 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.0' + implementation 'com.couchbase.client:java-client:3.7.1' runtimeOnly 'org.postgresql:postgresql:42.7.3' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.16.1' // I/O functionalities From 4ee9d54e6376557038b79f59735d0f5f410aad4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:52:21 +0000 Subject: [PATCH 047/310] Bump commons-codec:commons-codec from 1.17.0 to 1.17.1 (#1117) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e48238995..1e5839ec4 100644 --- a/build.gradle +++ b/build.gradle @@ -94,7 +94,7 @@ dependencies { runtimeOnly 'org.postgresql:postgresql:42.7.3' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.16.1' // I/O functionalities - implementation 'commons-codec:commons-codec:1.17.0' // needed by commons-compress + implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress implementation 'org.apache.commons:commons-compress:1.26.2' // I/O functionalities } From 6811ac7b8abb93b5f1a435b8f922551ef035c48a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 12:10:27 +0000 Subject: [PATCH 048/310] Bump testcontainersVersion from 1.20.0 to 1.20.1 (#1127) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1e5839ec4..3606db402 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ ext { javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" groovyBinaryVersion = "4.0.22" - testcontainersVersion = '1.20.0' + testcontainersVersion = '1.20.1' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins } From 956d81a785b919f5b5237201c2b53b1fbfd08e6e Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 6 Aug 2024 10:54:25 +0200 Subject: [PATCH 049/310] Adding a timeseries for voltage values. --- CHANGELOG.md | 1 + .../exceptions/EntityProcessorException.java | 2 +- .../TimeBasedSimpleValueFactory.java | 20 ++++- .../timeseries/TimeSeriesMappingFactory.java | 16 +++- .../io/naming/timeseries/ColumnScheme.java | 4 +- .../io/processor/EntityProcessor.java | 2 +- .../io/source/TimeSeriesMappingSource.java | 65 +++++++++++--- .../datamodel/models/value/VoltageValue.java | 89 +++++++++++++++++++ .../ie3/datamodel/utils/TimeSeriesUtils.java | 3 +- .../validation/UniquenessValidationUtils.java | 2 +- .../input/InputEntityProcessorTest.groovy | 4 +- .../csv/CsvTimeSeriesMappingSourceIT.groovy | 3 +- ...svTimeSeriesMetaInformationSourceIT.groovy | 6 +- .../source/csv/CsvTimeSeriesSourceTest.groovy | 1 + .../models/value/VoltageValueTest.groovy | 46 ++++++++++ .../UniquenessValidationUtilsTest.groovy | 50 +++++++---- ...v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6.csv | 3 + .../csv/_timeseries/time_series_mapping.csv | 9 +- 18 files changed, 278 insertions(+), 48 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/models/value/VoltageValue.java create mode 100644 src/test/groovy/edu/ie3/datamodel/models/value/VoltageValueTest.groovy create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/its_v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6.csv diff --git a/CHANGELOG.md b/CHANGELOG.md index 083590698..25209bb22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased/Snapshot] ### Added +- Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) ### Fixed diff --git a/src/main/java/edu/ie3/datamodel/exceptions/EntityProcessorException.java b/src/main/java/edu/ie3/datamodel/exceptions/EntityProcessorException.java index 37736b231..749b190d8 100644 --- a/src/main/java/edu/ie3/datamodel/exceptions/EntityProcessorException.java +++ b/src/main/java/edu/ie3/datamodel/exceptions/EntityProcessorException.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.exceptions; /** - * Is thrown, when an something went wrong during entity field mapping creation in a {@link + * Is thrown, when something went wrong during entity field mapping creation in a {@link * edu.ie3.datamodel.io.processor.EntityProcessor} */ public class EntityProcessorException extends Exception { diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java index ecbc89dd5..839df2705 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java @@ -14,7 +14,10 @@ import edu.ie3.util.TimeUtil; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; public class TimeBasedSimpleValueFactory extends TimeBasedValueFactory, V> { @@ -26,6 +29,10 @@ public class TimeBasedSimpleValueFactory private static final String REACTIVE_POWER = "q"; private static final String HEAT_DEMAND = "heatDemand"; + /* voltage */ + private static final String VMAG = "vMag"; + private static final String VANG = "VAng"; + private final TimeUtil timeUtil; public TimeBasedSimpleValueFactory(Class valueClasses) { @@ -78,6 +85,17 @@ protected TimeBasedValue buildModel(SimpleTimeBasedValueData data) { data.getQuantity(REACTIVE_POWER, REACTIVE_POWER_IN)); } else if (PValue.class.isAssignableFrom(data.getTargetClass())) { value = (V) new PValue(data.getQuantity(ACTIVE_POWER, ACTIVE_POWER_IN)); + } else if (VoltageValue.class.isAssignableFrom(data.getTargetClass())) { + + try { + value = + (V) + new VoltageValue( + data.getQuantity(VMAG, VOLTAGE_MAGNITUDE), + data.getQuantity(VANG, VOLTAGE_ANGLE)); + } catch (FactoryException e) { + value = (V) new VoltageValue(data.getQuantity(VMAG, VOLTAGE_MAGNITUDE)); + } } else { throw new FactoryException( "The given factory cannot handle target class '" + data.getTargetClass() + "'."); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java index 2009435cc..3ef9d60c1 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.UUID; @@ -17,6 +17,7 @@ public class TimeSeriesMappingFactory extends EntityFactory { + private static final String ENTITY = "entity"; private static final String PARTICIPANT = "participant"; private static final String TIME_SERIES = "timeSeries"; @@ -26,14 +27,21 @@ public TimeSeriesMappingFactory() { @Override protected List> getFields(Class entityClass) { - return Collections.singletonList( + return List.of( + Stream.of(ENTITY, TIME_SERIES).collect(Collectors.toSet()), Stream.of(PARTICIPANT, TIME_SERIES).collect(Collectors.toSet())); } @Override protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) { - UUID participant = data.getUUID(PARTICIPANT); UUID timeSeries = data.getUUID(TIME_SERIES); - return new TimeSeriesMappingSource.MappingEntry(participant, timeSeries); + + try { + UUID entity = data.getUUID(ENTITY); + return new TimeSeriesMappingSource.EntityMappingEntry(entity, timeSeries); + } catch (FactoryException e) { + UUID participant = data.getUUID(PARTICIPANT); + return new TimeSeriesMappingSource.ParticipantMappingEntry(participant, timeSeries); + } } } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java index 44359e34b..6ea64b458 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java @@ -19,7 +19,8 @@ public enum ColumnScheme { HEAT_DEMAND("h", HeatDemandValue.class), ACTIVE_POWER_AND_HEAT_DEMAND("ph", HeatAndPValue.class), APPARENT_POWER_AND_HEAT_DEMAND("pqh", HeatAndSValue.class), - WEATHER("weather", WeatherValue.class); + WEATHER("weather", WeatherValue.class), + VOLTAGE("v", VoltageValue.class); private final String scheme; private final Class valueClass; @@ -57,6 +58,7 @@ public static Optional parse(Class valueClass if (PValue.class.isAssignableFrom(valueClass)) return Optional.of(ACTIVE_POWER); if (HeatDemandValue.class.isAssignableFrom(valueClass)) return Optional.of(HEAT_DEMAND); if (WeatherValue.class.isAssignableFrom(valueClass)) return Optional.of(WEATHER); + if (VoltageValue.class.isAssignableFrom(valueClass)) return Optional.of(VOLTAGE); return Optional.empty(); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java index d756c00cf..ac7380793 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/EntityProcessor.java @@ -55,7 +55,7 @@ protected EntityProcessor(Class registeredClass) throws EntityProce * during processing */ public LinkedHashMap handleEntity(T entity) throws EntityProcessorException { - if (!registeredClass.equals(entity.getClass())) + if (!registeredClass.isAssignableFrom(entity.getClass())) throw new EntityProcessorException( "Cannot process " + entity.getClass().getSimpleName() diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java index 75a1802c6..81c382f9e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java @@ -11,7 +11,6 @@ import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory; import edu.ie3.datamodel.models.input.InputEntity; -import edu.ie3.datamodel.models.input.system.SystemParticipantInput; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; @@ -47,7 +46,7 @@ public Map getMapping() throws SourceException { .filter(Try::isSuccess) .map(t -> (Success) t) .map(Success::get) - .collect(Collectors.toMap(MappingEntry::participant, MappingEntry::timeSeries)); + .collect(Collectors.toMap(MappingEntry::getEntity, MappingEntry::getTimeSeries)); } /** @@ -80,12 +79,19 @@ private Try createMappingEntry( // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - /** Class to represent one entry within the participant to time series mapping */ - public record MappingEntry(UUID participant, UUID timeSeries) implements InputEntity { + /** Class to represent one entry within the entity to time series mapping */ + public abstract static class MappingEntry implements InputEntity { + protected final UUID entity; + private final UUID timeSeries; - /** Returns the {@link UUID} of the {@link SystemParticipantInput}. */ - public UUID getParticipant() { - return participant; + public MappingEntry(UUID entity, UUID timeSeries) { + this.entity = entity; + this.timeSeries = timeSeries; + } + + /** Returns the {@link UUID} of the {@link edu.ie3.datamodel.models.UniqueEntity}. */ + public UUID getEntity() { + return entity; } /** Returns the {@link UUID} of the {@link TimeSeries}. */ @@ -97,17 +103,56 @@ public UUID getTimeSeries() { public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof MappingEntry that)) return false; - return participant.equals(that.participant) && timeSeries.equals(that.timeSeries); + return entity.equals(that.entity) && timeSeries.equals(that.timeSeries); } @Override public int hashCode() { - return Objects.hash(participant, timeSeries); + return Objects.hash(entity, timeSeries); + } + + @Override + public String toString() { + return "MappingEntry{" + "entity=" + entity + ", timeSeries=" + timeSeries + '}'; + } + } + + /** Class to represent one entry within the entity to time series mapping */ + public static class EntityMappingEntry extends MappingEntry { + + public EntityMappingEntry(UUID entity, UUID timeSeries) { + super(entity, timeSeries); + } + + @Override + public String toString() { + return "EntityMappingEntry{" + "entity=" + entity + ", timeSeries=" + getTimeSeries() + '}'; + } + } + + /** Class to represent one entry within the participant to time series mapping */ + public static class ParticipantMappingEntry extends MappingEntry { + + public ParticipantMappingEntry(UUID participant, UUID timeSeries) { + super(participant, timeSeries); + } + + /** + * Returns the {@link UUID} of the {@link + * edu.ie3.datamodel.models.input.system.SystemParticipantInput}. + */ + public UUID getParticipant() { + return entity; } @Override public String toString() { - return "MappingEntry{" + "participant=" + participant + ", timeSeries=" + timeSeries + '}'; + return "ParticipantMappingEntry{" + + "participant=" + + entity + + ", timeSeries=" + + getTimeSeries() + + '}'; } } } diff --git a/src/main/java/edu/ie3/datamodel/models/value/VoltageValue.java b/src/main/java/edu/ie3/datamodel/models/value/VoltageValue.java new file mode 100644 index 000000000..3a77055e9 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/VoltageValue.java @@ -0,0 +1,89 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value; + +import static edu.ie3.datamodel.models.StandardUnits.VOLTAGE_ANGLE; +import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM; +import static edu.ie3.util.quantities.PowerSystemUnits.PU; +import static java.lang.Math.*; + +import java.util.Objects; +import java.util.Optional; +import javax.measure.quantity.Angle; +import javax.measure.quantity.Dimensionless; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +/** Describes a voltage value as a pair of magnitude and angle */ +public class VoltageValue implements Value { + + /** Magnitude of the voltage in p.u. */ + private final ComparableQuantity magnitude; + /** Angle of the voltage in degree */ + private final ComparableQuantity angle; + + /** + * @param magnitude of the voltage in p.u. + * @param angle of the voltage in degree + */ + public VoltageValue( + ComparableQuantity magnitude, ComparableQuantity angle) { + this.magnitude = magnitude; + this.angle = angle; + } + + /** + * This constructor will set the angle to 0° + * + * @param magnitude of the voltage in p.u. + */ + public VoltageValue(ComparableQuantity magnitude) { + this.magnitude = magnitude; + this.angle = Quantities.getQuantity(0.0, VOLTAGE_ANGLE); + } + + public Optional> getMagnitude() { + return Optional.ofNullable(magnitude); + } + + public Optional> getAngle() { + return Optional.ofNullable(angle); + } + + public Optional> getRealPart() { + double mag = magnitude.to(PU).getValue().doubleValue(); + double ang = angle.to(DEGREE_GEOM).getValue().doubleValue(); + + double eInPu = mag * cos(toRadians(ang)); + return Optional.of(Quantities.getQuantity(eInPu, PU)); + } + + public Optional> getImagPart() { + double mag = magnitude.to(PU).getValue().doubleValue(); + double ang = angle.to(DEGREE_GEOM).getValue().doubleValue(); + + double eInPu = mag * sin(toRadians(ang)); + return Optional.of(Quantities.getQuantity(eInPu, PU)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + VoltageValue that = (VoltageValue) o; + return Objects.equals(magnitude, that.magnitude) && Objects.equals(angle, that.angle); + } + + @Override + public int hashCode() { + return Objects.hash(magnitude, angle); + } + + @Override + public String toString() { + return "VoltageValue{" + "magnitude=" + magnitude + ", angle=" + angle + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java b/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java index d6ce28049..16fdcb24f 100644 --- a/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java @@ -25,7 +25,8 @@ public class TimeSeriesUtils { ENERGY_PRICE, APPARENT_POWER_AND_HEAT_DEMAND, ACTIVE_POWER_AND_HEAT_DEMAND, - HEAT_DEMAND); + HEAT_DEMAND, + VOLTAGE); /** Private Constructor as this class is not meant to be instantiated */ private TimeSeriesUtils() { diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java index 86be3c060..a1576dfaa 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java @@ -33,7 +33,7 @@ public class UniquenessValidationUtils extends ValidationUtils { protected static final FieldSetSupplier congestionResultFieldSupplier = entity -> Set.of(entity.getTime(), entity.getSubgrid()); protected static final FieldSetSupplier mappingFieldSupplier = - entity -> Set.of(entity.participant()); + entity -> Set.of(entity.getEntity()); protected static final FieldSetSupplier idCoordinateSupplier = entity -> Set.of(entity.id(), entity.point()); protected static final FieldSetSupplier> weatherValueFieldSupplier = diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index 24b1a8198..b0fd79168 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -627,10 +627,10 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided MappingEntry correctly"() { given: def processor = new InputEntityProcessor(TimeSeriesMappingSource.MappingEntry) - def validResult = new TimeSeriesMappingSource.MappingEntry(UUID.fromString("7eb7b296-f4c4-4020-acf3-e865453b5dbd"), UUID.fromString("bc581c6c-3044-48a1-aea1-5b2cb1370356")) + def validResult = new TimeSeriesMappingSource.ParticipantMappingEntry(UUID.fromString("7eb7b296-f4c4-4020-acf3-e865453b5dbd"), UUID.fromString("bc581c6c-3044-48a1-aea1-5b2cb1370356")) Map expectedResults = [ - "participant": "7eb7b296-f4c4-4020-acf3-e865453b5dbd", + "entity": "7eb7b296-f4c4-4020-acf3-e865453b5dbd", "timeSeries": "bc581c6c-3044-48a1-aea1-5b2cb1370356" ] diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy index 91ff12295..2abcc918c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy @@ -23,7 +23,8 @@ class CsvTimeSeriesMappingSourceIT extends Specification implements CsvTestDataM def expectedMapping = [ (UUID.fromString("b86e95b0-e579-4a80-a534-37c7a470a409")) : UUID.fromString("9185b8c1-86ba-4a16-8dea-5ac898e8caa5"), (UUID.fromString("c7ebcc6c-55fc-479b-aa6b-6fa82ccac6b8")) : UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c26"), - (UUID.fromString("90a96daa-012b-4fea-82dc-24ba7a7ab81c")) : UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c26") + (UUID.fromString("90a96daa-012b-4fea-82dc-24ba7a7ab81c")) : UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c26"), + (UUID.fromString("7bed7760-c220-4fe6-88b3-47b246f6ef3f")) : UUID.fromString("eeccbe3c-a47e-448e-8eca-1f369d3c24e6") ] when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSourceIT.groovy index 2fa70a2f6..6623e76ca 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSourceIT.groovy @@ -30,14 +30,15 @@ class CsvTimeSeriesMetaInformationSourceIT extends Specification implements CsvT new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("9185b8c1-86ba-4a16-8dea-5ac898e8caa5"), ColumnScheme.ACTIVE_POWER, Path.of('its_p_9185b8c1-86ba-4a16-8dea-5ac898e8caa5')), new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c26"), ColumnScheme.APPARENT_POWER, Path.of('its_pq_3fbfaa97-cff4-46d4-95ba-a95665e87c26')), new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("46be1e57-e4ed-4ef7-95f1-b2b321cb2047"), ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND, Path.of('its_pqh_46be1e57-e4ed-4ef7-95f1-b2b321cb2047')), - new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("1061af70-1c03-46e1-b960-940b956c429f"), ColumnScheme.APPARENT_POWER, Path.of('its_pq_1061af70-1c03-46e1-b960-940b956c429f')) + new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("1061af70-1c03-46e1-b960-940b956c429f"), ColumnScheme.APPARENT_POWER, Path.of('its_pq_1061af70-1c03-46e1-b960-940b956c429f')), + new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("eeccbe3c-a47e-448e-8eca-1f369d3c24e6"), ColumnScheme.VOLTAGE, Path.of("its_v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6")) ) when: def actual = source.timeSeriesMetaInformation then: - actual.size() == 7 + actual.size() == 8 actual.every { it.key == it.value.uuid && expectedTimeSeries.contains(it.value) @@ -62,6 +63,7 @@ class CsvTimeSeriesMetaInformationSourceIT extends Specification implements CsvT "3fbfaa97-cff4-46d4-95ba-a95665e87c26" || "pq" "46be1e57-e4ed-4ef7-95f1-b2b321cb2047" || "pqh" "1061af70-1c03-46e1-b960-940b956c429f" || "pq" + "eeccbe3c-a47e-448e-8eca-1f369d3c24e6" || "v" } def "The CSV time series meta information source returns an empty optional for an unknown time series UUID"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy index c142bb414..042055b31 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy @@ -78,5 +78,6 @@ class CsvTimeSeriesSourceTest extends Specification implements CsvTestDataMeta { UUID.fromString("76c9d846-797c-4f07-b7ec-2245f679f5c7") | ColumnScheme.ACTIVE_POWER_AND_HEAT_DEMAND | Path.of("its_ph_76c9d846-797c-4f07-b7ec-2245f679f5c7") || 2 | HeatAndPValue UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c26") | ColumnScheme.APPARENT_POWER | Path.of("its_pq_3fbfaa97-cff4-46d4-95ba-a95665e87c26") || 2 | SValue UUID.fromString("46be1e57-e4ed-4ef7-95f1-b2b321cb2047") | ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND | Path.of("its_pqh_46be1e57-e4ed-4ef7-95f1-b2b321cb2047") || 2 | HeatAndSValue + UUID.fromString("eeccbe3c-a47e-448e-8eca-1f369d3c24e6") | ColumnScheme.VOLTAGE | Path.of("its_v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6") || 2 | VoltageValue } } \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/models/value/VoltageValueTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/value/VoltageValueTest.groovy new file mode 100644 index 000000000..08b264476 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/models/value/VoltageValueTest.groovy @@ -0,0 +1,46 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.models.value + +import static edu.ie3.util.quantities.PowerSystemUnits.* + +import spock.lang.Specification +import tech.units.indriya.quantity.Quantities + + +class VoltageValueTest extends Specification { + + def "A VoltageValue should return the real part correctly"() { + when: + def actual = value.realPart + + then: + actual.isPresent() + actual.get() =~ expected + + where: + value | expected + new VoltageValue(Quantities.getQuantity(1, PU), Quantities.getQuantity(0, DEGREE_GEOM)) | Quantities.getQuantity(1, PU) + new VoltageValue(Quantities.getQuantity(1, PU), Quantities.getQuantity(45, DEGREE_GEOM)) | Quantities.getQuantity(0.7071067811865476, PU) + new VoltageValue(Quantities.getQuantity(1, PU), Quantities.getQuantity(90, DEGREE_GEOM)) | Quantities.getQuantity(6.123233995736766E-17, PU) // ~0pu + } + + + def "A VoltageValue should return the imaginary part correctly"() { + when: + def actual = value.imagPart + + then: + actual.isPresent() + actual.get() =~ expected + + where: + value | expected + new VoltageValue(Quantities.getQuantity(1, PU), Quantities.getQuantity(0, DEGREE_GEOM)) | Quantities.getQuantity(0, PU) + new VoltageValue(Quantities.getQuantity(1, PU), Quantities.getQuantity(45, DEGREE_GEOM)) | Quantities.getQuantity(0.7071067811865475, PU) + new VoltageValue(Quantities.getQuantity(1, PU), Quantities.getQuantity(90, DEGREE_GEOM)) | Quantities.getQuantity(1, PU) + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index d33502cb1..f6124f455 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -12,6 +12,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import static tech.units.indriya.unit.Units.METRE_PER_SECOND import edu.ie3.datamodel.exceptions.DuplicateEntitiesException +import edu.ie3.datamodel.exceptions.ValidationException import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.AssetInput @@ -23,6 +24,7 @@ import edu.ie3.datamodel.models.value.SolarIrradianceValue import edu.ie3.datamodel.models.value.TemperatureValue import edu.ie3.datamodel.models.value.WeatherValue import edu.ie3.datamodel.models.value.WindValue +import edu.ie3.datamodel.utils.Try import edu.ie3.util.geo.GeoUtils import spock.lang.Specification import tech.units.indriya.quantity.Quantities @@ -168,8 +170,8 @@ class UniquenessValidationUtilsTest extends Specification { given: UUID timeSeries = UUID.randomUUID() Set uniqueEntries = [ - new TimeSeriesMappingSource.MappingEntry(UUID.randomUUID(), timeSeries), - new TimeSeriesMappingSource.MappingEntry(UUID.randomUUID(), timeSeries), + new TimeSeriesMappingSource.ParticipantMappingEntry(UUID.randomUUID(), timeSeries), + new TimeSeriesMappingSource.ParticipantMappingEntry(UUID.randomUUID(), timeSeries), ] when: @@ -183,29 +185,39 @@ class UniquenessValidationUtilsTest extends Specification { given: UUID participant = UUID.fromString("1f25eea2-20eb-4b6b-8f05-bdbb0e851e65") - Set uniqueEntries = [ - new TimeSeriesMappingSource.MappingEntry(participant, UUID.randomUUID()), - new TimeSeriesMappingSource.MappingEntry(participant, UUID.randomUUID()), + Set uniqueParticipantEntries = [ + new TimeSeriesMappingSource.ParticipantMappingEntry(participant, UUID.randomUUID()), + new TimeSeriesMappingSource.ParticipantMappingEntry(participant, UUID.randomUUID()), + ] + + Set uniqueEntityEntries = [ + new TimeSeriesMappingSource.EntityMappingEntry(participant, UUID.randomUUID()), + new TimeSeriesMappingSource.EntityMappingEntry(participant, UUID.randomUUID()), ] when: - checkMappingEntryUniqueness(uniqueEntries) + def participantDuplicate = Try.ofVoid(() -> checkMappingEntryUniqueness(uniqueParticipantEntries), DuplicateEntitiesException) + def entityDuplicate = Try.ofVoid(() -> checkMappingEntryUniqueness(uniqueEntityEntries), DuplicateEntitiesException) then: - DuplicateEntitiesException de = thrown() - de.message == "'MappingEntry' entities with duplicated UUID key, but different field values found! " + - "Affected primary keys: [1f25eea2-20eb-4b6b-8f05-bdbb0e851e65]" + participantDuplicate.failure + participantDuplicate.exception.get().message == "'ParticipantMappingEntry' entities with duplicated UUID key, but different field values found! " + + "Affected primary keys: [1f25eea2-20eb-4b6b-8f05-bdbb0e851e65]" + + entityDuplicate.failure + entityDuplicate.exception.get().message == "'EntityMappingEntry' entities with duplicated UUID key, but different field values found! " + + "Affected primary keys: [1f25eea2-20eb-4b6b-8f05-bdbb0e851e65]" } def "Checking if time based weather values are unique"() { given: ZonedDateTime time = ZonedDateTime.now() WeatherValue value = new WeatherValue( - GeoUtils.buildPoint(50d, 7d), - new SolarIrradianceValue(Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE), Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE)), - new TemperatureValue(Quantities.getQuantity(5d, Units.CELSIUS)), - new WindValue(Quantities.getQuantity(5d, DEGREE_GEOM), Quantities.getQuantity(10d, METRE_PER_SECOND)) - ) + GeoUtils.buildPoint(50d, 7d), + new SolarIrradianceValue(Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE), Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE)), + new TemperatureValue(Quantities.getQuantity(5d, Units.CELSIUS)), + new WindValue(Quantities.getQuantity(5d, DEGREE_GEOM), Quantities.getQuantity(10d, METRE_PER_SECOND)) + ) Set> uniqueValues = [ new TimeBasedValue(time, value), @@ -223,11 +235,11 @@ class UniquenessValidationUtilsTest extends Specification { given: ZonedDateTime time = ZonedDateTime.now() WeatherValue value = new WeatherValue( - GeoUtils.buildPoint(50d, 7d), - new SolarIrradianceValue(Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE), Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE)), - new TemperatureValue(Quantities.getQuantity(5d, Units.CELSIUS)), - new WindValue(Quantities.getQuantity(5d, DEGREE_GEOM), Quantities.getQuantity(10d, METRE_PER_SECOND)) - ) + GeoUtils.buildPoint(50d, 7d), + new SolarIrradianceValue(Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE), Quantities.getQuantity(10d, StandardUnits.SOLAR_IRRADIANCE)), + new TemperatureValue(Quantities.getQuantity(5d, Units.CELSIUS)), + new WindValue(Quantities.getQuantity(5d, DEGREE_GEOM), Quantities.getQuantity(10d, METRE_PER_SECOND)) + ) Set> notUniqueValues = [ new TimeBasedValue(time, value), new TimeBasedValue(time, value) diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/its_v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/its_v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6.csv new file mode 100644 index 000000000..1d776f689 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/its_v_eeccbe3c-a47e-448e-8eca-1f369d3c24e6.csv @@ -0,0 +1,3 @@ +"time";"vMag";"vAng" +2020-01-01T00:00:00Z;1.0;45.0 +2020-01-01T00:15:00Z;0.9; \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/time_series_mapping.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/time_series_mapping.csv index d0130d232..2e1897b2a 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/time_series_mapping.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/time_series_mapping.csv @@ -1,4 +1,5 @@ -"uuid";"participant";"time_series" -"58167015-d760-4f90-8109-f2ebd94cda91";"b86e95b0-e579-4a80-a534-37c7a470a409";"9185b8c1-86ba-4a16-8dea-5ac898e8caa5" -"9a9ebfda-dc26-4a40-b9ca-25cd42f6cc3f";"c7ebcc6c-55fc-479b-aa6b-6fa82ccac6b8";"3fbfaa97-cff4-46d4-95ba-a95665e87c26" -"9c1c53ea-e575-41a2-a373-a8b2d3ed2c39";"90a96daa-012b-4fea-82dc-24ba7a7ab81c";"3fbfaa97-cff4-46d4-95ba-a95665e87c26" \ No newline at end of file +"entity";"time_series" +"b86e95b0-e579-4a80-a534-37c7a470a409";"9185b8c1-86ba-4a16-8dea-5ac898e8caa5" +"c7ebcc6c-55fc-479b-aa6b-6fa82ccac6b8";"3fbfaa97-cff4-46d4-95ba-a95665e87c26" +"90a96daa-012b-4fea-82dc-24ba7a7ab81c";"3fbfaa97-cff4-46d4-95ba-a95665e87c26" +"7bed7760-c220-4fe6-88b3-47b246f6ef3f";"eeccbe3c-a47e-448e-8eca-1f369d3c24e6" \ No newline at end of file From 3d30927dc5bab3cb85b23459539f6d0e0db8a0b0 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 6 Aug 2024 12:45:41 +0200 Subject: [PATCH 050/310] Adding information to docs. --- docs/readthedocs/io/csvfiles.md | 3 +++ .../models/input/additionaldata/timeseries.md | 11 ++++++++--- .../validation/UniquenessValidationUtilsTest.groovy | 1 - 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 54a6b7369..cb01a42e4 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -148,6 +148,9 @@ The following keys are supported until now: * - pqh - | Active, reactive and heat power | Permissible head line: ``time,p,q,h`` + * - v + - | Voltage mangnitude in pu and angle in ° + | Permissible head line: ``time,vMag,vAng`` * - weather - | Weather information | Permissible head line: ``time,coordinate,direct_irradiation,diffuse_irradiation,temperature,wind_velocity,wind_direction`` diff --git a/docs/readthedocs/models/input/additionaldata/timeseries.md b/docs/readthedocs/models/input/additionaldata/timeseries.md index d486f78ca..f5830c83b 100644 --- a/docs/readthedocs/models/input/additionaldata/timeseries.md +++ b/docs/readthedocs/models/input/additionaldata/timeseries.md @@ -32,10 +32,12 @@ The following different values are available: - Electrical active and reactive power * - `HeatAndPValue` - - Combination of thermal power (e.g. in kW)
and electrical active power (e.g. in kW) + - | Combination of thermal power (e.g. in kW) + | and electrical active power (e.g. in kW) * - `HeatAndSValue` - - Combination of thermal power (e.g. in kW)
and electrical active and reactive power (e.g. in kW and kVAr) + - | Combination of thermal power (e.g. in kW) + | and electrical active and reactive power (e.g. in kW and kVAr) * - `EnergyPriceValue` - Wholesale market price (e.g. in € / MWh) @@ -48,7 +50,10 @@ The following different values are available: * - `WindValue` - Combination of wind direction and wind velocity - + + * - `VoltageValue` + - Combination of voltage magnitude in pu and angle in ° + * - `WeatherValue` - Combination of irradiance, temperature and wind information diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index f6124f455..ef5027514 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -12,7 +12,6 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import static tech.units.indriya.unit.Units.METRE_PER_SECOND import edu.ie3.datamodel.exceptions.DuplicateEntitiesException -import edu.ie3.datamodel.exceptions.ValidationException import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.AssetInput From 82e88ca9eaa1710ae3786eae47231ba9d27c0f1c Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 8 Aug 2024 17:05:05 +0200 Subject: [PATCH 051/310] add attributes pThermalRated to cylindricalstorage and housingType, numberInhabitants to ThermalHouse --- CHANGELOG.md | 3 ++ .../input/thermal/cylindricalstorage.md | 4 ++ .../models/input/thermal/thermalhouse.md | 8 +++ .../input/CylindricalStorageInputFactory.java | 11 +++- .../input/ThermalHouseInputFactory.java | 16 +++++- .../thermal/CylindricalStorageInput.java | 41 ++++++++++++-- .../input/thermal/ThermalHouseInput.java | 54 +++++++++++++++++-- .../ThermalUnitValidationUtils.java | 30 ++++++++++- .../io/extractor/ExtractorTest.groovy | 8 +-- .../CylindricalStorageInputFactoryTest.groovy | 4 +- .../input/ThermalHouseInputFactoryTest.groovy | 7 ++- .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../csv/CsvSystemParticipantSourceTest.groovy | 4 ++ .../io/source/csv/CsvThermalSourceTest.groovy | 6 +++ .../CylindricalStorageInputTest.groovy | 5 +- .../thermal/ThermalHouseInputTest.groovy | 5 +- .../ThermalUnitValidationUtilsTest.groovy | 29 ++++++---- .../common/SystemParticipantTestData.groovy | 8 ++- .../common/ThermalUnitInputTestData.groovy | 15 ++++-- .../cylindrical_storage_input.csv | 4 +- .../_thermal/cylindrical_storage_input.csv | 4 +- .../csv/_thermal/thermal_house_input.csv | 4 +- 22 files changed, 225 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 083590698..1f7a70dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ConnectorValidationUtils` checks if parallel devices is > 0 [#1077](https://github.com/ie3-institute/PowerSystemDataModel/issues/1077) - `GridContainerValidationUtils` checks the connectivity for all defined operation time intervals [#1091](https://github.com/ie3-institute/PowerSystemDataModel/issues/1091) - Implemented a `CongestionResult` [#1097](https://github.com/ie3-institute/PowerSystemDataModel/issues/1097) +- Attribute `pThermalRated` for `ThermalStorage`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) +- Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) +- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) ### Fixed - Fixed `MappingEntryies` not getting processed by adding `Getter` methods for record fields [#1084](https://github.com/ie3-institute/PowerSystemDataModel/issues/1084) diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 553f63d3e..6d4b0d3a5 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -55,6 +55,10 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. * - c - kWh / (K :math:`\cdot` m³) - Specific heat capacity of the storage medium + + * - pThermalMax + - kW + - Maximum permissible thermal power of the storage ``` diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index d06a1f59c..018319d9e 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -56,6 +56,14 @@ This reflects a simple shoe box with transmission losses * - lowerTemperatureLimit - °C - Lower temperature boundary + + * - housingType + - -- + - Type of building can either be house or flat + + * - numberInhabititans + - # + - Number of people living in the house ``` diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 3b423465c..be49eadb0 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -12,6 +12,7 @@ import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; import java.util.UUID; +import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; @@ -23,6 +24,7 @@ public class CylindricalStorageInputFactory private static final String INLET_TEMP = "inletTemp"; private static final String RETURN_TEMP = "returnTemp"; private static final String C = "c"; + private static final String P_THERMAL_MAX = "pThermalMax"; public CylindricalStorageInputFactory() { super(CylindricalStorageInput.class); @@ -30,7 +32,9 @@ public CylindricalStorageInputFactory() { @Override protected String[] getAdditionalFields() { - return new String[] {STORAGE_VOLUME_LVL, STORAGE_VOLUME_LVL_MIN, INLET_TEMP, RETURN_TEMP, C}; + return new String[] { + STORAGE_VOLUME_LVL, STORAGE_VOLUME_LVL_MIN, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX + }; } @Override @@ -51,6 +55,8 @@ protected CylindricalStorageInput buildModel( data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); final ComparableQuantity c = data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); + final ComparableQuantity pThermalMax = + data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); return new CylindricalStorageInput( uuid, id, @@ -61,6 +67,7 @@ protected CylindricalStorageInput buildModel( storageVolumeLvlMin, inletTemp, returnTemp, - c); + c, + pThermalMax); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java index 6fab0fc61..69533c930 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java @@ -23,6 +23,8 @@ public class ThermalHouseInputFactory private static final String TARGET_TEMPERATURE = "targetTemperature"; private static final String UPPER_TEMPERATURE_LIMIT = "upperTemperatureLimit"; private static final String LOWER_TEMPERATURE_LIMIT = "lowerTemperatureLimit"; + private static final String HOUSING_TYPE = "housingType"; + private static final String NUMBER_INHABITANTS = "numberInhabitants"; public ThermalHouseInputFactory() { super(ThermalHouseInput.class); @@ -31,7 +33,13 @@ public ThermalHouseInputFactory() { @Override protected String[] getAdditionalFields() { return new String[] { - ETH_LOSSES, ETH_CAPA, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT + ETH_LOSSES, + ETH_CAPA, + TARGET_TEMPERATURE, + UPPER_TEMPERATURE_LIMIT, + LOWER_TEMPERATURE_LIMIT, + HOUSING_TYPE, + NUMBER_INHABITANTS }; } @@ -53,6 +61,8 @@ protected ThermalHouseInput buildModel( data.getQuantity(UPPER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); final ComparableQuantity lowerTemperatureLimit = data.getQuantity(LOWER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); + final String housingType = data.getField(HOUSING_TYPE); + final Integer numberInhabitants = data.getInt(NUMBER_INHABITANTS); return new ThermalHouseInput( uuid, id, @@ -63,6 +73,8 @@ protected ThermalHouseInput buildModel( ethCapa, targetTemperature, upperTemperatureLimit, - lowerTemperatureLimit); + lowerTemperatureLimit, + housingType, + numberInhabitants); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 611c48e0a..d505323f0 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -11,6 +11,7 @@ import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; import java.util.Objects; import java.util.UUID; +import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; @@ -27,6 +28,8 @@ public class CylindricalStorageInput extends ThermalStorageInput { private final ComparableQuantity returnTemp; /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ private final ComparableQuantity c; + /** Maximum permissible thermal power (typically in kW) */ + private final ComparableQuantity pThermalMax; /** * @param uuid Unique identifier of a cylindrical storage @@ -39,6 +42,7 @@ public class CylindricalStorageInput extends ThermalStorageInput { * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage */ public CylindricalStorageInput( UUID uuid, @@ -50,13 +54,15 @@ public CylindricalStorageInput( ComparableQuantity storageVolumeLvlMin, ComparableQuantity inletTemp, ComparableQuantity returnTemp, - ComparableQuantity c) { + ComparableQuantity c, + ComparableQuantity pThermalMax) { super(uuid, id, operator, operationTime, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } /** @@ -68,6 +74,7 @@ public CylindricalStorageInput( * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage */ public CylindricalStorageInput( UUID uuid, @@ -77,13 +84,15 @@ public CylindricalStorageInput( ComparableQuantity storageVolumeLvlMin, ComparableQuantity inletTemp, ComparableQuantity returnTemp, - ComparableQuantity c) { + ComparableQuantity c, + ComparableQuantity pThermalMax) { super(uuid, id, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } public ComparableQuantity getStorageVolumeLvl() { @@ -106,6 +115,10 @@ public ComparableQuantity getC() { return c; } + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + @Override public CylindricalStorageInputCopyBuilder copy() { return new CylindricalStorageInputCopyBuilder(this); @@ -120,13 +133,20 @@ public boolean equals(Object o) { && storageVolumeLvlMin.equals(that.storageVolumeLvlMin) && inletTemp.equals(that.inletTemp) && returnTemp.equals(that.returnTemp) - && c.equals(that.c); + && c.equals(that.c) + && pThermalMax.equals(that.pThermalMax); } @Override public int hashCode() { return Objects.hash( - super.hashCode(), storageVolumeLvl, storageVolumeLvlMin, inletTemp, returnTemp, c); + super.hashCode(), + storageVolumeLvl, + storageVolumeLvlMin, + inletTemp, + returnTemp, + c, + pThermalMax); } @Override @@ -152,6 +172,8 @@ public String toString() { + returnTemp + ", c=" + c + + ", pThermalMax=" + + pThermalMax + '}'; } @@ -168,6 +190,7 @@ public static class CylindricalStorageInputCopyBuilder private ComparableQuantity inletTemp; private ComparableQuantity returnTemp; private ComparableQuantity c; + private ComparableQuantity pThermalMax; private CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); @@ -176,6 +199,7 @@ private CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { this.inletTemp = entity.getInletTemp(); this.returnTemp = entity.getReturnTemp(); this.c = entity.getC(); + this.pThermalMax = entity.getpThermalMax(); } public CylindricalStorageInputCopyBuilder storageVolumeLvl( @@ -206,10 +230,16 @@ public CylindricalStorageInputCopyBuilder c(ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return this; + } + @Override public CylindricalStorageInputCopyBuilder scale(Double factor) { storageVolumeLvl(storageVolumeLvl.multiply(factor)); storageVolumeLvlMin(storageVolumeLvlMin.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); return this; } @@ -225,7 +255,8 @@ public CylindricalStorageInput build() { storageVolumeLvlMin, inletTemp, returnTemp, - c); + c, + pThermalMax); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index b0fbab0b6..a92e54da8 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -27,6 +27,10 @@ public class ThermalHouseInput extends ThermalSinkInput { private final ComparableQuantity upperTemperatureLimit; /** Lower boundary temperature of the thermal house model (typically in °C) */ private final ComparableQuantity lowerTemperatureLimit; + /** Type of the building, e.g. house or flat */ + private final String housingType; + /** Number of people living in the building */ + private final Integer numberInhabitants; /** * @param uuid Unique identifier of a thermal house model @@ -46,13 +50,17 @@ public ThermalHouseInput( ComparableQuantity ethCapa, ComparableQuantity targetTemperature, ComparableQuantity upperTemperatureLimit, - ComparableQuantity lowerTemperatureLimit) { + ComparableQuantity lowerTemperatureLimit, + String housingType, + Integer numberInhabitants) { super(uuid, id, bus); this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); this.targetTemperature = targetTemperature.to(StandardUnits.TEMPERATURE); this.upperTemperatureLimit = upperTemperatureLimit.to(StandardUnits.TEMPERATURE); this.lowerTemperatureLimit = lowerTemperatureLimit.to(StandardUnits.TEMPERATURE); + this.housingType = housingType; + this.numberInhabitants = numberInhabitants; } /** @@ -77,13 +85,17 @@ public ThermalHouseInput( ComparableQuantity ethCapa, ComparableQuantity targetTemperature, ComparableQuantity upperTemperatureLimit, - ComparableQuantity lowerTemperatureLimit) { + ComparableQuantity lowerTemperatureLimit, + String housingType, + Integer numberInhabitants) { super(uuid, id, operator, operationTime, bus); this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); this.targetTemperature = targetTemperature.to(StandardUnits.TEMPERATURE); this.upperTemperatureLimit = upperTemperatureLimit.to(StandardUnits.TEMPERATURE); this.lowerTemperatureLimit = lowerTemperatureLimit.to(StandardUnits.TEMPERATURE); + this.housingType = housingType; + this.numberInhabitants = numberInhabitants; } public ComparableQuantity getEthLosses() { @@ -106,6 +118,14 @@ public ComparableQuantity getLowerTemperatureLimit() { return lowerTemperatureLimit; } + public String getHousingType() { + return housingType; + } + + public Integer getNumberOfInhabitants() { + return numberInhabitants; + } + @Override public ThermalHouseInputCopyBuilder copy() { return new ThermalHouseInputCopyBuilder(this); @@ -120,7 +140,9 @@ public boolean equals(Object o) { && ethCapa.equals(that.ethCapa) && targetTemperature.equals(that.targetTemperature) && upperTemperatureLimit.equals(that.upperTemperatureLimit) - && lowerTemperatureLimit.equals(that.lowerTemperatureLimit); + && lowerTemperatureLimit.equals(that.lowerTemperatureLimit) + && Objects.equals(housingType, that.housingType) + && Objects.equals(numberInhabitants, that.numberInhabitants); } @Override @@ -131,7 +153,9 @@ public int hashCode() { ethCapa, targetTemperature, upperTemperatureLimit, - lowerTemperatureLimit); + lowerTemperatureLimit, + housingType, + numberInhabitants); } @Override @@ -157,6 +181,10 @@ public String toString() { + upperTemperatureLimit + ", lowerTemperatureLimit=" + lowerTemperatureLimit + + ", housingType=" + + housingType + + ", numberInhabitants=" + + numberInhabitants + '}'; } @@ -173,6 +201,8 @@ public static class ThermalHouseInputCopyBuilder private ComparableQuantity targetTemperature; private ComparableQuantity upperTemperatureLimit; private ComparableQuantity lowerTemperatureLimit; + private String housingType; + private Integer numberInhabitants; private ThermalHouseInputCopyBuilder(ThermalHouseInput entity) { super(entity); @@ -181,6 +211,8 @@ private ThermalHouseInputCopyBuilder(ThermalHouseInput entity) { this.targetTemperature = entity.getTargetTemperature(); this.upperTemperatureLimit = entity.getUpperTemperatureLimit(); this.lowerTemperatureLimit = entity.getLowerTemperatureLimit(); + this.housingType = entity.getHousingType(); + this.numberInhabitants = entity.getNumberOfInhabitants(); } public ThermalHouseInputCopyBuilder ethLosses( @@ -212,6 +244,16 @@ public ThermalHouseInputCopyBuilder lowerTemperatureLimit( return this; } + public ThermalHouseInputCopyBuilder housingType(String housingType) { + this.housingType = housingType; + return this; + } + + public ThermalHouseInputCopyBuilder numberInhabitants(Integer numberInhabitants) { + this.numberInhabitants = numberInhabitants; + return this; + } + @Override public ThermalHouseInputCopyBuilder scale(Double factor) { // scale losses as well as capacity to keep equal @@ -233,7 +275,9 @@ public ThermalHouseInput build() { ethCapa, targetTemperature, upperTemperatureLimit, - lowerTemperatureLimit); + lowerTemperatureLimit, + housingType, + numberInhabitants); } @Override diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 704567699..89c9f91c7 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -12,6 +12,7 @@ import edu.ie3.datamodel.utils.Try.Failure; import java.util.ArrayList; import java.util.List; +import java.util.Set; import javax.measure.Quantity; public class ThermalUnitValidationUtils extends ValidationUtils { @@ -135,6 +136,8 @@ private ThermalUnitValidationUtils() { *
  • its thermal capacity is positive *
  • its upper temperature limit is higher than the lower temperature limit *
  • its target temperature lies between the upper und lower limit temperatures + *
  • its housing type is either `house` or `flat` + *
  • its number of inhabitants is higher than zero * * * @param thermalHouseInput ThermalHouseInput to validate @@ -173,9 +176,33 @@ private static List> checkThermalHouse( thermalHouseInput))); } + if (!isValidHousingType(thermalHouseInput.getHousingType())) { + exceptions.add( + new Failure<>( + new InvalidEntityException( + "Housing type must be either 'house' or 'flat'", thermalHouseInput))); + } + + if (thermalHouseInput.getNumberOfInhabitants() <= 0) { + exceptions.add( + new Failure<>( + new InvalidEntityException( + "Number of inhabitants must be greater than zero", thermalHouseInput))); + } + return exceptions; } + /** + * Checks if the housing type is valid (either "house" or "flat"). + * + * @param housingType The housing type to check + * @return true if valid, false otherwise + */ + private static boolean isValidHousingType(String housingType) { + return Set.of("house", "flat").contains(housingType.toLowerCase()); + } + /** * Validates a cylindricalStorageInput if: * @@ -231,7 +258,8 @@ private static List> checkCylindricalStorage( new Quantity[] { cylindricalStorageInput.getStorageVolumeLvl(), cylindricalStorageInput.getStorageVolumeLvlMin(), - cylindricalStorageInput.getC() + cylindricalStorageInput.getC(), + cylindricalStorageInput.getpThermalMax() }, cylindricalStorageInput), InvalidEntityException.class)); diff --git a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index be1cf541d..9c4968164 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -134,10 +134,10 @@ class ExtractorTest extends Specification { tutd.thermalBus.operator ] - tutd.cylindricStorageInput || [ - tutd.cylindricStorageInput.operator, - tutd.cylindricStorageInput.thermalBus, - tutd.cylindricStorageInput.thermalBus.operator + tutd.cylindricalStorageInput || [ + tutd.cylindricalStorageInput.operator, + tutd.cylindricalStorageInput.thermalBus, + tutd.cylindricalStorageInput.thermalBus.operator ] tutd.thermalHouseInput || [ diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy index cf75e1188..fe9b4d21b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy @@ -35,7 +35,8 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto "storagevolumelvlmin": "4", "inlettemp" : "5", "returntemp" : "6", - "c" : "7" + "c" : "7", + "pThermalMax" : "8" ] def inputClass = CylindricalStorageInput def thermalBusInput = Mock(ThermalBusInput) @@ -57,6 +58,7 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) + assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy index 82c0e7843..07f5794fd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy @@ -35,7 +35,10 @@ class ThermalHouseInputFactoryTest extends Specification implements FactoryTestH "ethcapa" : "4", "targetTemperature" : "5", "upperTemperatureLimit": "6", - "lowerTemperatureLimit": "7" + "lowerTemperatureLimit": "7", + "housingType" : "flat", + "numberInhabitants" : "9", + ] def inputClass = ThermalHouseInput def thermalBusInput = Mock(ThermalBusInput) @@ -57,6 +60,8 @@ class ThermalHouseInputFactoryTest extends Specification implements FactoryTestH assert targetTemperature == getQuant(parameter["targetTemperature"], StandardUnits.TEMPERATURE) assert upperTemperatureLimit == getQuant(parameter["upperTemperatureLimit"], StandardUnits.TEMPERATURE) assert lowerTemperatureLimit == getQuant(parameter["lowerTemperatureLimit"], StandardUnits.TEMPERATURE) + assert housingType == parameter["housingType"] + assert numberInhabitants == parameter["numberInhabitants"].toInteger() } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 2914504c4..773f53c53 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -165,7 +165,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { GridTestData.transformerCtoG, GridTestData.lineGraphicCtoD, GridTestData.nodeGraphicC, - ThermalUnitInputTestData.cylindricStorageInput, + ThermalUnitInputTestData.cylindricalStorageInput, ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index 67316ab30..197d2644b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -10,9 +10,13 @@ import static edu.ie3.test.helper.EntityMap.map import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.exceptions.SystemParticipantsException import edu.ie3.datamodel.io.source.* +import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData as sptd +import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity import spock.lang.Specification +import tech.units.indriya.ComparableQuantity +import tech.units.indriya.quantity.Quantities class CsvSystemParticipantSourceTest extends Specification implements CsvTestDataMeta { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index 7351cf1a2..b54c719c7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -10,6 +10,7 @@ import edu.ie3.datamodel.io.source.ThermalSource import edu.ie3.datamodel.io.source.TypeSource import edu.ie3.test.common.SystemParticipantTestData as sptd import edu.ie3.test.common.ThermalUnitInputTestData +import org.apache.commons.compress.harmony.unpack200.bytecode.forms.ThisMethodRefForm import spock.lang.Specification class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { @@ -69,6 +70,7 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { inletTemp == sptd.inletTemp returnTemp == sptd.returnTemp c == sptd.c + pThermalMax == sptd.pThermalMax } //test method when operators and thermal buses are provided as constructor parameters @@ -116,6 +118,8 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + housingType == ThermalUnitInputTestData.thermalHouseInput.housingType + numberOfInhabitants == ThermalUnitInputTestData.thermalHouseInput.numberOfInhabitants } //test method when operators and thermal buses are provided as constructor parameters @@ -136,6 +140,8 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + housingType == ThermalUnitInputTestData.thermalHouseInput.housingType + numberOfInhabitants == ThermalUnitInputTestData.thermalHouseInput.numberOfInhabitants } } } \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy index 815876368..869175bd5 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy @@ -13,7 +13,7 @@ class CylindricalStorageInputTest extends Specification { def "A CylindricalStorageInput copy method should work as expected"() { given: - def cylindricalStorageInput = ThermalUnitInputTestData.cylindricStorageInput + def cylindricalStorageInput = ThermalUnitInputTestData.cylindricalStorageInput when: def alteredUnit = cylindricalStorageInput.copy().storageVolumeLvl(ThermalUnitInputTestData.storageVolumeLvl) @@ -39,7 +39,7 @@ class CylindricalStorageInputTest extends Specification { def "Scaling a CylindricalStorageInput via builder should work as expected"() { given: - def cylindricalStorageInput = ThermalUnitInputTestData.cylindricStorageInput + def cylindricalStorageInput = ThermalUnitInputTestData.cylindricalStorageInput when: def alteredUnit = cylindricalStorageInput.copy().scale(2d).build() @@ -56,6 +56,7 @@ class CylindricalStorageInputTest extends Specification { assert inletTemp == cylindricalStorageInput.inletTemp assert returnTemp == cylindricalStorageInput.returnTemp assert c == cylindricalStorageInput.c + assert pThermalMax == cylindricalStorageInput.pThermalMax * 2d } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy index d2f9c5afd..7f93dab21 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy @@ -67,7 +67,10 @@ class ThermalHouseInputTest extends Specification { Quantities.getQuantity(20, StandardUnits.HEAT_CAPACITY), Quantities.getQuantity(20, StandardUnits.TEMPERATURE), Quantities.getQuantity(25, StandardUnits.TEMPERATURE), - Quantities.getQuantity(15, StandardUnits.TEMPERATURE)) + Quantities.getQuantity(15, StandardUnits.TEMPERATURE), + "house", + 2 + ) expect: thermalHouseInput.targetTemperature == Quantities.getQuantity(20, StandardUnits.TEMPERATURE) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy index 5c1de7967..4507b9d3d 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy @@ -16,6 +16,7 @@ import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import edu.ie3.test.common.ThermalUnitInputTestData import edu.ie3.util.TimeUtil +import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.quantities.interfaces.HeatCapacity import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity import edu.ie3.util.quantities.interfaces.ThermalConductance @@ -23,6 +24,7 @@ import spock.lang.Specification import tech.units.indriya.ComparableQuantity import tech.units.indriya.quantity.Quantities +import javax.measure.quantity.Power import javax.measure.quantity.Temperature import javax.measure.quantity.Volume @@ -43,6 +45,8 @@ class ThermalUnitValidationUtilsTest extends Specification { private static final ComparableQuantity TARGET_TEMPERATURE = Quantities.getQuantity(20, StandardUnits.TEMPERATURE) private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) + private static final String HOUSING_TYPE = "House" + private static final Integer NUMBER_INHABITANTS = 2 // Specific data for thermal cylindric storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) @@ -50,6 +54,7 @@ class ThermalUnitValidationUtilsTest extends Specification { private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) + private static final ComparableQuantity pThermalMax = Quantities.getQuantity(10.2, StandardUnits.ACTIVE_POWER_IN) // Thermal House @@ -75,19 +80,21 @@ class ThermalUnitValidationUtilsTest extends Specification { ex.message == expectedException.message where: - invalidThermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-10, StandardUnits.THERMAL_TRANSMISSION), ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("The following quantities have to be zero or positive: -10 kW/K", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, Quantities.getQuantity(0, StandardUnits.HEAT_CAPACITY), TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("The following quantities have to be positive: 0 kWh/K", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, Quantities.getQuantity(30, StandardUnits.TEMPERATURE)) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + invalidThermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-10, StandardUnits.THERMAL_TRANSMISSION), ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("The following quantities have to be zero or positive: -10 kW/K", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, Quantities.getQuantity(0, StandardUnits.HEAT_CAPACITY), TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("The following quantities have to be positive: 0 kWh/K", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, Quantities.getQuantity(30, StandardUnits.TEMPERATURE), HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "someWrongType", NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Housing type must be either 'house' or 'flat'", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, 0) || 1 || new InvalidEntityException("Number of inhabitants must be greater than zero", invalidThermalHouse) } // Thermal Cylindrical Storage def "Smoke Test: Correct thermal cylindrical storage throws no exception"() { given: - def cylindricalStorageInput = ThermalUnitInputTestData.cylindricStorageInput + def cylindricalStorageInput = ThermalUnitInputTestData.cylindricalStorageInput when: ValidationUtils.check(cylindricalStorageInput) @@ -107,9 +114,9 @@ class ThermalUnitValidationUtilsTest extends Specification { ex.message == expectedException.message where: - invalidCylindricalStorage || expectedSize || expectedException - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, storageVolumeLvlMin, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(100, StandardUnits.VOLUME), Quantities.getQuantity(200, StandardUnits.VOLUME), inletTemp, returnTemp, c) || 1 || new InvalidEntityException("Minimum permissible storage volume of the cylindrical storage cannot be higher than overall available storage volume", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), Quantities.getQuantity(-200, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -200 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) + invalidCylindricalStorage || expectedSize || expectedException + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, storageVolumeLvlMin, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c, pThermalMax) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(100, StandardUnits.VOLUME), Quantities.getQuantity(200, StandardUnits.VOLUME), inletTemp, returnTemp, c, pThermalMax) || 1 || new InvalidEntityException("Minimum permissible storage volume of the cylindrical storage cannot be higher than overall available storage volume", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), Quantities.getQuantity(-200, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -200 ㎥, -1.05 kWh/K*m³, -20 kW", invalidCylindricalStorage) } } diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index eca3b3d39..c5d0ceb77 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -27,6 +27,7 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.profile.StandardLoadProfile import edu.ie3.util.TimeUtil import edu.ie3.util.quantities.interfaces.* +import org.testcontainers.shaded.org.checkerframework.checker.units.qual.A import tech.units.indriya.ComparableQuantity import tech.units.indriya.quantity.Quantities @@ -174,6 +175,9 @@ class SystemParticipantTestData { public static final ComparableQuantity returnTemp = Quantities.getQuantity(80, TEMPERATURE) public static final ComparableQuantity c = Quantities.getQuantity( 1, SPECIFIC_HEAT_CAPACITY) + public static final ComparableQuantity pThermalMax = Quantities.getQuantity( + 20, ACTIVE_POWER_IN) + public static final ThermalStorageInput thermalStorage = new CylindricalStorageInput( UUID.fromString("8851813b-3a7d-4fee-874b-4df9d724e4b3"), "test_cylindricThermalStorage", @@ -184,7 +188,9 @@ class SystemParticipantTestData { storageVolumeLvlMin, inletTemp, returnTemp, - c + c, + pThermalMax + ) public static final ChpInput chpInput = new ChpInput( diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index 2802dc2da..1f132d43a 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -36,6 +36,9 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { private static final ComparableQuantity TARGET_TEMPERATURE = Quantities.getQuantity(20, StandardUnits.TEMPERATURE) private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) + private static final String HOUSING_TYPE = "house" + private static final Integer NUMBER_INHABITANTS = 2 + public static final thermalHouseInput = new ThermalHouseInput( thermalUnitUuid, "test_thermalHouseInput", @@ -46,16 +49,19 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, - LOWER_TEMPERATURE_LIMIT) + LOWER_TEMPERATURE_LIMIT, + HOUSING_TYPE, + NUMBER_INHABITANTS) - // thermal cylindric storage input + // thermal cylindrical storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) private static final ComparableQuantity storageVolumeLvlMin = Quantities.getQuantity(10, StandardUnits.VOLUME) private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) + private static final ComparableQuantity pThermalMax = Quantities.getQuantity(20, StandardUnits.ACTIVE_POWER_IN) - public static final cylindricStorageInput = new CylindricalStorageInput( + public static final cylindricalStorageInput = new CylindricalStorageInput( thermalUnitUuid, "test_cylindricStorageInput", operator, @@ -65,5 +71,6 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { storageVolumeLvlMin, inletTemp, returnTemp, - c) + c, + pThermalMax) } diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv index 325d29445..0b0114091 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ -uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus,em -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 +uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,p_thermal_max,thermal_bus,em +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,20.0,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv index 4a11cda89..690c43217 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ -uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e +uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus,p_thermal_max +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e, 20.0 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv index a1a8cdbdc..9316f54b7 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv @@ -1,2 +1,2 @@ -uuid,id,operates_from,operates_until,operator,thermal_bus,eth_losses,eth_capa,target_temperature,upper_temperature_limit,lower_temperature_limit -717af017-cc69-406f-b452-e022d7fb516a,"test_thermalHouseInput",2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,0d95d7f2-49fb-4d49-8636-383a5220384e,10,20,20,25,15 \ No newline at end of file +uuid,id,operates_from,operates_until,operator,thermal_bus,eth_losses,eth_capa,target_temperature,upper_temperature_limit,lower_temperature_limit,housing_type,number_inhabitants +717af017-cc69-406f-b452-e022d7fb516a,"test_thermalHouseInput",2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,0d95d7f2-49fb-4d49-8636-383a5220384e,10,20,20,25,15,"house",2 \ No newline at end of file From 98c7e2f59dacddd3c2107a9abe3e8091a813f10c Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 8 Aug 2024 17:09:44 +0200 Subject: [PATCH 052/310] fmt --- docs/readthedocs/models/input/thermal/thermalhouse.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index 018319d9e..02b8e0e1e 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -57,11 +57,11 @@ This reflects a simple shoe box with transmission losses - °C - Lower temperature boundary - * - housingType + * - housingType - -- - Type of building can either be house or flat - * - numberInhabititans + * - numberInhabititans - # - Number of people living in the house From 1f05eebf43395b1eab785b5697507eb14b2547d2 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 8 Aug 2024 17:14:50 +0200 Subject: [PATCH 053/310] codacy --- .../io/source/csv/CsvSystemParticipantSourceTest.groovy | 8 ++------ .../edu/ie3/test/common/ThermalUnitInputTestData.groovy | 4 ++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index 197d2644b..b4c9ad0fa 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -5,18 +5,14 @@ */ package edu.ie3.datamodel.io.source.csv -import static edu.ie3.test.helper.EntityMap.map - import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.exceptions.SystemParticipantsException import edu.ie3.datamodel.io.source.* -import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData as sptd -import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity import spock.lang.Specification -import tech.units.indriya.ComparableQuantity -import tech.units.indriya.quantity.Quantities + +import static edu.ie3.test.helper.EntityMap.map class CsvSystemParticipantSourceTest extends Specification implements CsvTestDataMeta { diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index 1f132d43a..c52dcc100 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -41,7 +41,7 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { public static final thermalHouseInput = new ThermalHouseInput( thermalUnitUuid, - "test_thermalHouseInput", + "testThermalHouseInput", operator, operationTime, thermalBus, @@ -63,7 +63,7 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { public static final cylindricalStorageInput = new CylindricalStorageInput( thermalUnitUuid, - "test_cylindricStorageInput", + "testCylindricStorageInput", operator, operationTime, thermalBus, From 25cbcc1b6f14a1811f8407d609b2db8d63c9f8fc Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 8 Aug 2024 17:16:10 +0200 Subject: [PATCH 054/310] fmt --- .../io/source/csv/CsvSystemParticipantSourceTest.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index b4c9ad0fa..67316ab30 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.io.source.csv +import static edu.ie3.test.helper.EntityMap.map + import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.exceptions.SystemParticipantsException import edu.ie3.datamodel.io.source.* @@ -12,8 +14,6 @@ import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData as sptd import spock.lang.Specification -import static edu.ie3.test.helper.EntityMap.map - class CsvSystemParticipantSourceTest extends Specification implements CsvTestDataMeta { def "A SystemParticipantSource with csv input should provide an instance of SystemParticipants based on valid input data correctly"() { From ed0bb52860cb022ff3a19ec2722477dceba339ac Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 8 Aug 2024 17:19:51 +0200 Subject: [PATCH 055/310] fix test after codacy fix --- .../datamodel/io/source/csv/_thermal/thermal_house_input.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv index 9316f54b7..87dcf4374 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv @@ -1,2 +1,2 @@ uuid,id,operates_from,operates_until,operator,thermal_bus,eth_losses,eth_capa,target_temperature,upper_temperature_limit,lower_temperature_limit,housing_type,number_inhabitants -717af017-cc69-406f-b452-e022d7fb516a,"test_thermalHouseInput",2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,0d95d7f2-49fb-4d49-8636-383a5220384e,10,20,20,25,15,"house",2 \ No newline at end of file +717af017-cc69-406f-b452-e022d7fb516a,"testThermalHouseInput",2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,0d95d7f2-49fb-4d49-8636-383a5220384e,10,20,20,25,15,"house",2 \ No newline at end of file From e1cb1b3eadb1156d4533b2b1c488096e67f35f67 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 09:36:56 +0200 Subject: [PATCH 056/310] add domesticHotWaterStorage --- .../input/thermal/domestichotwaterstorage.md | 68 +++++ docs/readthedocs/models/models.md | 1 + .../DomesticHotWaterStorageInputFactory.java | 73 +++++ .../processor/input/InputEntityProcessor.java | 3 + .../datamodel/io/source/ThermalSource.java | 60 +++- .../io/source/csv/CsvThermalGridSource.java | 20 +- .../models/input/container/ThermalGrid.java | 60 +++- .../thermal/DomesticHotWaterStorageInput.java | 269 ++++++++++++++++++ .../input/thermal/ThermalHouseInput.java | 7 +- .../io/processor/ProcessorProviderTest.groovy | 2 + .../datamodel/io/sink/CsvFileSinkTest.groovy | 45 +-- .../csv/CsvThermalGridSourceTest.groovy | 3 +- .../input/container/ThermalGridTest.groovy | 27 +- .../DomesticHotWaterStorageInputTest.groovy | 62 ++++ .../common/ThermalUnitInputTestData.groovy | 17 +- 15 files changed, 659 insertions(+), 58 deletions(-) create mode 100644 docs/readthedocs/models/input/thermal/domestichotwaterstorage.md create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java create mode 100644 src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy diff --git a/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md b/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md new file mode 100644 index 000000000..6d4ad99f9 --- /dev/null +++ b/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md @@ -0,0 +1,68 @@ +(domestichotwaterstorage-model)= + +# Domestic Hot Water Storage + +Model of a domestic hot water storage using a fluent to store thermal energy. + +## Attributes, Units and Remarks + +```{eval-rst} +.. list-table:: + :widths: 33 33 33 + :header-rows: 1 + + + * - Attribute + - Unit + - Remarks + + * - uuid + - -- + - + + * - id + - -- + - Human readable identifier + + * - operator + - -- + - + + * - operationTime + - -- + - Timely restriction of operation + + * - thermalBus + - -- + - Connection point to the thermal system + + * - storageVolumeLvl + - m³ + - Overall available storage volume + + * - storageVolumeLvlMin + - m³ + - Minimum permissible storage volume + + * - inletTemp + - °C + - Temperature of the inlet + + * - returnTemp + - °C + - Temperature of the outlet + + * - c + - kWh / (K :math:`\cdot` m³) + - Specific heat capacity of the storage medium + + * - pThermalMax + - kW + - Maximum permissible thermal power of the storage + +``` + +## Caveats + +Nothing - at least not known. +If you found something, please contact us! diff --git a/docs/readthedocs/models/models.md b/docs/readthedocs/models/models.md index 56c314ac9..f49d958b6 100644 --- a/docs/readthedocs/models/models.md +++ b/docs/readthedocs/models/models.md @@ -129,6 +129,7 @@ maxdepth: 1 input/thermal/thermalbus input/thermal/thermalhouse input/thermal/cylindricalstorage +input/thermal/domestichotwaterstorage ``` ### Participant Related Models diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java new file mode 100644 index 000000000..b311d7f27 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java @@ -0,0 +1,73 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.input; + +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput; +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; +import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; +import java.util.UUID; +import javax.measure.quantity.Power; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Volume; +import tech.units.indriya.ComparableQuantity; + +public class DomesticHotWaterStorageInputFactory + extends AssetInputEntityFactory { + private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; + private static final String STORAGE_VOLUME_LVL_MIN = "storageVolumeLvlMin"; + private static final String INLET_TEMP = "inletTemp"; + private static final String RETURN_TEMP = "returnTemp"; + private static final String C = "c"; + private static final String P_THERMAL_MAX = "pThermalMax"; + + public DomesticHotWaterStorageInputFactory() { + super(DomesticHotWaterStorageInput.class); + } + + @Override + protected String[] getAdditionalFields() { + return new String[] { + STORAGE_VOLUME_LVL, STORAGE_VOLUME_LVL_MIN, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX + }; + } + + @Override + protected DomesticHotWaterStorageInput buildModel( + ThermalUnitInputEntityData data, + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime) { + final ThermalBusInput bus = data.getBusInput(); + final ComparableQuantity storageVolumeLvl = + data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); + final ComparableQuantity storageVolumeLvlMin = + data.getQuantity(STORAGE_VOLUME_LVL_MIN, StandardUnits.VOLUME); + final ComparableQuantity inletTemp = + data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); + final ComparableQuantity returnTemp = + data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); + final ComparableQuantity c = + data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); + final ComparableQuantity pThermalMax = + data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); + return new DomesticHotWaterStorageInput( + uuid, + id, + operator, + operationTime, + bus, + storageVolumeLvl, + storageVolumeLvlMin, + inletTemp, + returnTemp, + c, + pThermalMax); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index d21212531..9c6eaa892 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -18,6 +18,7 @@ import edu.ie3.datamodel.models.input.system.*; import edu.ie3.datamodel.models.input.system.type.*; import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; import java.util.List; @@ -61,6 +62,8 @@ public class InputEntityProcessor extends EntityProcessor { /* -- ThermalUnitInput */ ThermalHouseInput.class, CylindricalStorageInput.class, + DomesticHotWaterStorageInput.class, + /* - GraphicInput */ NodeGraphicInput.class, LineGraphicInput.class, diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index f3334600d..3da565756 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -9,10 +9,7 @@ import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.input.*; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; -import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; +import edu.ie3.datamodel.models.input.thermal.*; import edu.ie3.datamodel.utils.Try; import java.util.Map; import java.util.Set; @@ -34,6 +31,7 @@ public class ThermalSource extends AssetEntitySource { // factories private final ThermalBusInputFactory thermalBusInputFactory; private final CylindricalStorageInputFactory cylindricalStorageInputFactory; + private final DomesticHotWaterStorageInputFactory domesticHotWaterStorageInputFactory; private final ThermalHouseInputFactory thermalHouseInputFactory; // enriching function @@ -51,6 +49,7 @@ public ThermalSource(TypeSource typeSource, DataSource dataSource) { this.thermalBusInputFactory = new ThermalBusInputFactory(); this.cylindricalStorageInputFactory = new CylindricalStorageInputFactory(); + this.domesticHotWaterStorageInputFactory = new DomesticHotWaterStorageInputFactory(); this.thermalHouseInputFactory = new ThermalHouseInputFactory(); } @@ -60,6 +59,10 @@ public void validate() throws ValidationException { Stream.of( validate(ThermalBusInput.class, dataSource, thermalBusInputFactory), validate(CylindricalStorageInput.class, dataSource, cylindricalStorageInputFactory), + validate( + DomesticHotWaterStorageInput.class, + dataSource, + domesticHotWaterStorageInputFactory), validate(ThermalHouseInput.class, dataSource, thermalHouseInputFactory)), "Validation") .transformF(FailedValidationException::new) @@ -122,6 +125,7 @@ public Map getThermalBuses(Map opera */ public Map getThermalStorages() throws SourceException { return getCylindricalStorages().stream().collect(toMap()); + // FIXME } /** @@ -214,6 +218,23 @@ public Set getCylindricalStorages() throws SourceExcept return getCylindricalStorages(operators, thermalBuses); } + /** + * Returns a unique set of {@link DomesticHotWaterStorageInput} instances. + * + *

    This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link DomesticHotWaterStorageInput} which has to be + * checked manually, as {@link DomesticHotWaterStorageInput#equals(Object)} is NOT restricted on + * the uuid of {@link DomesticHotWaterStorageInput}. + * + * @return a set of object- and uuid-unique {@link DomesticHotWaterStorageInput} entities + */ + public Set getDomesticHotWaterStorages() throws SourceException { + Map operators = typeSource.getOperators(); + Map thermalBuses = getThermalBuses(); + + return getDomesticHotWaterStorages(operators, thermalBuses); + } + /** * Returns a set of {@link CylindricalStorageInput} instances. * @@ -244,4 +265,35 @@ public Set getCylindricalStorages( data -> thermalUnitEnricher.apply(data, operators, thermalBuses)) .collect(toSet()); } + + /** + * Returns a set of {@link DomesticHotWaterStorageInput} instances. + * + *

    This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link DomesticHotWaterStorageInput} which has to be + * checked manually, as {@link DomesticHotWaterStorageInput#equals(Object)} is NOT restricted on + * the uuid of {@link DomesticHotWaterStorageInput}. + * + *

    In contrast to {@link #getDomesticHotWaterStorages()} this interface provides the ability to + * pass in an already existing set of {@link OperatorInput} entities, the {@link + * DomesticHotWaterStorageInput} instances depend on. Doing so, already loaded nodes can be + * recycled to improve performance and prevent unnecessary loading operations. + * + *

    If something fails during the creation process it's up to the concrete implementation of an + * empty set or a set with all entities that has been able to be build is returned. + * + * @param operators a set of object- and uuid-unique {@link OperatorInput} entities + * @param thermalBuses a set of object- and uuid-unique {@link ThermalBusInput} entities + * @return a set of object- and uuid-unique {@link DomesticHotWaterStorageInput} entities + */ + public Set getDomesticHotWaterStorages( + Map operators, Map thermalBuses) + throws SourceException { + return getEntities( + DomesticHotWaterStorageInput.class, + dataSource, + domesticHotWaterStorageInputFactory, + data -> thermalUnitEnricher.apply(data, operators, thermalBuses)) + .collect(toSet()); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java index 377f54508..8673875e1 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java @@ -70,12 +70,16 @@ public static List read( Try, SourceException> houses = Try.of( () -> thermalSource.getThermalHouses(operators, buses).values(), SourceException.class); - Try, SourceException> storages = + Try, SourceException> heatStorages = + Try.of( + () -> thermalSource.getThermalStorages(operators, buses).values(), + SourceException.class); + Try, SourceException> waterStorages = Try.of( () -> thermalSource.getThermalStorages(operators, buses).values(), SourceException.class); - List exceptions = Try.getExceptions(houses, storages); + List exceptions = Try.getExceptions(houses, heatStorages, waterStorages); if (!exceptions.isEmpty()) { throw new SourceException( @@ -87,16 +91,20 @@ public static List read( Map> houseInputs = houses.getOrThrow().stream() .collect(Collectors.groupingBy(ThermalUnitInput::getThermalBus, Collectors.toSet())); - Map> storageInputs = - storages.getOrThrow().stream() + Map> heatStorageInputs = + heatStorages.getOrThrow().stream() + .collect(Collectors.groupingBy(ThermalUnitInput::getThermalBus, Collectors.toSet())); + Map> waterStorageInputs = + waterStorages.getOrThrow().stream() .collect(Collectors.groupingBy(ThermalUnitInput::getThermalBus, Collectors.toSet())); return buses.values().stream() .map( bus -> { Set h = houseInputs.getOrDefault(bus, emptySet()); - Set s = storageInputs.getOrDefault(bus, emptySet()); - return new ThermalGrid(bus, h, s); + Set hs = heatStorageInputs.getOrDefault(bus, emptySet()); + Set ws = waterStorageInputs.getOrDefault(bus, emptySet()); + return new ThermalGrid(bus, h, hs, ws); }) .toList(); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/ThermalGrid.java b/src/main/java/edu/ie3/datamodel/models/input/container/ThermalGrid.java index b3616bc70..0a46b9ce2 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/container/ThermalGrid.java +++ b/src/main/java/edu/ie3/datamodel/models/input/container/ThermalGrid.java @@ -18,21 +18,31 @@ * edu.ie3.datamodel.models.input.thermal.ThermalUnitInput}s */ public record ThermalGrid( - ThermalBusInput bus, Set houses, Set storages) + ThermalBusInput bus, + Set houses, + Set heatStorages, + Set domesticHotWaterStorages) implements InputContainer { public ThermalGrid( ThermalBusInput bus, Collection houses, - Collection storages) { - this(bus, new HashSet<>(houses), new HashSet<>(storages)); + Collection heatStorages, + Collection domesticHotWaterStorages) { + this( + bus, + new HashSet<>(houses), + new HashSet<>(heatStorages), + new HashSet<>(domesticHotWaterStorages)); } @Override public List allEntitiesAsList() { - List ret = new ArrayList<>(houses.size() + storages.size() + 1); + List ret = + new ArrayList<>(houses.size() + heatStorages.size() + domesticHotWaterStorages.size() + 1); ret.add(bus); ret.addAll(houses); - ret.addAll(storages); + ret.addAll(heatStorages); + ret.addAll(domesticHotWaterStorages); return ret; } @@ -48,8 +58,10 @@ public String toString() { + bus + ", #houses=" + houses.size() - + ", #storages=" - + storages.size() + + ", #heatStorages=" + + heatStorages.size() + + ", #domesticHotWaterStorages=" + + domesticHotWaterStorages.size() + '}'; } @@ -63,7 +75,8 @@ public String toString() { public static class ThermalGridCopyBuilder implements InputContainerCopyBuilder { private ThermalBusInput bus; private Set houses; - private Set storages; + private Set heatStorages; + private Set domesticHotWaterStorages; /** * Constructor for {@link ThermalGridCopyBuilder} @@ -73,7 +86,8 @@ public static class ThermalGridCopyBuilder implements InputContainerCopyBuilder< protected ThermalGridCopyBuilder(ThermalGrid thermalGrid) { this.bus = thermalGrid.bus(); this.houses = thermalGrid.houses(); - this.storages = thermalGrid.storages(); + this.heatStorages = thermalGrid.heatStorages(); + this.domesticHotWaterStorages = thermalGrid.domesticHotWaterStorages(); } /** @@ -101,11 +115,23 @@ public ThermalGridCopyBuilder houses(Set houses) { /** * Method to alter {@link ThermalStorageInput} * - * @param storages altered thermal storages + * @param heatStorages altered thermal storages * @return this instance of {@link ThermalGridCopyBuilder} */ - public ThermalGridCopyBuilder storages(Set storages) { - this.storages = storages; + public ThermalGridCopyBuilder heatStorages(Set heatStorages) { + this.heatStorages = heatStorages; + return this; + } + + /** + * Method to alter {@link ThermalStorageInput} + * + * @param domesticHotWaterStorages altered thermal storages + * @return this instance of {@link ThermalGridCopyBuilder} + */ + public ThermalGridCopyBuilder domesticHotWaterStorages( + Set domesticHotWaterStorages) { + this.domesticHotWaterStorages = domesticHotWaterStorages; return this; } @@ -114,8 +140,12 @@ public ThermalGridCopyBuilder scale(Double factor) { houses.stream() .map(house -> house.copy().scale(factor).build()) .collect(Collectors.toSet())); - storages( - storages.stream() + heatStorages( + heatStorages.stream() + .map(storage -> storage.copy().scale(factor).build()) + .collect(Collectors.toSet())); + domesticHotWaterStorages( + domesticHotWaterStorages.stream() .map(storage -> storage.copy().scale(factor).build()) .collect(Collectors.toSet())); return this; @@ -123,7 +153,7 @@ public ThermalGridCopyBuilder scale(Double factor) { @Override public ThermalGrid build() { - return new ThermalGrid(bus, houses, storages); + return new ThermalGrid(bus, houses, heatStorages, domesticHotWaterStorages); } } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java new file mode 100644 index 000000000..9c712dd89 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -0,0 +1,269 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.thermal; + +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; +import java.util.Objects; +import java.util.UUID; +import javax.measure.quantity.Power; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Volume; +import tech.units.indriya.ComparableQuantity; + +/** Thermal storage with cylindrical shape store hot tap water */ +public class DomesticHotWaterStorageInput extends ThermalStorageInput { + /** Available storage volume (typically in m³) */ + private final ComparableQuantity storageVolumeLvl; + /** Minimum permissible storage volume (typically in m³) */ + private final ComparableQuantity storageVolumeLvlMin; + /** Temperature of the inlet (typically in C) */ + private final ComparableQuantity inletTemp; + /** Temperature of the outlet (typically in C) */ + private final ComparableQuantity returnTemp; + /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ + private final ComparableQuantity c; + /** Maximum permissible thermal power (typically in kW) */ + private final ComparableQuantity pThermalMax; + + /** + * @param uuid Unique identifier of a cylindrical storage + * @param id Identifier of the thermal unit + * @param operator operator of the asset + * @param operationTime operation time of the asset + * @param bus Thermal bus, a thermal unit is connected to + * @param storageVolumeLvl Available storage volume + * @param storageVolumeLvlMin Minimum permissible storage volume + * @param inletTemp Temperature of the inlet + * @param returnTemp Temperature of the outlet + * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage + */ + public DomesticHotWaterStorageInput( + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime, + ThermalBusInput bus, + ComparableQuantity storageVolumeLvl, + ComparableQuantity storageVolumeLvlMin, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(uuid, id, operator, operationTime, bus); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + } + + /** + * @param uuid Unique identifier of a cylindrical storage + * @param id Identifier of the thermal unit + * @param bus Thermal bus, a thermal unit is connected to + * @param storageVolumeLvl Available storage volume + * @param storageVolumeLvlMin Minimum permissible storage volume + * @param inletTemp Temperature of the inlet + * @param returnTemp Temperature of the outlet + * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage + */ + public DomesticHotWaterStorageInput( + UUID uuid, + String id, + ThermalBusInput bus, + ComparableQuantity storageVolumeLvl, + ComparableQuantity storageVolumeLvlMin, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(uuid, id, bus); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + } + + public ComparableQuantity getStorageVolumeLvl() { + return storageVolumeLvl; + } + + public ComparableQuantity getStorageVolumeLvlMin() { + return storageVolumeLvlMin; + } + + public ComparableQuantity getInletTemp() { + return inletTemp; + } + + public ComparableQuantity getReturnTemp() { + return returnTemp; + } + + public ComparableQuantity getC() { + return c; + } + + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + + @Override + public DomesticHotWaterStorageInputCopyBuilder copy() { + return new DomesticHotWaterStorageInputCopyBuilder(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DomesticHotWaterStorageInput that)) return false; + if (!super.equals(o)) return false; + return storageVolumeLvl.equals(that.storageVolumeLvl) + && storageVolumeLvlMin.equals(that.storageVolumeLvlMin) + && inletTemp.equals(that.inletTemp) + && returnTemp.equals(that.returnTemp) + && c.equals(that.c) + && pThermalMax.equals(that.pThermalMax); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + storageVolumeLvl, + storageVolumeLvlMin, + inletTemp, + returnTemp, + c, + pThermalMax); + } + + @Override + public String toString() { + return "DomesticHotWaterStorageInput{" + + "uuid=" + + getUuid() + + ", id=" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", bus=" + + getThermalBus().getUuid() + + ", storageVolumeLvl=" + + storageVolumeLvl + + ", storageVolumeLvlMin=" + + storageVolumeLvlMin + + ", inletTemp=" + + inletTemp + + ", returnTemp=" + + returnTemp + + ", c=" + + c + + ", pThermalMax=" + + pThermalMax + + '}'; + } + + /** + * A builder pattern based approach to create copies of {@link DomesticHotWaterStorageInput} + * entities with altered field values. For detailed field descriptions refer to java docs of + * {@link DomesticHotWaterStorageInput} + */ + public static class DomesticHotWaterStorageInputCopyBuilder + extends ThermalStorageInputCopyBuilder { + + private ComparableQuantity storageVolumeLvl; + private ComparableQuantity storageVolumeLvlMin; + private ComparableQuantity inletTemp; + private ComparableQuantity returnTemp; + private ComparableQuantity c; + private ComparableQuantity pThermalMax; + + private DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { + super(entity); + this.storageVolumeLvl = entity.getStorageVolumeLvl(); + this.storageVolumeLvlMin = entity.getStorageVolumeLvlMin(); + this.inletTemp = entity.getInletTemp(); + this.returnTemp = entity.getReturnTemp(); + this.c = entity.getC(); + this.pThermalMax = entity.getpThermalMax(); + } + + public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl( + ComparableQuantity storageVolumeLvl) { + this.storageVolumeLvl = storageVolumeLvl; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvlMin( + ComparableQuantity storageVolumeLvlMin) { + this.storageVolumeLvlMin = storageVolumeLvlMin; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder inletTemp( + ComparableQuantity inletTemp) { + this.inletTemp = inletTemp; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder returnTemp( + ComparableQuantity returnTemp) { + this.returnTemp = returnTemp; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder c(ComparableQuantity c) { + this.c = c; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder pThermalMax( + ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return this; + } + + @Override + public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { + storageVolumeLvl(storageVolumeLvl.multiply(factor)); + storageVolumeLvlMin(storageVolumeLvlMin.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); + return this; + } + + @Override + public DomesticHotWaterStorageInput build() { + return new DomesticHotWaterStorageInput( + getUuid(), + getId(), + getOperator(), + getOperationTime(), + getThermalBus(), + storageVolumeLvl, + storageVolumeLvlMin, + inletTemp, + returnTemp, + c, + pThermalMax); + } + + @Override + protected DomesticHotWaterStorageInputCopyBuilder thisInstance() { + return this; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index a92e54da8..250ce365c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -41,6 +41,8 @@ public class ThermalHouseInput extends ThermalSinkInput { * @param targetTemperature Desired target temperature of the thermal house model * @param upperTemperatureLimit Upper boundary temperature of the thermal house model * @param lowerTemperatureLimit Lower boundary temperature of the thermal house model + * @param housingType Type of the building: either house or flat + * @param numberInhabitants Number of inhabitants living in this house */ public ThermalHouseInput( UUID uuid, @@ -74,6 +76,8 @@ public ThermalHouseInput( * @param targetTemperature Desired target temperature of the thermal house model * @param upperTemperatureLimit Upper boundary temperature of the thermal house model * @param lowerTemperatureLimit Lower boundary temperature of the thermal house model + * @param housingType Type of the building: either house or flat + * @param numberInhabitants Number of inhabitants living in this house */ public ThermalHouseInput( UUID uuid, @@ -256,10 +260,11 @@ public ThermalHouseInputCopyBuilder numberInhabitants(Integer numberInhabitants) @Override public ThermalHouseInputCopyBuilder scale(Double factor) { - // scale losses as well as capacity to keep equal + // scale losses as well as capacity and number of inhabitants to keep equal // the time needed to heat a scaled house ethLosses(ethLosses.multiply(factor)); ethCapa(ethCapa.multiply(factor)); + numberInhabitants((int) Math.round(numberInhabitants.doubleValue() * factor)); return this; } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index b5e145799..257b8e33b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -24,6 +24,7 @@ import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.models.input.system.* import edu.ie3.datamodel.models.input.system.type.* import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalBusInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.models.result.CongestionResult @@ -86,6 +87,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData /* -- ThermalUnitInput */ ThermalHouseInput, CylindricalStorageInput, + DomesticHotWaterStorageInput, /* - GraphicInput */ NodeGraphicInput, LineGraphicInput, diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 773f53c53..456b3ca19 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.io.sink +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput + import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE import static tech.units.indriya.unit.Units.PERCENT @@ -118,26 +120,27 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { given: CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath, new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(WecResult), - new ResultEntityProcessor(EvResult), - new ResultEntityProcessor(EvcsResult), - new ResultEntityProcessor(EmResult), - new ResultEntityProcessor(FlexOptionsResult), - new InputEntityProcessor(Transformer2WInput), - new InputEntityProcessor(NodeInput), - new InputEntityProcessor(EvcsInput), - new InputEntityProcessor(Transformer2WTypeInput), - new InputEntityProcessor(LineGraphicInput), - new InputEntityProcessor(NodeGraphicInput), - new InputEntityProcessor(CylindricalStorageInput), - new InputEntityProcessor(ThermalHouseInput), - new InputEntityProcessor(OperatorInput), - new InputEntityProcessor(LineInput), - new InputEntityProcessor(ThermalBusInput), - new InputEntityProcessor(LineTypeInput), - new InputEntityProcessor(LoadInput), - new InputEntityProcessor(EmInput) + new ResultEntityProcessor(PvResult), + new ResultEntityProcessor(WecResult), + new ResultEntityProcessor(EvResult), + new ResultEntityProcessor(EvcsResult), + new ResultEntityProcessor(EmResult), + new ResultEntityProcessor(FlexOptionsResult), + new InputEntityProcessor(Transformer2WInput), + new InputEntityProcessor(NodeInput), + new InputEntityProcessor(EvcsInput), + new InputEntityProcessor(Transformer2WTypeInput), + new InputEntityProcessor(LineGraphicInput), + new InputEntityProcessor(NodeGraphicInput), + new InputEntityProcessor(CylindricalStorageInput), + new InputEntityProcessor(DomesticHotWaterStorageInput), + new InputEntityProcessor(ThermalHouseInput), + new InputEntityProcessor(OperatorInput), + new InputEntityProcessor(LineInput), + new InputEntityProcessor(ThermalBusInput), + new InputEntityProcessor(LineTypeInput), + new InputEntityProcessor(LoadInput), + new InputEntityProcessor(EmInput) ], [] as Map), new FileNamingStrategy(), ",") @@ -166,6 +169,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { GridTestData.lineGraphicCtoD, GridTestData.nodeGraphicC, ThermalUnitInputTestData.cylindricalStorageInput, + ThermalUnitInputTestData.domesticHotWaterStorageInput, ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, @@ -185,6 +189,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("transformer_2_w_input.csv").toFile().exists() testBaseFolderPath.resolve("operator_input.csv").toFile().exists() testBaseFolderPath.resolve("cylindrical_storage_input.csv").toFile().exists() + testBaseFolderPath.resolve("domestic_hot_water_storage_input.csv").toFile().exists() testBaseFolderPath.resolve("line_graphic_input.csv").toFile().exists() testBaseFolderPath.resolve("line_input.csv").toFile().exists() testBaseFolderPath.resolve("operator_input.csv").toFile().exists() diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalGridSourceTest.groovy index 57c1b2ec4..ce8b3c7a7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalGridSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalGridSourceTest.groovy @@ -18,7 +18,8 @@ class CsvThermalGridSourceTest extends Specification implements CsvTestDataMeta thermalGrids.get(0).with { def bus = it.bus() assert it.houses().every { it.thermalBus == bus } - assert it.storages().every { it.thermalBus == bus } + assert it.heatStorages().every { it.thermalBus == bus } + assert it.domesticHotWaterStorages().every { it.thermalBus == bus } } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy index fb8485acb..ca34f5270 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy @@ -6,6 +6,7 @@ package edu.ie3.datamodel.models.input.container import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalBusInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import spock.lang.Specification @@ -19,37 +20,43 @@ class ThermalGridTest extends Specification { Mock(ThermalHouseInput), Mock(ThermalHouseInput) ] - def thermalStorages = [Mock(CylindricalStorageInput)] - def thermalUnits = new ThermalGrid(thermalBus, thermalHouses, thermalStorages) + def heatStorages = [Mock(CylindricalStorageInput)] + def domesticHotWaterStorages = [ + Mock(DomesticHotWaterStorageInput) + ] + def thermalUnits = new ThermalGrid(thermalBus, thermalHouses, heatStorages, domesticHotWaterStorages) when: def actualAllEntities = thermalUnits.allEntitiesAsList() then: - actualAllEntities.size() == 1 + thermalHouses.size() + thermalStorages.size() + actualAllEntities.size() == 1 + thermalHouses.size() + heatStorages.size() + domesticHotWaterStorages.size() actualAllEntities.contains(thermalBus) actualAllEntities.containsAll(thermalHouses) - actualAllEntities.containsAll(thermalStorages) + actualAllEntities.containsAll(heatStorages) } def "A ThermalGrid's copy method should work as expected"() { given: def thermalBus = Mock(ThermalBusInput) def thermalHouses = [] - def thermalStorages = [] - def thermalGrid = new ThermalGrid(thermalBus, thermalHouses, thermalStorages) + def heatStorages = [] + def domesticHotWaterStorages = [] + def thermalGrid = new ThermalGrid(thermalBus, thermalHouses, heatStorages,domesticHotWaterStorages) def modifiedHouses = [Mock(ThermalHouseInput)] - def modifiedStorages = [Mock(CylindricalStorageInput)] - + def modifiedHeatStorages = [Mock(CylindricalStorageInput)] + def modifiedDomesticHotWaterStorages = [Mock(CylindricalStorageInput)] when: def modifiedThermalGrid = thermalGrid.copy() .houses(modifiedHouses as Set) - .storages(modifiedStorages as Set) + .heatStorages(modifiedHeatStorages as Set) + .domesticHotWaterStorages(modifiedDomesticHotWaterStorages as Set) .build() then: modifiedThermalGrid.houses().first() == modifiedHouses.get(0) - modifiedThermalGrid.storages().first() == modifiedStorages.get(0) + modifiedThermalGrid.heatStorages().first() == modifiedHeatStorages.get(0) + modifiedThermalGrid.domesticHotWaterStorages().first() == modifiedDomesticHotWaterStorages.get(0) } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy new file mode 100644 index 000000000..a8fb9adc6 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy @@ -0,0 +1,62 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.models.input.thermal + +import edu.ie3.test.common.ThermalUnitInputTestData +import spock.lang.Specification + + +class DomesticHotWaterStorageInputTest extends Specification { + + def "A DomesticHotWaterStorageInput copy method should work as expected"() { + given: + def domesticHotWaterStorageInput = ThermalUnitInputTestData.domesticHotWaterStorageInput + + when: + def alteredUnit = domesticHotWaterStorageInput.copy().storageVolumeLvl(ThermalUnitInputTestData.storageVolumeLvl) + .storageVolumeLvlMin(ThermalUnitInputTestData.storageVolumeLvlMin).inletTemp(ThermalUnitInputTestData.inletTemp) + .returnTemp(ThermalUnitInputTestData.returnTemp).c(ThermalUnitInputTestData.c) + .thermalBus(ThermalUnitInputTestData.thermalBus).build() + + + then: + alteredUnit.with { + assert uuid == domesticHotWaterStorageInput.uuid + assert id == domesticHotWaterStorageInput.id + assert operator == domesticHotWaterStorageInput.operator + assert operationTime == domesticHotWaterStorageInput.operationTime + assert thermalBus == domesticHotWaterStorageInput.thermalBus + assert storageVolumeLvl == ThermalUnitInputTestData.storageVolumeLvl + assert storageVolumeLvlMin == ThermalUnitInputTestData.storageVolumeLvlMin + assert inletTemp == ThermalUnitInputTestData.inletTemp + assert returnTemp == ThermalUnitInputTestData.returnTemp + assert c == ThermalUnitInputTestData.c + } + } + + def "Scaling a CylindricalStorageInput via builder should work as expected"() { + given: + def domesticHotWaterStorageInput = ThermalUnitInputTestData.domesticHotWaterStorageInput + + when: + def alteredUnit = domesticHotWaterStorageInput.copy().scale(2d).build() + + then: + alteredUnit.with { + assert uuid == domesticHotWaterStorageInput.uuid + assert id == domesticHotWaterStorageInput.id + assert operator == domesticHotWaterStorageInput.operator + assert operationTime == domesticHotWaterStorageInput.operationTime + assert thermalBus == domesticHotWaterStorageInput.thermalBus + assert storageVolumeLvl == domesticHotWaterStorageInput.storageVolumeLvl * 2d + assert storageVolumeLvlMin == domesticHotWaterStorageInput.storageVolumeLvlMin * 2d + assert inletTemp == domesticHotWaterStorageInput.inletTemp + assert returnTemp == domesticHotWaterStorageInput.returnTemp + assert c == domesticHotWaterStorageInput.c + assert pThermalMax == domesticHotWaterStorageInput.pThermalMax * 2d + } + } +} diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index c52dcc100..a85899e57 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -9,6 +9,7 @@ import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.util.TimeUtil import edu.ie3.util.quantities.interfaces.HeatCapacity @@ -17,6 +18,7 @@ import edu.ie3.util.quantities.interfaces.ThermalConductance import tech.units.indriya.ComparableQuantity import tech.units.indriya.quantity.Quantities +import javax.measure.quantity.Power import javax.measure.quantity.Temperature import javax.measure.quantity.Volume @@ -59,7 +61,7 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) - private static final ComparableQuantity pThermalMax = Quantities.getQuantity(20, StandardUnits.ACTIVE_POWER_IN) + private static final ComparableQuantity pThermalMax = Quantities.getQuantity(20, StandardUnits.ACTIVE_POWER_IN) public static final cylindricalStorageInput = new CylindricalStorageInput( thermalUnitUuid, @@ -73,4 +75,17 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { returnTemp, c, pThermalMax) + + public static final domesticHotWaterStorageInput = new DomesticHotWaterStorageInput( + thermalUnitUuid, + "testDomesticHotWaterStorageInput", + operator, + operationTime, + thermalBus, + storageVolumeLvl, + storageVolumeLvlMin, + inletTemp, + returnTemp, + c, + pThermalMax) } From ea750dd9c11247ca211cf93e86da9ec642bb5365 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 09:47:18 +0200 Subject: [PATCH 057/310] further changes for domestic hot water storage --- .../datamodel/io/source/ThermalSource.java | 20 ++++++++++++++++--- .../thermal/DomesticHotWaterStorageInput.java | 4 ++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 3da565756..f4cd02950 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -124,8 +125,14 @@ public Map getThermalBuses(Map opera * @return a map of UUID to object- and uuid-unique {@link ThermalStorageInput} entities */ public Map getThermalStorages() throws SourceException { - return getCylindricalStorages().stream().collect(toMap()); - // FIXME + return Stream.concat( + getCylindricalStorages().stream(), + getDomesticHotWaterStorages().stream() + ) + .collect(Collectors.toMap( + ThermalStorageInput::getUuid, + storage -> storage + )); } /** @@ -150,7 +157,14 @@ public Map getThermalStorages() throws SourceExceptio public Map getThermalStorages( Map operators, Map thermalBuses) throws SourceException { - return getCylindricalStorages(operators, thermalBuses).stream().collect(toMap()); + return Stream.concat( + getCylindricalStorages(operators, thermalBuses).stream(), + getDomesticHotWaterStorages(operators, thermalBuses).stream() + ) + .collect(Collectors.toMap( + ThermalStorageInput::getUuid, + storage -> storage + )); } /** diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 9c712dd89..270ea7519 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -32,7 +32,7 @@ public class DomesticHotWaterStorageInput extends ThermalStorageInput { private final ComparableQuantity pThermalMax; /** - * @param uuid Unique identifier of a cylindrical storage + * @param uuid Unique identifier of a domestic hot water storage * @param id Identifier of the thermal unit * @param operator operator of the asset * @param operationTime operation time of the asset @@ -66,7 +66,7 @@ public DomesticHotWaterStorageInput( } /** - * @param uuid Unique identifier of a cylindrical storage + * @param uuid Unique identifier of a domestic hot water storage * @param id Identifier of the thermal unit * @param bus Thermal bus, a thermal unit is connected to * @param storageVolumeLvl Available storage volume From 591a972dacf6c8f32af921f6e1f738ce74176b35 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 10:44:41 +0200 Subject: [PATCH 058/310] validation of domestic hot water storage --- .../DomesticHotWaterStorageInputFactory.java | 1 - .../thermal/CylindricalStorageInput.java | 2 +- .../thermal/DomesticHotWaterStorageInput.java | 24 --------- .../ThermalUnitValidationUtils.java | 54 +++++++++++++++++++ .../DomesticHotWaterStorageInputTest.groovy | 4 +- .../ThermalUnitValidationUtilsTest.groovy | 29 ++++++++-- .../common/ThermalUnitInputTestData.groovy | 1 - 7 files changed, 80 insertions(+), 35 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java index b311d7f27..a7a176310 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java @@ -64,7 +64,6 @@ protected DomesticHotWaterStorageInput buildModel( operationTime, bus, storageVolumeLvl, - storageVolumeLvlMin, inletTemp, returnTemp, c, diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 63c2758af..6ca1bf1cd 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -126,7 +126,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax);); + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 270ea7519..b5da3207e 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -20,8 +20,6 @@ public class DomesticHotWaterStorageInput extends ThermalStorageInput { /** Available storage volume (typically in m³) */ private final ComparableQuantity storageVolumeLvl; - /** Minimum permissible storage volume (typically in m³) */ - private final ComparableQuantity storageVolumeLvlMin; /** Temperature of the inlet (typically in C) */ private final ComparableQuantity inletTemp; /** Temperature of the outlet (typically in C) */ @@ -38,7 +36,6 @@ public class DomesticHotWaterStorageInput extends ThermalStorageInput { * @param operationTime operation time of the asset * @param bus Thermal bus, a thermal unit is connected to * @param storageVolumeLvl Available storage volume - * @param storageVolumeLvlMin Minimum permissible storage volume * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium @@ -51,14 +48,12 @@ public DomesticHotWaterStorageInput( OperationTime operationTime, ThermalBusInput bus, ComparableQuantity storageVolumeLvl, - ComparableQuantity storageVolumeLvlMin, ComparableQuantity inletTemp, ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { super(uuid, id, operator, operationTime, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); @@ -70,7 +65,6 @@ public DomesticHotWaterStorageInput( * @param id Identifier of the thermal unit * @param bus Thermal bus, a thermal unit is connected to * @param storageVolumeLvl Available storage volume - * @param storageVolumeLvlMin Minimum permissible storage volume * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium @@ -88,7 +82,6 @@ public DomesticHotWaterStorageInput( ComparableQuantity pThermalMax) { super(uuid, id, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.storageVolumeLvlMin = storageVolumeLvlMin.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); @@ -99,10 +92,6 @@ public ComparableQuantity getStorageVolumeLvl() { return storageVolumeLvl; } - public ComparableQuantity getStorageVolumeLvlMin() { - return storageVolumeLvlMin; - } - public ComparableQuantity getInletTemp() { return inletTemp; } @@ -130,7 +119,6 @@ public boolean equals(Object o) { if (!(o instanceof DomesticHotWaterStorageInput that)) return false; if (!super.equals(o)) return false; return storageVolumeLvl.equals(that.storageVolumeLvl) - && storageVolumeLvlMin.equals(that.storageVolumeLvlMin) && inletTemp.equals(that.inletTemp) && returnTemp.equals(that.returnTemp) && c.equals(that.c) @@ -142,7 +130,6 @@ public int hashCode() { return Objects.hash( super.hashCode(), storageVolumeLvl, - storageVolumeLvlMin, inletTemp, returnTemp, c, @@ -164,8 +151,6 @@ public String toString() { + getThermalBus().getUuid() + ", storageVolumeLvl=" + storageVolumeLvl - + ", storageVolumeLvlMin=" - + storageVolumeLvlMin + ", inletTemp=" + inletTemp + ", returnTemp=" @@ -195,7 +180,6 @@ public static class DomesticHotWaterStorageInputCopyBuilder private DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); this.storageVolumeLvl = entity.getStorageVolumeLvl(); - this.storageVolumeLvlMin = entity.getStorageVolumeLvlMin(); this.inletTemp = entity.getInletTemp(); this.returnTemp = entity.getReturnTemp(); this.c = entity.getC(); @@ -208,12 +192,6 @@ public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl( return this; } - public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvlMin( - ComparableQuantity storageVolumeLvlMin) { - this.storageVolumeLvlMin = storageVolumeLvlMin; - return this; - } - public DomesticHotWaterStorageInputCopyBuilder inletTemp( ComparableQuantity inletTemp) { this.inletTemp = inletTemp; @@ -240,7 +218,6 @@ public DomesticHotWaterStorageInputCopyBuilder pThermalMax( @Override public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { storageVolumeLvl(storageVolumeLvl.multiply(factor)); - storageVolumeLvlMin(storageVolumeLvlMin.multiply(factor)); pThermalMax(pThermalMax.multiply(factor)); return this; } @@ -254,7 +231,6 @@ public DomesticHotWaterStorageInput build() { getOperationTime(), getThermalBus(), storageVolumeLvl, - storageVolumeLvlMin, inletTemp, returnTemp, c, diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 5db4e9c4d..5c4984f6f 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -124,6 +124,12 @@ private ThermalUnitValidationUtils() { logNotImplemented(thermalStorageInput); } + if (DomesticHotWaterStorageInput.class.isAssignableFrom(thermalStorageInput.getClass())) { + exceptions.addAll(checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); + } else { + logNotImplemented(thermalStorageInput); + } + return exceptions; } @@ -251,4 +257,52 @@ private static List> checkCylindricalStorage( return exceptions; } + /** + * Validates a domcesticHotWaterStorageInput if: + * + *

      + *
    • it is not null + *
    • its available storage volume is positive + *
    • its inlet temperature is equal/greater than the outlet temperature + *
    • its specific heat capacity is positive + *
    + * + * @param domesticHotWaterStorageInput DomesticHotWaterStorageInput to validate + * @return a list of try objects either containing an {@link InvalidEntityException} or an empty + * Success + */ + private static List> checkDomesticHotWaterStorage( + DomesticHotWaterStorageInput domesticHotWaterStorageInput) { + Try isNull = + checkNonNull(domesticHotWaterStorageInput, "a domestic hot water storage"); + + if (isNull.isFailure()) { + return List.of(isNull); + } + + List> exceptions = new ArrayList<>(); + + // Check if inlet temperature is higher/equal to outlet temperature + exceptions.add( + Try.ofVoid( + domesticHotWaterStorageInput + .getInletTemp() + .isLessThan(domesticHotWaterStorageInput.getReturnTemp()), + () -> + new InvalidEntityException( + "Inlet temperature of the domestic hot water storage cannot be lower than outlet temperature", + domesticHotWaterStorageInput))); + + exceptions.add( + Try.ofVoid( + () -> + detectZeroOrNegativeQuantities( + new Quantity[] { + domesticHotWaterStorageInput.getStorageVolumeLvl(), domesticHotWaterStorageInput.getC(), domesticHotWaterStorageInput.getpThermalMax() + }, + domesticHotWaterStorageInput), + InvalidEntityException.class)); + + return exceptions; + } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy index a8fb9adc6..92232c3b0 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy @@ -17,7 +17,7 @@ class DomesticHotWaterStorageInputTest extends Specification { when: def alteredUnit = domesticHotWaterStorageInput.copy().storageVolumeLvl(ThermalUnitInputTestData.storageVolumeLvl) - .storageVolumeLvlMin(ThermalUnitInputTestData.storageVolumeLvlMin).inletTemp(ThermalUnitInputTestData.inletTemp) + .inletTemp(ThermalUnitInputTestData.inletTemp) .returnTemp(ThermalUnitInputTestData.returnTemp).c(ThermalUnitInputTestData.c) .thermalBus(ThermalUnitInputTestData.thermalBus).build() @@ -30,7 +30,6 @@ class DomesticHotWaterStorageInputTest extends Specification { assert operationTime == domesticHotWaterStorageInput.operationTime assert thermalBus == domesticHotWaterStorageInput.thermalBus assert storageVolumeLvl == ThermalUnitInputTestData.storageVolumeLvl - assert storageVolumeLvlMin == ThermalUnitInputTestData.storageVolumeLvlMin assert inletTemp == ThermalUnitInputTestData.inletTemp assert returnTemp == ThermalUnitInputTestData.returnTemp assert c == ThermalUnitInputTestData.c @@ -52,7 +51,6 @@ class DomesticHotWaterStorageInputTest extends Specification { assert operationTime == domesticHotWaterStorageInput.operationTime assert thermalBus == domesticHotWaterStorageInput.thermalBus assert storageVolumeLvl == domesticHotWaterStorageInput.storageVolumeLvl * 2d - assert storageVolumeLvlMin == domesticHotWaterStorageInput.storageVolumeLvlMin * 2d assert inletTemp == domesticHotWaterStorageInput.inletTemp assert returnTemp == domesticHotWaterStorageInput.returnTemp assert c == domesticHotWaterStorageInput.c diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy index da13dc194..08b949abf 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy @@ -11,6 +11,7 @@ import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData @@ -113,9 +114,27 @@ class ThermalUnitValidationUtilsTest extends Specification { ex.message == expectedException.message where: - invalidCylindricalStorage || expectedSize || expectedException - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -200 ㎥, -1.05 kWh/K*m³, -20 kW", invalidCylindricalStorage) + invalidCylindricalStorage || expectedSize || expectedException + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c, Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower than outlet temperature", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidCylindricalStorage) } -} + + +def "ThermalUnitValidationUtils.checkDomesticHotWaterStorage() recognizes all potential errors for a domestic hot water storage"() { + when: + List> exceptions = ThermalUnitValidationUtils.check(invalidDomesticHotWaterStorage).stream().filter { it -> it.failure }.toList() + + then: + exceptions.size() == expectedSize + Exception ex = exceptions.get(0).exception.get() + ex.class == expectedException.class + ex.message == expectedException.message + + where: + invalidDomesticHotWaterStorage || expectedSize || expectedException + new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c, Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("Inlet temperature of the domestic hot water storage cannot be lower than outlet temperature", invalidDomesticHotWaterStorage) + new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidDomesticHotWaterStorage) + new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidDomesticHotWaterStorage) + +}} diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index 56d6f0e9c..81d302368 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -81,7 +81,6 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { operationTime, thermalBus, storageVolumeLvl, - storageVolumeLvlMin, inletTemp, returnTemp, c, From cad8a2c0bb406684c65fc6f8f5168cfd34c65c4b Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 10:45:24 +0200 Subject: [PATCH 059/310] rtd --- .../models/input/thermal/domestichotwaterstorage.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md b/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md index 6d4ad99f9..81b84879c 100644 --- a/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md +++ b/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md @@ -40,10 +40,6 @@ Model of a domestic hot water storage using a fluent to store thermal energy. - m³ - Overall available storage volume - * - storageVolumeLvlMin - - m³ - - Minimum permissible storage volume - * - inletTemp - °C - Temperature of the inlet From d0f0df4c7944f8b8731cd91dd5c7b11e4c970679 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 11:05:23 +0200 Subject: [PATCH 060/310] update puml --- docs/uml/main/input/ThermalDatamodelConcept.puml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 3f275bc5b..d1fa7404c 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -107,6 +107,8 @@ package models { - targetTemperature: ComparableQuantity [°C] - upperTemperatureLimit: ComparableQuantity [°C] - lowerTemperatureLimit: ComparableQuantity [°C] + - houseType: String ['house' or 'flat'] + - numberInhabitants: Integer } ThermalHouseInput --|> ThermalSinkInput @@ -120,6 +122,14 @@ package models { - c: ComparableQuantity [kWh/(K*m³)] } CylindricalStorageInput --|> ThermalStorageInput + + class DomesticHotWaterStorageInput { + - storageVolumeLvl: ComparableQuantity [m³] + - inletTemp: ComparableQuantity [°C] + - returnTemp: ComparableQuantity [°C] + - c: ComparableQuantity [kWh/(K*m³)] + } + DomesticHotWaterStorageInput --|> ThermalStorageInput } } } From ef634680b5e444a41f777ed04c904b07df12cba6 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 11:23:06 +0200 Subject: [PATCH 061/310] add DomesticHotWaterStorageInputFactoryTest --- .../DomesticHotWaterStorageInputFactory.java | 5 +- .../io/extractor/ExtractorTest.groovy | 6 ++ .../CylindricalStorageInputFactoryTest.groovy | 9 ++- ...sticHotWaterStorageInputFactoryTest.groovy | 62 +++++++++++++++++++ .../io/source/csv/CsvThermalSourceTest.groovy | 1 - .../common/SystemParticipantTestData.groovy | 5 +- 6 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java index a7a176310..dfc99beb7 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java @@ -20,7 +20,6 @@ public class DomesticHotWaterStorageInputFactory extends AssetInputEntityFactory { private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; - private static final String STORAGE_VOLUME_LVL_MIN = "storageVolumeLvlMin"; private static final String INLET_TEMP = "inletTemp"; private static final String RETURN_TEMP = "returnTemp"; private static final String C = "c"; @@ -33,7 +32,7 @@ public DomesticHotWaterStorageInputFactory() { @Override protected String[] getAdditionalFields() { return new String[] { - STORAGE_VOLUME_LVL, STORAGE_VOLUME_LVL_MIN, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX + STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX }; } @@ -47,8 +46,6 @@ protected DomesticHotWaterStorageInput buildModel( final ThermalBusInput bus = data.getBusInput(); final ComparableQuantity storageVolumeLvl = data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); - final ComparableQuantity storageVolumeLvlMin = - data.getQuantity(STORAGE_VOLUME_LVL_MIN, StandardUnits.VOLUME); final ComparableQuantity inletTemp = data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); final ComparableQuantity returnTemp = diff --git a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index 9c4968164..fd513bf33 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -140,6 +140,12 @@ class ExtractorTest extends Specification { tutd.cylindricalStorageInput.thermalBus.operator ] + tutd.domesticHotWaterStorageInput || [ + tutd.domesticHotWaterStorageInput.operator, + tutd.domesticHotWaterStorageInput.thermalBus, + tutd.domesticHotWaterStorageInput.thermalBus.operator + ] + tutd.thermalHouseInput || [ tutd.thermalHouseInput.operator, tutd.thermalHouseInput.thermalBus, diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy index 1065d1fba..e8d7f8989 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy @@ -32,11 +32,10 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", "id" : "TestID", "storagevolumelvl" : "3", - "storagevolumelvlmin": "4", - "inlettemp" : "5", - "returntemp" : "6", - "c" : "7", - "pThermalMax" : "8" + "inlettemp" : "4", + "returntemp" : "5", + "c" : "6", + "pThermalMax" : "7" ] def inputClass = CylindricalStorageInput def thermalBusInput = Mock(ThermalBusInput) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy new file mode 100644 index 000000000..38849415d --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactoryTest.groovy @@ -0,0 +1,62 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.input + +import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.helper.FactoryTestHelper +import spock.lang.Specification + +class DomesticHotWaterStorageInputFactoryTest extends Specification implements FactoryTestHelper { + def "A DomesticHotWaterStorageInputFactory should contain exactly the expected class for parsing"() { + given: + def inputFactory = new DomesticHotWaterStorageInputFactory() + def expectedClasses = [DomesticHotWaterStorageInput] + + expect: + inputFactory.supportedClasses == Arrays.asList(expectedClasses.toArray()) + } + + def "A DomesticHotWaterStorageInputFactory should parse a valid DomesticHotWaterStorageInput correctly"() { + given: "a system participant input type factory and model data" + def inputFactory = new DomesticHotWaterStorageInputFactory() + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "id" : "TestID", + "storagevolumelvl" : "3", + "inlettemp" : "4", + "returntemp" : "5", + "c" : "6", + "pThermalMax" : "7" + ] + def inputClass = DomesticHotWaterStorageInput + def thermalBusInput = Mock(ThermalBusInput) + + when: + Try input = inputFactory.get(new ThermalUnitInputEntityData(parameter, inputClass, thermalBusInput)) + + then: + input.success + input.data.get().getClass() == inputClass + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime == OperationTime.notLimited() + assert operator == OperatorInput.NO_OPERATOR_ASSIGNED + assert id == parameter["id"] + assert thermalBus == thermalBusInput + assert storageVolumeLvl == getQuant(parameter["storagevolumelvl"], StandardUnits.VOLUME) + assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) + assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) + assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) + assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) + } + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index fee7a363a..b748fa265 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -10,7 +10,6 @@ import edu.ie3.datamodel.io.source.ThermalSource import edu.ie3.datamodel.io.source.TypeSource import edu.ie3.test.common.SystemParticipantTestData as sptd import edu.ie3.test.common.ThermalUnitInputTestData -import org.apache.commons.compress.harmony.unpack200.bytecode.forms.ThisMethodRefForm import spock.lang.Specification class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index 34c09ba71..be67fcd4b 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -5,8 +5,6 @@ */ package edu.ie3.test.common -import static edu.ie3.datamodel.models.StandardUnits.* - import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput @@ -27,12 +25,13 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.profile.StandardLoadProfile import edu.ie3.util.TimeUtil import edu.ie3.util.quantities.interfaces.* -import org.testcontainers.shaded.org.checkerframework.checker.units.qual.A import tech.units.indriya.ComparableQuantity import tech.units.indriya.quantity.Quantities import javax.measure.quantity.* +import static edu.ie3.datamodel.models.StandardUnits.* + class SystemParticipantTestData { // general participant data From f3da3e321c598b227e4e3153e9de963cb44e24c1 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 13:06:35 +0200 Subject: [PATCH 062/310] change numberInhabitants to double to allow proper scaling and using statistical data of average households --- .../input/thermal/ThermalHouseInput.java | 16 ++++----- .../ThermalUnitValidationUtilsTest.groovy | 34 +++++++++---------- .../common/ThermalUnitInputTestData.groovy | 2 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index 250ce365c..e2a89a833 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -29,8 +29,8 @@ public class ThermalHouseInput extends ThermalSinkInput { private final ComparableQuantity lowerTemperatureLimit; /** Type of the building, e.g. house or flat */ private final String housingType; - /** Number of people living in the building */ - private final Integer numberInhabitants; + /** Number of people living in the building, double to allow proper scaling */ + private final double numberInhabitants; /** * @param uuid Unique identifier of a thermal house model @@ -54,7 +54,7 @@ public ThermalHouseInput( ComparableQuantity upperTemperatureLimit, ComparableQuantity lowerTemperatureLimit, String housingType, - Integer numberInhabitants) { + double numberInhabitants) { super(uuid, id, bus); this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); @@ -91,7 +91,7 @@ public ThermalHouseInput( ComparableQuantity upperTemperatureLimit, ComparableQuantity lowerTemperatureLimit, String housingType, - Integer numberInhabitants) { + double numberInhabitants) { super(uuid, id, operator, operationTime, bus); this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); @@ -126,7 +126,7 @@ public String getHousingType() { return housingType; } - public Integer getNumberOfInhabitants() { + public double getNumberOfInhabitants() { return numberInhabitants; } @@ -206,7 +206,7 @@ public static class ThermalHouseInputCopyBuilder private ComparableQuantity upperTemperatureLimit; private ComparableQuantity lowerTemperatureLimit; private String housingType; - private Integer numberInhabitants; + private double numberInhabitants; private ThermalHouseInputCopyBuilder(ThermalHouseInput entity) { super(entity); @@ -253,7 +253,7 @@ public ThermalHouseInputCopyBuilder housingType(String housingType) { return this; } - public ThermalHouseInputCopyBuilder numberInhabitants(Integer numberInhabitants) { + public ThermalHouseInputCopyBuilder numberInhabitants(double numberInhabitants) { this.numberInhabitants = numberInhabitants; return this; } @@ -264,7 +264,7 @@ public ThermalHouseInputCopyBuilder scale(Double factor) { // the time needed to heat a scaled house ethLosses(ethLosses.multiply(factor)); ethCapa(ethCapa.multiply(factor)); - numberInhabitants((int) Math.round(numberInhabitants.doubleValue() * factor)); + numberInhabitants(numberInhabitants * factor); return this; } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy index 08b949abf..aee06dc3e 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy @@ -47,7 +47,7 @@ class ThermalUnitValidationUtilsTest extends Specification { private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) private static final String HOUSING_TYPE = "House" - private static final Integer NUMBER_INHABITANTS = 2 + private static final Integer NUMBER_INHABITANTS = 2.0 // Specific data for thermal cylindric storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) @@ -87,7 +87,7 @@ class ThermalUnitValidationUtilsTest extends Specification { new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, Quantities.getQuantity(30, StandardUnits.TEMPERATURE), HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "someWrongType", NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Housing type must be either 'house' or 'flat'", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, 0) || 1 || new InvalidEntityException("Number of inhabitants must be greater than zero", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, 0d) || 1 || new InvalidEntityException("Number of inhabitants must be greater than zero", invalidThermalHouse) } // Thermal Cylindrical Storage @@ -121,20 +121,20 @@ class ThermalUnitValidationUtilsTest extends Specification { } -def "ThermalUnitValidationUtils.checkDomesticHotWaterStorage() recognizes all potential errors for a domestic hot water storage"() { - when: - List> exceptions = ThermalUnitValidationUtils.check(invalidDomesticHotWaterStorage).stream().filter { it -> it.failure }.toList() - - then: - exceptions.size() == expectedSize - Exception ex = exceptions.get(0).exception.get() - ex.class == expectedException.class - ex.message == expectedException.message + def "ThermalUnitValidationUtils.checkDomesticHotWaterStorage() recognizes all potential errors for a domestic hot water storage"() { + when: + List> exceptions = ThermalUnitValidationUtils.check(invalidDomesticHotWaterStorage).stream().filter { it -> it.failure }.toList() - where: - invalidDomesticHotWaterStorage || expectedSize || expectedException - new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c, Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("Inlet temperature of the domestic hot water storage cannot be lower than outlet temperature", invalidDomesticHotWaterStorage) - new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidDomesticHotWaterStorage) - new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidDomesticHotWaterStorage) + then: + exceptions.size() == expectedSize + Exception ex = exceptions.get(0).exception.get() + ex.class == expectedException.class + ex.message == expectedException.message -}} + where: + invalidDomesticHotWaterStorage || expectedSize || expectedException + new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c, Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("Inlet temperature of the domestic hot water storage cannot be lower than outlet temperature", invalidDomesticHotWaterStorage) + new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidDomesticHotWaterStorage) + new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidDomesticHotWaterStorage) + } +} diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index 81d302368..863d26c55 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -39,7 +39,7 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) private static final String HOUSING_TYPE = "house" - private static final Integer NUMBER_INHABITANTS = 2 + private static final double NUMBER_INHABITANTS = 2.0 public static final thermalHouseInput = new ThermalHouseInput( thermalUnitUuid, From e44013b8d9ba6748f5cb45c964056362c0a902e1 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 13:06:40 +0200 Subject: [PATCH 063/310] fmt --- .../input/CylindricalStorageInputFactory.java | 12 ++++- .../DomesticHotWaterStorageInputFactory.java | 4 +- .../datamodel/io/source/ThermalSource.java | 20 +++------ .../thermal/CylindricalStorageInput.java | 2 +- .../thermal/DomesticHotWaterStorageInput.java | 8 +--- .../ThermalUnitValidationUtils.java | 45 ++++++++++--------- .../io/extractor/ExtractorTest.groovy | 6 +-- .../datamodel/io/sink/CsvFileSinkTest.groovy | 45 +++++++++---------- .../common/SystemParticipantTestData.groovy | 4 +- 9 files changed, 70 insertions(+), 76 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 5aa6ca3a3..0e1b7d9f8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -53,7 +53,15 @@ protected CylindricalStorageInput buildModel( final ComparableQuantity pThermalMax = data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); return new CylindricalStorageInput( - uuid, id, operator, operationTime, bus, storageVolumeLvl, inletTemp, returnTemp, c, - pThermalMax); + uuid, + id, + operator, + operationTime, + bus, + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java index dfc99beb7..442e1903c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java @@ -31,9 +31,7 @@ public DomesticHotWaterStorageInputFactory() { @Override protected String[] getAdditionalFields() { - return new String[] { - STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX - }; + return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX}; } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index f4cd02950..07f56a611 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -125,14 +125,8 @@ public Map getThermalBuses(Map opera * @return a map of UUID to object- and uuid-unique {@link ThermalStorageInput} entities */ public Map getThermalStorages() throws SourceException { - return Stream.concat( - getCylindricalStorages().stream(), - getDomesticHotWaterStorages().stream() - ) - .collect(Collectors.toMap( - ThermalStorageInput::getUuid, - storage -> storage - )); + return Stream.concat(getCylindricalStorages().stream(), getDomesticHotWaterStorages().stream()) + .collect(Collectors.toMap(ThermalStorageInput::getUuid, storage -> storage)); } /** @@ -158,13 +152,9 @@ public Map getThermalStorages( Map operators, Map thermalBuses) throws SourceException { return Stream.concat( - getCylindricalStorages(operators, thermalBuses).stream(), - getDomesticHotWaterStorages(operators, thermalBuses).stream() - ) - .collect(Collectors.toMap( - ThermalStorageInput::getUuid, - storage -> storage - )); + getCylindricalStorages(operators, thermalBuses).stream(), + getDomesticHotWaterStorages(operators, thermalBuses).stream()) + .collect(Collectors.toMap(ThermalStorageInput::getUuid, storage -> storage)); } /** diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 6ca1bf1cd..602175bcc 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -208,7 +208,7 @@ public CylindricalStorageInputCopyBuilder pThermalMax(ComparableQuantity @Override public CylindricalStorageInputCopyBuilder scale(Double factor) { storageVolumeLvl(storageVolumeLvl.multiply(factor)); - pThermalMax(pThermalMax.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); return this; } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index b5da3207e..a33aa5af6 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -127,13 +127,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash( - super.hashCode(), - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } @Override diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 5c4984f6f..bd79b3d48 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -125,7 +125,8 @@ private ThermalUnitValidationUtils() { } if (DomesticHotWaterStorageInput.class.isAssignableFrom(thermalStorageInput.getClass())) { - exceptions.addAll(checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); + exceptions.addAll( + checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); } else { logNotImplemented(thermalStorageInput); } @@ -250,7 +251,9 @@ private static List> checkCylindricalStorage( () -> detectZeroOrNegativeQuantities( new Quantity[] { - cylindricalStorageInput.getStorageVolumeLvl(), cylindricalStorageInput.getC(), cylindricalStorageInput.getpThermalMax() + cylindricalStorageInput.getStorageVolumeLvl(), + cylindricalStorageInput.getC(), + cylindricalStorageInput.getpThermalMax() }, cylindricalStorageInput), InvalidEntityException.class)); @@ -272,9 +275,9 @@ private static List> checkCylindricalStorage( * Success */ private static List> checkDomesticHotWaterStorage( - DomesticHotWaterStorageInput domesticHotWaterStorageInput) { + DomesticHotWaterStorageInput domesticHotWaterStorageInput) { Try isNull = - checkNonNull(domesticHotWaterStorageInput, "a domestic hot water storage"); + checkNonNull(domesticHotWaterStorageInput, "a domestic hot water storage"); if (isNull.isFailure()) { return List.of(isNull); @@ -284,24 +287,26 @@ private static List> checkDomesticHotWaterStor // Check if inlet temperature is higher/equal to outlet temperature exceptions.add( - Try.ofVoid( - domesticHotWaterStorageInput - .getInletTemp() - .isLessThan(domesticHotWaterStorageInput.getReturnTemp()), - () -> - new InvalidEntityException( - "Inlet temperature of the domestic hot water storage cannot be lower than outlet temperature", - domesticHotWaterStorageInput))); + Try.ofVoid( + domesticHotWaterStorageInput + .getInletTemp() + .isLessThan(domesticHotWaterStorageInput.getReturnTemp()), + () -> + new InvalidEntityException( + "Inlet temperature of the domestic hot water storage cannot be lower than outlet temperature", + domesticHotWaterStorageInput))); exceptions.add( - Try.ofVoid( - () -> - detectZeroOrNegativeQuantities( - new Quantity[] { - domesticHotWaterStorageInput.getStorageVolumeLvl(), domesticHotWaterStorageInput.getC(), domesticHotWaterStorageInput.getpThermalMax() - }, - domesticHotWaterStorageInput), - InvalidEntityException.class)); + Try.ofVoid( + () -> + detectZeroOrNegativeQuantities( + new Quantity[] { + domesticHotWaterStorageInput.getStorageVolumeLvl(), + domesticHotWaterStorageInput.getC(), + domesticHotWaterStorageInput.getpThermalMax() + }, + domesticHotWaterStorageInput), + InvalidEntityException.class)); return exceptions; } diff --git a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index fd513bf33..8e8096879 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -141,9 +141,9 @@ class ExtractorTest extends Specification { ] tutd.domesticHotWaterStorageInput || [ - tutd.domesticHotWaterStorageInput.operator, - tutd.domesticHotWaterStorageInput.thermalBus, - tutd.domesticHotWaterStorageInput.thermalBus.operator + tutd.domesticHotWaterStorageInput.operator, + tutd.domesticHotWaterStorageInput.thermalBus, + tutd.domesticHotWaterStorageInput.thermalBus.operator ] tutd.thermalHouseInput || [ diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 456b3ca19..e97138f54 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -5,8 +5,6 @@ */ package edu.ie3.datamodel.io.sink -import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput - import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.KILOVOLTAMPERE import static tech.units.indriya.unit.Units.PERCENT @@ -33,6 +31,7 @@ import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput import edu.ie3.datamodel.models.input.system.characteristic.CosPhiFixed import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput +import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalBusInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.models.result.system.EmResult @@ -120,27 +119,27 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { given: CsvFileSink csvFileSink = new CsvFileSink(testBaseFolderPath, new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(WecResult), - new ResultEntityProcessor(EvResult), - new ResultEntityProcessor(EvcsResult), - new ResultEntityProcessor(EmResult), - new ResultEntityProcessor(FlexOptionsResult), - new InputEntityProcessor(Transformer2WInput), - new InputEntityProcessor(NodeInput), - new InputEntityProcessor(EvcsInput), - new InputEntityProcessor(Transformer2WTypeInput), - new InputEntityProcessor(LineGraphicInput), - new InputEntityProcessor(NodeGraphicInput), - new InputEntityProcessor(CylindricalStorageInput), - new InputEntityProcessor(DomesticHotWaterStorageInput), - new InputEntityProcessor(ThermalHouseInput), - new InputEntityProcessor(OperatorInput), - new InputEntityProcessor(LineInput), - new InputEntityProcessor(ThermalBusInput), - new InputEntityProcessor(LineTypeInput), - new InputEntityProcessor(LoadInput), - new InputEntityProcessor(EmInput) + new ResultEntityProcessor(PvResult), + new ResultEntityProcessor(WecResult), + new ResultEntityProcessor(EvResult), + new ResultEntityProcessor(EvcsResult), + new ResultEntityProcessor(EmResult), + new ResultEntityProcessor(FlexOptionsResult), + new InputEntityProcessor(Transformer2WInput), + new InputEntityProcessor(NodeInput), + new InputEntityProcessor(EvcsInput), + new InputEntityProcessor(Transformer2WTypeInput), + new InputEntityProcessor(LineGraphicInput), + new InputEntityProcessor(NodeGraphicInput), + new InputEntityProcessor(CylindricalStorageInput), + new InputEntityProcessor(DomesticHotWaterStorageInput), + new InputEntityProcessor(ThermalHouseInput), + new InputEntityProcessor(OperatorInput), + new InputEntityProcessor(LineInput), + new InputEntityProcessor(ThermalBusInput), + new InputEntityProcessor(LineTypeInput), + new InputEntityProcessor(LoadInput), + new InputEntityProcessor(EmInput) ], [] as Map), new FileNamingStrategy(), ",") diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index be67fcd4b..0247d5297 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.test.common +import static edu.ie3.datamodel.models.StandardUnits.* + import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput @@ -30,8 +32,6 @@ import tech.units.indriya.quantity.Quantities import javax.measure.quantity.* -import static edu.ie3.datamodel.models.StandardUnits.* - class SystemParticipantTestData { // general participant data From b16507b6e810362ec0121776b70dc59c9a4f0a7d Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 14:13:30 +0200 Subject: [PATCH 064/310] refactor DomesticHotWaterStorageInput to extend CylindricalStorageInput --- .../input/CylindricalStorageInputFactory.java | 3 +- .../datamodel/io/source/ThermalSource.java | 3 +- .../thermal/CylindricalStorageInput.java | 2 +- .../thermal/DomesticHotWaterStorageInput.java | 157 ++++-------------- .../input/container/ThermalGridTest.groovy | 2 +- 5 files changed, 34 insertions(+), 133 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 0e1b7d9f8..4b2949519 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -25,7 +25,8 @@ public class CylindricalStorageInputFactory private static final String C = "c"; private static final String P_THERMAL_MAX = "pThermalMax"; - public CylindricalStorageInputFactory() { + public CylindricalStorageInputFactory( + Class cylindricalStorageInputClass) { super(CylindricalStorageInput.class); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 07f56a611..3450aaf54 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -49,7 +49,8 @@ public ThermalSource(TypeSource typeSource, DataSource dataSource) { this.typeSource = typeSource; this.thermalBusInputFactory = new ThermalBusInputFactory(); - this.cylindricalStorageInputFactory = new CylindricalStorageInputFactory(); + this.cylindricalStorageInputFactory = + new CylindricalStorageInputFactory(CylindricalStorageInput.class); this.domesticHotWaterStorageInputFactory = new DomesticHotWaterStorageInputFactory(); this.thermalHouseInputFactory = new ThermalHouseInputFactory(); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 602175bcc..d0bf19713 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -169,7 +169,7 @@ public static class CylindricalStorageInputCopyBuilder private ComparableQuantity c; private ComparableQuantity pThermalMax; - private CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { + CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); this.storageVolumeLvl = entity.getStorageVolumeLvl(); this.inletTemp = entity.getInletTemp(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index a33aa5af6..7283b9a97 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -6,30 +6,19 @@ package edu.ie3.datamodel.models.input.thermal; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; -import java.util.Objects; import java.util.UUID; import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; -/** Thermal storage with cylindrical shape store hot tap water */ -public class DomesticHotWaterStorageInput extends ThermalStorageInput { - /** Available storage volume (typically in m³) */ - private final ComparableQuantity storageVolumeLvl; - /** Temperature of the inlet (typically in C) */ - private final ComparableQuantity inletTemp; - /** Temperature of the outlet (typically in C) */ - private final ComparableQuantity returnTemp; - /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ - private final ComparableQuantity c; - /** Maximum permissible thermal power (typically in kW) */ - private final ComparableQuantity pThermalMax; +public class DomesticHotWaterStorageInput extends CylindricalStorageInput { /** + * Constructor for DomesticHotWaterStorageInput + * * @param uuid Unique identifier of a domestic hot water storage * @param id Identifier of the thermal unit * @param operator operator of the asset @@ -52,15 +41,22 @@ public DomesticHotWaterStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, operator, operationTime, bus); - this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); - this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); - this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + super( + uuid, + id, + operator, + operationTime, + bus, + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); } /** + * Alternative constructor for DomesticHotWaterStorageInput + * * @param uuid Unique identifier of a domestic hot water storage * @param id Identifier of the thermal unit * @param bus Thermal bus, a thermal unit is connected to @@ -75,37 +71,11 @@ public DomesticHotWaterStorageInput( String id, ThermalBusInput bus, ComparableQuantity storageVolumeLvl, - ComparableQuantity storageVolumeLvlMin, ComparableQuantity inletTemp, ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, bus); - this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); - this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); - this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); - } - - public ComparableQuantity getStorageVolumeLvl() { - return storageVolumeLvl; - } - - public ComparableQuantity getInletTemp() { - return inletTemp; - } - - public ComparableQuantity getReturnTemp() { - return returnTemp; - } - - public ComparableQuantity getC() { - return c; - } - - public ComparableQuantity getpThermalMax() { - return pThermalMax; + super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } @Override @@ -113,23 +83,6 @@ public DomesticHotWaterStorageInputCopyBuilder copy() { return new DomesticHotWaterStorageInputCopyBuilder(this); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof DomesticHotWaterStorageInput that)) return false; - if (!super.equals(o)) return false; - return storageVolumeLvl.equals(that.storageVolumeLvl) - && inletTemp.equals(that.inletTemp) - && returnTemp.equals(that.returnTemp) - && c.equals(that.c) - && pThermalMax.equals(that.pThermalMax); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); - } - @Override public String toString() { return "DomesticHotWaterStorageInput{" @@ -144,76 +97,22 @@ public String toString() { + ", bus=" + getThermalBus().getUuid() + ", storageVolumeLvl=" - + storageVolumeLvl + + getStorageVolumeLvl() + ", inletTemp=" - + inletTemp + + getInletTemp() + ", returnTemp=" - + returnTemp + + getReturnTemp() + ", c=" - + c + + getC() + ", pThermalMax=" - + pThermalMax + + getpThermalMax() + '}'; } - /** - * A builder pattern based approach to create copies of {@link DomesticHotWaterStorageInput} - * entities with altered field values. For detailed field descriptions refer to java docs of - * {@link DomesticHotWaterStorageInput} - */ - public static class DomesticHotWaterStorageInputCopyBuilder - extends ThermalStorageInputCopyBuilder { - - private ComparableQuantity storageVolumeLvl; - private ComparableQuantity storageVolumeLvlMin; - private ComparableQuantity inletTemp; - private ComparableQuantity returnTemp; - private ComparableQuantity c; - private ComparableQuantity pThermalMax; + public class DomesticHotWaterStorageInputCopyBuilder extends CylindricalStorageInputCopyBuilder { private DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); - this.storageVolumeLvl = entity.getStorageVolumeLvl(); - this.inletTemp = entity.getInletTemp(); - this.returnTemp = entity.getReturnTemp(); - this.c = entity.getC(); - this.pThermalMax = entity.getpThermalMax(); - } - - public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl( - ComparableQuantity storageVolumeLvl) { - this.storageVolumeLvl = storageVolumeLvl; - return this; - } - - public DomesticHotWaterStorageInputCopyBuilder inletTemp( - ComparableQuantity inletTemp) { - this.inletTemp = inletTemp; - return this; - } - - public DomesticHotWaterStorageInputCopyBuilder returnTemp( - ComparableQuantity returnTemp) { - this.returnTemp = returnTemp; - return this; - } - - public DomesticHotWaterStorageInputCopyBuilder c(ComparableQuantity c) { - this.c = c; - return this; - } - - public DomesticHotWaterStorageInputCopyBuilder pThermalMax( - ComparableQuantity pThermalMax) { - this.pThermalMax = pThermalMax; - return this; - } - - @Override - public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { - storageVolumeLvl(storageVolumeLvl.multiply(factor)); - pThermalMax(pThermalMax.multiply(factor)); - return this; } @Override @@ -224,11 +123,11 @@ public DomesticHotWaterStorageInput build() { getOperator(), getOperationTime(), getThermalBus(), - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); + getStorageVolumeLvl(), + getInletTemp(), + getReturnTemp(), + getC(), + getpThermalMax()); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy index ca34f5270..904635bb9 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy @@ -42,7 +42,7 @@ class ThermalGridTest extends Specification { def thermalHouses = [] def heatStorages = [] def domesticHotWaterStorages = [] - def thermalGrid = new ThermalGrid(thermalBus, thermalHouses, heatStorages,domesticHotWaterStorages) + def thermalGrid = new ThermalGrid(thermalBus, thermalHouses, heatStorages, domesticHotWaterStorages) def modifiedHouses = [Mock(ThermalHouseInput)] def modifiedHeatStorages = [Mock(CylindricalStorageInput)] From 322a48c4b08c6ec0403ebbc39789f520fee22658 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 14:30:43 +0200 Subject: [PATCH 065/310] fix validation test --- .../validation/ThermalUnitValidationUtils.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index bd79b3d48..27fbc3623 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -118,17 +118,11 @@ private ThermalUnitValidationUtils() { List> exceptions = new ArrayList<>(); // Further checks for subclasses - if (CylindricalStorageInput.class.isAssignableFrom(thermalStorageInput.getClass())) { - exceptions.addAll(checkCylindricalStorage((CylindricalStorageInput) thermalStorageInput)); - } else { - logNotImplemented(thermalStorageInput); - } + if (thermalStorageInput.getClass() == CylindricalStorageInput.class) { + exceptions.addAll(checkCylindricalStorage((CylindricalStorageInput) thermalStorageInput));} - if (DomesticHotWaterStorageInput.class.isAssignableFrom(thermalStorageInput.getClass())) { - exceptions.addAll( - checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); - } else { - logNotImplemented(thermalStorageInput); + if (thermalStorageInput.getClass() == DomesticHotWaterStorageInput.class) { + exceptions.addAll(checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); } return exceptions; From 211bd658247f1fe57698ee698679a606f1c1e2ac Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 14:37:44 +0200 Subject: [PATCH 066/310] fix scaling of DomesticHotWaterStorageInput --- .../models/input/thermal/DomesticHotWaterStorageInput.java | 6 ++++++ .../input/thermal/DomesticHotWaterStorageInputTest.groovy | 2 +- .../edu/ie3/test/common/ThermalUnitInputTestData.groovy | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 7283b9a97..5b63adbce 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -115,6 +115,12 @@ private DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput ent super(entity); } + public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { + storageVolumeLvl(getStorageVolumeLvl().multiply(factor)); + pThermalMax(getpThermalMax().multiply(factor)); + return this; + } + @Override public DomesticHotWaterStorageInput build() { return new DomesticHotWaterStorageInput( diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy index 92232c3b0..f28864c13 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInputTest.groovy @@ -36,7 +36,7 @@ class DomesticHotWaterStorageInputTest extends Specification { } } - def "Scaling a CylindricalStorageInput via builder should work as expected"() { + def "Scaling a DomesticHotWaterStorageInput via builder should work as expected"() { given: def domesticHotWaterStorageInput = ThermalUnitInputTestData.domesticHotWaterStorageInput diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index 863d26c55..3f6b6c3db 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -64,7 +64,7 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { public static final cylindricalStorageInput = new CylindricalStorageInput( thermalUnitUuid, - "testCylindricStorageInput", + "testCylindricalStorageInput", operator, operationTime, thermalBus, From e8f18f0135dd222d248eea5408091dbe4d73db59 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 14:37:57 +0200 Subject: [PATCH 067/310] fmt --- .../utils/validation/ThermalUnitValidationUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 27fbc3623..0d4f7e020 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -119,10 +119,12 @@ private ThermalUnitValidationUtils() { // Further checks for subclasses if (thermalStorageInput.getClass() == CylindricalStorageInput.class) { - exceptions.addAll(checkCylindricalStorage((CylindricalStorageInput) thermalStorageInput));} + exceptions.addAll(checkCylindricalStorage((CylindricalStorageInput) thermalStorageInput)); + } if (thermalStorageInput.getClass() == DomesticHotWaterStorageInput.class) { - exceptions.addAll(checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); + exceptions.addAll( + checkDomesticHotWaterStorage((DomesticHotWaterStorageInput) thermalStorageInput)); } return exceptions; From cb22fabb7d67729c598ced7e24847bfc6aea9571 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 9 Aug 2024 14:41:27 +0200 Subject: [PATCH 068/310] Adding BDEW standard load profiles. --- CHANGELOG.md | 1 + .../io/source/LoadProfileSource.java | 106 ++++++++++++++++++ .../models/profile/LoadProfileKey.java | 101 +++++++++++++++++ .../repetitive/BDEWLoadProfileEntry.java | 56 +++++++++ .../repetitive/BDEWLoadProfileInput.java | 87 ++++++++++++++ .../repetitive/LoadProfileInput.java | 17 +-- .../repetitive/RepetitiveTimeSeries.java | 10 ++ .../resources/load/standard_load_profiles.csv | 97 ++++++++++++++++ 8 files changed, 462 insertions(+), 13 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java create mode 100644 src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java create mode 100644 src/main/resources/load/standard_load_profiles.csv diff --git a/CHANGELOG.md b/CHANGELOG.md index 083590698..7ba455188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased/Snapshot] ### Added +- BDEW standard load profiles [#1106](https://github.com/ie3-institute/PowerSystemDataModel/issues/1106) ### Fixed diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java new file mode 100644 index 000000000..a13845c2d --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -0,0 +1,106 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.source; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.connectors.CsvFileConnector; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileInput; +import edu.ie3.datamodel.models.value.PValue; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.apache.commons.lang3.tuple.Pair; +import tech.units.indriya.quantity.Quantities; + +public class LoadProfileSource extends EntitySource { + + private final Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); + + @Override + public void validate() throws ValidationException { + /* Nothing to do here */ + } + + public Map getBDEWLoadProfiles() + throws SourceException { + CsvFileConnector connector = new CsvFileConnector(bdewLoadProfilePath); + + try (BufferedReader reader = connector.initReader(Path.of("standard_load_profiles"))) { + return parseBDEWStandardProfiles(reader); + } catch (IOException | ParsingException e) { + throw new SourceException("The bdew standard load profiles could not be loaded!", e); + } + } + + protected Map parseBDEWStandardProfiles( + BufferedReader reader) throws IOException, ParsingException { + String[] headline = reader.readLine().split(","); + + Map positionToKey = new HashMap<>(); + for (int i = 0; i < headline.length - 1; i++) { + String header = headline[i]; + positionToKey.put(i, LoadProfileKey.parseBDEWProfile(header)); + } + + Map> values = + reader + .lines() + .map( + row -> { + String[] arr = row.split(","); + + int quarterHour = Integer.parseInt(arr[arr.length - 1]); + + return IntStream.range(0, arr.length - 1) + .boxed() + .map( + i -> { + LoadProfileKey key = positionToKey.get(i); + + return Pair.of( + key, + new BDEWLoadProfileEntry( + new PValue( + Quantities.getQuantity( + Double.parseDouble(arr[i]), KILOWATT)), + key.season(), + key.dayOfWeek(), + quarterHour)); + }) + .toList(); + }) + .flatMap(Collection::stream) + .collect(Collectors.groupingBy(Pair::getLeft)) + .entrySet() + .stream() + .map(e -> Map.entry(e.getKey(), e.getValue().stream().map(Pair::getValue).toList())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + return Arrays.stream(BdewStandardLoadProfile.values()) + .map( + profile -> + Map.entry( + profile, + new BDEWLoadProfileInput( + profile, + values.keySet().stream() + .filter(key -> key.profile() == profile) + .map(values::get) + .flatMap(Collection::stream) + .collect(Collectors.toSet())))) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java new file mode 100644 index 000000000..37fde7362 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java @@ -0,0 +1,101 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.profile; + +import edu.ie3.datamodel.exceptions.ParsingException; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; + +public record LoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) { + + public static LoadProfileKey parseBDEWProfile(String key) throws ParsingException { + String profile = key.substring(0, 2); + String season = key.substring(2, 4); + String dayString = key.substring(4, 6); + + DayOfWeek day = + switch (dayString) { + case "Sa" -> DayOfWeek.SATURDAY; + case "Su" -> DayOfWeek.SUNDAY; + default -> DayOfWeek.MONDAY; + }; + + return new LoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); + } + + public enum Season { + WINTER("Wi"), + SUMMER("Su"), + TRANSITION("Tr"); + + private final String key; + + Season(String key) { + this.key = key.toLowerCase(); + } + + public static Season parse(String key) throws ParsingException { + return switch (key) { + case "Wi" -> WINTER; + case "Su" -> SUMMER; + case "Tr" -> TRANSITION; + default -> throw new ParsingException("There is no season for key:" + key); + }; + } + + /** + * Creates a season from given time + * + * @param time the time + * @return a season + */ + public static Season get(ZonedDateTime time) { + int day = time.getDayOfMonth(); + + // winter: 1.11.-20.03. + // summer: 15.05.-14.09. + // transition: 21.03.-14.05. and + // 15.09.-31.10. + // (VDEW handbook) + + return switch (time.getMonth()) { + case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; + case MARCH -> { + if (day <= 20) { + yield WINTER; + } else { + yield TRANSITION; + } + } + case MAY -> { + if (day >= 15) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + case JUNE, JULY, AUGUST -> SUMMER; + case SEPTEMBER -> { + if (day <= 14) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + default -> TRANSITION; + }; + } + + public String getKey() { + return key; + } + + @Override + public String toString() { + return "Season{" + "key='" + key + '\'' + '}'; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java new file mode 100644 index 000000000..556323071 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java @@ -0,0 +1,56 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.util.Objects; + +/** Unique entry to a {@link BDEWLoadProfileInput} */ +public class BDEWLoadProfileEntry extends LoadProfileEntry { + private final LoadProfileKey.Season season; + + public BDEWLoadProfileEntry( + PValue value, LoadProfileKey.Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { + super(value, dayOfWeek, quarterHourOfDay); + this.season = season; + } + + public LoadProfileKey.Season getSeason() { + return season; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + BDEWLoadProfileEntry that = (BDEWLoadProfileEntry) o; + return getQuarterHourOfDay() == that.getQuarterHourOfDay() + && season == that.season + && getDayOfWeek() == that.getDayOfWeek(); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), season); + } + + @Override + public String toString() { + return "BDEWLoadProfileEntry{" + + "dayOfWeek=" + + getDayOfWeek() + + "season=" + + season + + ", quarterHourOfDay=" + + getQuarterHourOfDay() + + ", value=" + + value + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java new file mode 100644 index 000000000..fc2c170f5 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java @@ -0,0 +1,87 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class BDEWLoadProfileInput extends RepetitiveTimeSeries { + private final BdewStandardLoadProfile loadProfile; + private final Map> valueMapping; + + public BDEWLoadProfileInput( + BdewStandardLoadProfile loadProfile, Set values) { + super(UUID.randomUUID(), values); + this.loadProfile = loadProfile; + + this.valueMapping = + values.stream() + .collect( + Collectors.groupingBy( + e -> new Key(e.getSeason(), e.getDayOfWeek()), + Collectors.toMap( + LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + } + + @Override + public PValue calc(ZonedDateTime time) { + Key key = fromTime(time); + int quarterHour = time.getHour() * 4 + time.getMinute() / 15; + + return valueMapping.get(key).get(quarterHour); + } + + public BdewStandardLoadProfile getLoadProfile() { + return loadProfile; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + BDEWLoadProfileInput that = (BDEWLoadProfileInput) o; + return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), loadProfile, valueMapping); + } + + @Override + public String toString() { + return "BDEWLoadProfileInput{" + + "loadProfile=" + + loadProfile + + ", valueMapping=" + + valueMapping + + '}'; + } + + private Key fromTime(ZonedDateTime time) { + LoadProfileKey.Season season = LoadProfileKey.Season.get(time); + + DayOfWeek day = + switch (time.getDayOfWeek()) { + case SATURDAY -> DayOfWeek.SATURDAY; + case SUNDAY -> DayOfWeek.SUNDAY; + default -> DayOfWeek.MONDAY; + }; + + return new Key(season, day); + } + + private record Key(LoadProfileKey.Season season, DayOfWeek dayOfWeek) {} +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java index add926f95..93b6b3a6b 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java @@ -5,13 +5,14 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import static java.time.temporal.ChronoUnit.HOURS; - import edu.ie3.datamodel.models.profile.StandardLoadProfile; import edu.ie3.datamodel.models.value.PValue; import java.time.DayOfWeek; import java.time.ZonedDateTime; -import java.util.*; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; // TODO This is a sample implementation, please implement a real scenario @@ -40,16 +41,6 @@ public PValue calc(ZonedDateTime time) { return dayOfWeekToHourlyValues.get(time.getDayOfWeek()).get(time.getHour()); } - @Override - protected Optional getPreviousDateTime(ZonedDateTime time) { - return Optional.of(time.minus(1, HOURS)); - } - - @Override - protected Optional getNextDateTime(ZonedDateTime time) { - return Optional.of(time.plus(1, HOURS)); - } - public StandardLoadProfile getType() { return type; } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index 672ee5589..c488098ab 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -36,4 +36,14 @@ protected RepetitiveTimeSeries(UUID uuid, Set entries) { public Optional getValue(ZonedDateTime time) { return Optional.of(calc(time)); } + + @Override + protected Optional getPreviousDateTime(ZonedDateTime time) { + return Optional.of(time.minusHours(1)); + } + + @Override + protected Optional getNextDateTime(ZonedDateTime time) { + return Optional.of(time.plusHours(1)); + } } diff --git a/src/main/resources/load/standard_load_profiles.csv b/src/main/resources/load/standard_load_profiles.csv new file mode 100644 index 000000000..64780bf40 --- /dev/null +++ b/src/main/resources/load/standard_load_profiles.csv @@ -0,0 +1,97 @@ +g0SuSa,g0SuSu,g0SuWd,g0TrSa,g0TrSu,g0TrWd,g0WiSa,g0WiSu,g0WiWd,h0SuSa,h0SuSu,h0SuWd,h0TrSa,h0TrSu,h0TrWd,h0WiSa,h0WiSu,h0WiWd,l0SuSa,l0SuSu,l0SuWd,l0TrSa,l0TrSu,l0TrWd,l0WiSa,l0WiSu,l0WiWd,quarterHour +74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 +76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 +77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 +78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 +77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 +76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 +74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 +71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 +70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 +68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 +67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 +67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 +66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 +66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 +66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 +67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 +68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 +69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 +70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 +71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 +71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 +72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 +72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 +72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 +73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 +73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 +77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 +83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 +93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 +106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 +120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 +134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 +147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 +157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 +166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 +171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 +175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 +176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 +176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 +176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 +177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 +179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 +181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 +183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 +184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 +185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 +185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 +185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 +184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 +182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 +179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 +175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 +170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 +163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 +154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 +144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 +133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 +122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 +112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 +102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 +95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 +90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 +86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 +83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 +80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 +77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 +75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 +74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 +74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 +74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 +75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 +76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 +77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 +78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 +79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 +79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 +79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 +79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 +79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 +80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 +81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 +83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 +85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 +86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 +87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 +86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 +84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 +83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 +81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 +79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 +77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 +75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 +74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 +72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 +71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 +70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 From 6ca993f536dab724f3dae1b8391e672fee2c8108 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 9 Aug 2024 15:14:02 +0200 Subject: [PATCH 069/310] adapt copybuilders --- .../thermal/CylindricalStorageInput.java | 10 +++---- .../thermal/DomesticHotWaterStorageInput.java | 30 ++++++++++++++++++- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index d0bf19713..125fdf6e6 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -163,11 +163,11 @@ public String toString() { public static class CylindricalStorageInputCopyBuilder extends ThermalStorageInputCopyBuilder { - private ComparableQuantity storageVolumeLvl; - private ComparableQuantity inletTemp; - private ComparableQuantity returnTemp; - private ComparableQuantity c; - private ComparableQuantity pThermalMax; + ComparableQuantity storageVolumeLvl; + ComparableQuantity inletTemp; + ComparableQuantity returnTemp; + ComparableQuantity c; + ComparableQuantity pThermalMax; CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 5b63adbce..2d13747c1 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -111,10 +111,38 @@ public String toString() { public class DomesticHotWaterStorageInputCopyBuilder extends CylindricalStorageInputCopyBuilder { - private DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { + public DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); } + + public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl(ComparableQuantity storageVolumeLvl) { + this.storageVolumeLvl = storageVolumeLvl; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder inletTemp(ComparableQuantity inletTemp) { + this.inletTemp = inletTemp; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder returnTemp( + ComparableQuantity returnTemp) { + this.returnTemp = returnTemp; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder c(ComparableQuantity c) { + this.c = c; + return this; + } + + public DomesticHotWaterStorageInputCopyBuilder pThermalMax(ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return this; + } + + @Override public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { storageVolumeLvl(getStorageVolumeLvl().multiply(factor)); pThermalMax(getpThermalMax().multiply(factor)); From 77d4d4b70510bcff00f04fc4605d20b804ed13fc Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 9 Aug 2024 17:31:43 +0200 Subject: [PATCH 070/310] Adding BDEW standard load profiles. --- .../io/source/LoadProfileSource.java | 125 ++++++++++-------- .../models/profile/LoadProfileKey.java | 11 +- 2 files changed, 80 insertions(+), 56 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index a13845c2d..dc0b1d790 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -13,16 +13,17 @@ import edu.ie3.datamodel.io.connectors.CsvFileConnector; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.profile.LoadProfileKey.BDEWLoadProfileKey; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileInput; import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.utils.Try; import java.io.BufferedReader; import java.io.IOException; import java.nio.file.Path; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.IntStream; -import org.apache.commons.lang3.tuple.Pair; import tech.units.indriya.quantity.Quantities; public class LoadProfileSource extends EntitySource { @@ -46,61 +47,81 @@ public Map getBDEWLoadProfiles() } protected Map parseBDEWStandardProfiles( - BufferedReader reader) throws IOException, ParsingException { - String[] headline = reader.readLine().split(","); + BufferedReader reader) throws IOException, ParsingException, SourceException { - Map positionToKey = new HashMap<>(); - for (int i = 0; i < headline.length - 1; i++) { - String header = headline[i]; - positionToKey.put(i, LoadProfileKey.parseBDEWProfile(header)); - } + Map>> dataMap = + readLoadProfile( + reader, + ",", + str -> Try.of(() -> LoadProfileKey.parseBDEWProfile(str), ParsingException.class)); - Map> values = - reader - .lines() - .map( - row -> { - String[] arr = row.split(","); + return Arrays.stream(BdewStandardLoadProfile.values()) + .map( + profile -> { + Set entries = + dataMap.keySet().stream() + .filter(e -> e.profile() == profile) + .map(dataMap::get) + .flatMap(Collection::stream) + .map( + d -> + new BDEWLoadProfileEntry( + d.value, + d.profileKey.season(), + d.profileKey.dayOfWeek(), + d.quarterHour)) + .collect(Collectors.toSet()); - int quarterHour = Integer.parseInt(arr[arr.length - 1]); + return Map.entry(profile, new BDEWLoadProfileInput(profile, entries)); + }) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } - return IntStream.range(0, arr.length - 1) - .boxed() - .map( - i -> { - LoadProfileKey key = positionToKey.get(i); - - return Pair.of( - key, - new BDEWLoadProfileEntry( - new PValue( - Quantities.getQuantity( - Double.parseDouble(arr[i]), KILOWATT)), - key.season(), - key.dayOfWeek(), - quarterHour)); - }) - .toList(); - }) - .flatMap(Collection::stream) - .collect(Collectors.groupingBy(Pair::getLeft)) - .entrySet() - .stream() - .map(e -> Map.entry(e.getKey(), e.getValue().stream().map(Pair::getValue).toList())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + private Map>> readLoadProfile( + BufferedReader reader, String csvSep, Function> keyExtractor) + throws IOException, SourceException, ParsingException { + List headline = Arrays.asList(reader.readLine().split(csvSep)); - return Arrays.stream(BdewStandardLoadProfile.values()) + int quarterHourColumn = headline.indexOf("quarterHour"); + + if (quarterHourColumn < 0) { + throw new SourceException("There is no column for quarter hour values."); + } + + Map profileKeys = new HashMap<>(); + + for (int i = 0; i < headline.size(); i++) { + if (i != quarterHourColumn) { + profileKeys.put(i, keyExtractor.apply(headline.get(i)).getOrThrow()); + } + } + + return reader + .lines() .map( - profile -> - Map.entry( - profile, - new BDEWLoadProfileInput( - profile, - values.keySet().stream() - .filter(key -> key.profile() == profile) - .map(values::get) - .flatMap(Collection::stream) - .collect(Collectors.toSet())))) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + csvRow -> { + List elements = Arrays.asList(csvRow.split(csvSep)); + int quarterHour = Integer.parseInt(elements.get(quarterHourColumn)); + + List> loadProfileToValue = new ArrayList<>(); + + for (int i = 0; i < elements.size(); i++) { + if (i != quarterHourColumn) { + loadProfileToValue.add( + new LoadProfileData<>( + profileKeys.get(i), + quarterHour, + new PValue( + Quantities.getQuantity( + Double.parseDouble(elements.get(i)), KILOWATT)))); + } + } + return loadProfileToValue; + }) + .flatMap(Collection::stream) + .collect(Collectors.groupingBy(LoadProfileData::profileKey)); } + + public record LoadProfileData( + T profileKey, int quarterHour, PValue value) {} } diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java index 37fde7362..b11157eca 100644 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java @@ -9,9 +9,9 @@ import java.time.DayOfWeek; import java.time.ZonedDateTime; -public record LoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) { +public interface LoadProfileKey { - public static LoadProfileKey parseBDEWProfile(String key) throws ParsingException { + static BDEWLoadProfileKey parseBDEWProfile(String key) throws ParsingException { String profile = key.substring(0, 2); String season = key.substring(2, 4); String dayString = key.substring(4, 6); @@ -23,10 +23,13 @@ public static LoadProfileKey parseBDEWProfile(String key) throws ParsingExceptio default -> DayOfWeek.MONDAY; }; - return new LoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); + return new BDEWLoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); } - public enum Season { + record BDEWLoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) + implements LoadProfileKey {} + + enum Season { WINTER("Wi"), SUMMER("Su"), TRANSITION("Tr"); From 4eeaccd8de33ebaf783c323cf4fcc10c0b0e0f73 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 13 Aug 2024 17:05:59 +0200 Subject: [PATCH 071/310] remove storageVolumeMinLvL as well from CylindricalStorageInputFactoryTest --- .../input/CylindricalStorageInputFactoryTest.groovy | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy index 91cb1a5cf..20e516f8e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy @@ -32,10 +32,9 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", "id" : "TestID", "storagevolumelvl" : "3", - "storagevolumelvlmin": "4", - "inlettemp" : "5", - "returntemp" : "6", - "c" : "7" + "inlettemp" : "4", + "returntemp" : "5", + "c" : "6" ] def inputClass = CylindricalStorageInput def thermalBusInput = Mock(ThermalBusInput) From 2a428ef90fce6a400ffd68526d56b7f4a62fe417 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 14 Aug 2024 09:30:41 +0200 Subject: [PATCH 072/310] fmt --- .../input/thermal/DomesticHotWaterStorageInput.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 2d13747c1..b7ecc0bb7 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -115,19 +115,20 @@ public DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput enti super(entity); } - - public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl(ComparableQuantity storageVolumeLvl) { + public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl( + ComparableQuantity storageVolumeLvl) { this.storageVolumeLvl = storageVolumeLvl; return this; } - public DomesticHotWaterStorageInputCopyBuilder inletTemp(ComparableQuantity inletTemp) { + public DomesticHotWaterStorageInputCopyBuilder inletTemp( + ComparableQuantity inletTemp) { this.inletTemp = inletTemp; return this; } public DomesticHotWaterStorageInputCopyBuilder returnTemp( - ComparableQuantity returnTemp) { + ComparableQuantity returnTemp) { this.returnTemp = returnTemp; return this; } @@ -137,7 +138,8 @@ public DomesticHotWaterStorageInputCopyBuilder c(ComparableQuantity pThermalMax) { + public DomesticHotWaterStorageInputCopyBuilder pThermalMax( + ComparableQuantity pThermalMax) { this.pThermalMax = pThermalMax; return this; } From d7fd77c648b439ff4930eda38c33a6769f02d502 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 14 Aug 2024 09:52:05 +0200 Subject: [PATCH 073/310] avoid unused constructor parameters in CylindricalStorageInputFactory --- .../io/factory/input/CylindricalStorageInputFactory.java | 3 +-- src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 4b2949519..0e1b7d9f8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -25,8 +25,7 @@ public class CylindricalStorageInputFactory private static final String C = "c"; private static final String P_THERMAL_MAX = "pThermalMax"; - public CylindricalStorageInputFactory( - Class cylindricalStorageInputClass) { + public CylindricalStorageInputFactory() { super(CylindricalStorageInput.class); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 3450aaf54..6f8a71dd8 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -50,7 +50,7 @@ public ThermalSource(TypeSource typeSource, DataSource dataSource) { this.thermalBusInputFactory = new ThermalBusInputFactory(); this.cylindricalStorageInputFactory = - new CylindricalStorageInputFactory(CylindricalStorageInput.class); + new CylindricalStorageInputFactory(); this.domesticHotWaterStorageInputFactory = new DomesticHotWaterStorageInputFactory(); this.thermalHouseInputFactory = new ThermalHouseInputFactory(); } From 2980539a2dad76ac717a9274814243e7a125292c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 08:02:00 +0000 Subject: [PATCH 074/310] Bump com.couchbase.client:java-client from 3.7.1 to 3.7.2 (#1136) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3606db402..31bfbd309 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.1' + implementation 'com.couchbase.client:java-client:3.7.2' runtimeOnly 'org.postgresql:postgresql:42.7.3' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.16.1' // I/O functionalities From baefcb788dc57987e153410fd20fa9f6df6f9839 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:15:22 +0000 Subject: [PATCH 075/310] Bump org.apache.commons:commons-compress from 1.26.2 to 1.27.0 (#1134) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 31bfbd309..2893406d4 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,7 @@ dependencies { implementation 'commons-io:commons-io:2.16.1' // I/O functionalities implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress - implementation 'org.apache.commons:commons-compress:1.26.2' // I/O functionalities + implementation 'org.apache.commons:commons-compress:1.27.0' // I/O functionalities } tasks.withType(JavaCompile) { From d064b53928119403802f1beee40c1148583452a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:22:26 +0000 Subject: [PATCH 076/310] Bump com.github.spotbugs from 6.0.19 to 6.0.20 (#1133) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2893406d4..2b90f807f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0' //code format - id 'com.github.spotbugs' version '6.0.19' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.20' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From 7505e8b671c429ca392f5c42f341b439452fc340 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 11:36:54 +0000 Subject: [PATCH 077/310] Bump myst-parser from 3.0.1 to 4.0.0 in /docs/readthedocs (#1129) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index eb266a2b3..d3f0f997c 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -2,5 +2,5 @@ commonmark==0.9.1 recommonmark==0.7.1 Sphinx==7.4.7 sphinx-rtd-theme==2.0.0 -myst-parser==3.0.1 +myst-parser==4.0.0 markdown-it-py==3.0.0 From 15158767423cd0b073f7092409eb996f1ce0861a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 08:07:17 +0000 Subject: [PATCH 078/310] Bump org.junit.jupiter:junit-jupiter from 5.10.3 to 5.11.0 (#1138) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2b90f807f..9fd15dd45 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.14.18' // Mocks of classes From 852fa78b9474a336a619bedb476990965dbbe0b6 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 15 Aug 2024 17:30:44 +0200 Subject: [PATCH 079/310] fix DomesticHotWaterStorage scaling --- .../ie3/datamodel/io/source/ThermalSource.java | 3 +-- .../thermal/DomesticHotWaterStorageInput.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 6f8a71dd8..07f56a611 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -49,8 +49,7 @@ public ThermalSource(TypeSource typeSource, DataSource dataSource) { this.typeSource = typeSource; this.thermalBusInputFactory = new ThermalBusInputFactory(); - this.cylindricalStorageInputFactory = - new CylindricalStorageInputFactory(); + this.cylindricalStorageInputFactory = new CylindricalStorageInputFactory(); this.domesticHotWaterStorageInputFactory = new DomesticHotWaterStorageInputFactory(); this.thermalHouseInputFactory = new ThermalHouseInputFactory(); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index b7ecc0bb7..29d880770 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -109,7 +109,8 @@ public String toString() { + '}'; } - public class DomesticHotWaterStorageInputCopyBuilder extends CylindricalStorageInputCopyBuilder { + public static class DomesticHotWaterStorageInputCopyBuilder + extends CylindricalStorageInputCopyBuilder { public DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); @@ -146,8 +147,8 @@ public DomesticHotWaterStorageInputCopyBuilder pThermalMax( @Override public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { - storageVolumeLvl(getStorageVolumeLvl().multiply(factor)); - pThermalMax(getpThermalMax().multiply(factor)); + storageVolumeLvl(this.storageVolumeLvl.multiply(factor)); + pThermalMax(this.pThermalMax.multiply(factor)); return this; } @@ -159,11 +160,11 @@ public DomesticHotWaterStorageInput build() { getOperator(), getOperationTime(), getThermalBus(), - getStorageVolumeLvl(), - getInletTemp(), - getReturnTemp(), - getC(), - getpThermalMax()); + this.storageVolumeLvl, + this.inletTemp, + this.returnTemp, + this.c, + this.pThermalMax); } @Override From 0712b502b4d39687b647dbba635fa602f20dee45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 10:06:02 +0000 Subject: [PATCH 080/310] Bump net.bytebuddy:byte-buddy from 1.14.18 to 1.14.19 (#1140) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9fd15dd45..6555d0b31 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.14.18' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.14.19' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From 6648beded2bb1f006d61edbbd1ecf1a3dfd6f660 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 06:07:11 +0000 Subject: [PATCH 081/310] Bump org.apache.commons:commons-compress from 1.27.0 to 1.27.1 (#1141) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6555d0b31..c3105ef23 100644 --- a/build.gradle +++ b/build.gradle @@ -95,7 +95,7 @@ dependencies { implementation 'commons-io:commons-io:2.16.1' // I/O functionalities implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress - implementation 'org.apache.commons:commons-compress:1.27.0' // I/O functionalities + implementation 'org.apache.commons:commons-compress:1.27.1' // I/O functionalities } tasks.withType(JavaCompile) { From 03299c2ce22fbed93e24096434adc9d249872b3f Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Wed, 21 Aug 2024 15:00:29 +0200 Subject: [PATCH 082/310] Test commit to check if solution works --- docs/readthedocs/io/csvfiles.md | 113 +++++++++++++++----------------- 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 54a6b7369..4729fc7aa 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -24,61 +24,59 @@ You may extend / alter the naming with pre- or suffix by calling `new EntityPers ### Input -```{eval-rst} -.. list-table:: - :widths: auto +```{list-table} :header-rows: 1 + :widths: auto - * - Model - - File Name - * - operator - - *prefix_* operator_input *_suffix* - * - node - - *prefix_* node_input *_suffix* - * - line - - | *prefix_* line_input *_suffix* - | *prefix_* line_type_input *_suffix* - * - switch - - *prefix_* switch_input *_suffix* - * - two winding transformer - - | *prefix_* transformer2w_input *_suffix* - | *prefix_* transformer2w_type_input *_suffix* - * - three winding transformer - - | *prefix_* transformer3w_input *_suffix* - | *prefix_* transformer3w_type_input *_suffix* - * - measurement unit - - *prefix_* measurement_unit_input *_suffix* - * - biomass plant - - | *prefix_* bm_input *_suffix* - | *prefix_* bm_type_input *_suffix* - * - combined heat and power plant - - | *prefix_* chp_input *_suffix* - | *prefix_* chp_type_input *_suffix* - * - electric vehicle - - | *prefix_* ev_input *_suffix* - | *prefix_* ev_type_input *_suffix* - * - electric vehicle charging station - - *prefix_* evcs_input *_suffix* - * - fixed feed in facility - - *prefix_* fixed_feed_in_input *_suffix* - * - heat pump - - | *prefix_* hp_input *_suffix* - | *prefix_* hp_type_input *_suffix* - * - load - - *prefix_* load_input *_suffix* - * - photovoltaic power plant - - *prefix_* pv_input *_suffix* - * - electrical energy storage - - | *prefix_* storage_input *_suffix* - | *prefix_* storage_type_input *_suffix* - * - wind energy converter - - | *prefix_* wec_input *_suffix* - | *prefix_* wec_type_input *_suffix* - * - schematic node graphic - - *prefix_* node_graphic_input *_suffix* - * - schematic line graphic - - *prefix_* line_graphic_input *_suffix* - +* - Model + - File Name +* - operator + - *prefix_* operator_input *_suffix* +* - node + - *prefix_* node_input *_suffix* +* - line + - *prefix_* line_input *_suffix* + *prefix_* line_type_input *_suffix* +* - switch + - *prefix_* switch_input *_suffix* +* - two winding transformer + - *prefix_* transformer2w_input *_suffix* + *prefix_* transformer2w_type_input *_suffix* +* - three winding transformer + - *prefix_* transformer3w_input *_suffix* + *prefix_* transformer3w_type_input *_suffix* +* - measurement unit + - *prefix_* measurement_unit_input *_suffix* +* - biomass plant + - *prefix_* bm_input *_suffix* + *prefix_* bm_type_input *_suffix* +* - combined heat and power plant + - *prefix_* chp_input *_suffix* + *prefix_* chp_type_input *_suffix* +* - electric vehicle + - *prefix_* ev_input *_suffix* + *prefix_* ev_type_input *_suffix* +* - electric vehicle charging station + - *prefix_* evcs_input *_suffix* +* - fixed feed in facility + - *prefix_* fixed_feed_in_input *_suffix* +* - heat pump + - *prefix_* hp_input *_suffix* + *prefix_* hp_type_input *_suffix* +* - load + - *prefix_* load_input *_suffix* +* - photovoltaic power plant + - *prefix_* pv_input *_suffix* +* - electrical energy storage + - *prefix_* storage_input *_suffix* + *prefix_* storage_type_input *_suffix* +* - wind energy converter + - *prefix_* wec_input *_suffix* + *prefix_* wec_type_input *_suffix* +* - schematic node graphic + - *prefix_* node_graphic_input *_suffix* +* - schematic line graphic + - *prefix_* line_graphic_input *_suffix* ``` ### Id Coordinate @@ -89,8 +87,7 @@ Csv id coordinate sources can have two different ways to represent their coordin ### Time Series -```{eval-rst} -.. list-table:: +```{list-table} :widths: 50 50 :header-rows: 1 @@ -123,8 +120,7 @@ You can also use the Method `java.util.UUID#randomUUID` to create a UUID. This is the UUID from the example above `2fcb3e53-b94a-4b96-bea4-c469e499f1a1`. The following keys are supported until now: -```{eval-rst} -.. list-table:: +```{list-table} :widths: auto :header-rows: 1 @@ -156,8 +152,7 @@ The following keys are supported until now: ### Results -```{eval-rst} -.. list-table:: +```{list-table} :widths: auto :header-rows: 1 From 9cef935c19e11ca60a1448c3aa7e073af54066f6 Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Wed, 21 Aug 2024 16:05:19 +0200 Subject: [PATCH 083/310] Converted eval-rst to myst syntax --- .../input/additionaldata/idcoordinatesource.md | 3 +-- .../models/input/additionaldata/timeseries.md | 3 +-- docs/readthedocs/models/input/em.md | 3 +-- docs/readthedocs/models/input/grid/gridcontainer.md | 3 +-- docs/readthedocs/models/input/grid/line.md | 12 ++++-------- docs/readthedocs/models/input/grid/linegraphic.md | 3 +-- .../readthedocs/models/input/grid/measurementunit.md | 3 +-- docs/readthedocs/models/input/grid/node.md | 3 +-- docs/readthedocs/models/input/grid/nodegraphic.md | 3 +-- docs/readthedocs/models/input/grid/switch.md | 3 +-- docs/readthedocs/models/input/grid/transformer2w.md | 9 +++------ docs/readthedocs/models/input/grid/transformer3w.md | 6 ++---- docs/readthedocs/models/input/operator.md | 3 +-- docs/readthedocs/models/input/participant/bm.md | 6 ++---- docs/readthedocs/models/input/participant/chp.md | 6 ++---- docs/readthedocs/models/input/participant/ev.md | 6 ++---- docs/readthedocs/models/input/participant/evcs.md | 12 ++++-------- .../models/input/participant/fixedfeedin.md | 3 +-- docs/readthedocs/models/input/participant/hp.md | 6 ++---- docs/readthedocs/models/input/participant/load.md | 3 +-- docs/readthedocs/models/input/participant/pv.md | 3 +-- docs/readthedocs/models/input/participant/storage.md | 6 ++---- docs/readthedocs/models/input/participant/wec.md | 6 ++---- .../models/input/thermal/cylindricalstorage.md | 3 +-- docs/readthedocs/models/input/thermal/thermalbus.md | 3 +-- .../readthedocs/models/input/thermal/thermalhouse.md | 3 +-- docs/readthedocs/models/result/grid/congestion.md | 3 +-- docs/readthedocs/models/result/grid/connector.md | 3 +-- docs/readthedocs/models/result/grid/line.md | 3 +-- docs/readthedocs/models/result/grid/node.md | 3 +-- docs/readthedocs/models/result/grid/switch.md | 3 +-- docs/readthedocs/models/result/grid/transformer.md | 3 +-- docs/readthedocs/models/result/grid/transformer2w.md | 3 +-- docs/readthedocs/models/result/grid/transformer3w.md | 3 +-- docs/readthedocs/models/result/participant/bm.md | 3 +-- docs/readthedocs/models/result/participant/chp.md | 3 +-- .../models/result/participant/cylindricalstorage.md | 3 +-- docs/readthedocs/models/result/participant/em.md | 3 +-- docs/readthedocs/models/result/participant/ev.md | 3 +-- docs/readthedocs/models/result/participant/evcs.md | 3 +-- .../models/result/participant/fixedfeedin.md | 3 +-- .../models/result/participant/flexoption.md | 3 +-- docs/readthedocs/models/result/participant/hp.md | 3 +-- docs/readthedocs/models/result/participant/load.md | 3 +-- docs/readthedocs/models/result/participant/pv.md | 3 +-- .../readthedocs/models/result/participant/storage.md | 3 +-- .../models/result/participant/systemparticipant.md | 3 +-- .../models/result/participant/thermalhouse.md | 3 +-- .../models/result/participant/thermalsink.md | 3 +-- .../models/result/participant/thermalstorage.md | 3 +-- .../models/result/participant/thermalunit.md | 3 +-- docs/readthedocs/models/result/participant/wec.md | 3 +-- 52 files changed, 67 insertions(+), 134 deletions(-) diff --git a/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md b/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md index 4196d0736..8a93d608c 100644 --- a/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md +++ b/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md @@ -7,8 +7,7 @@ coordinates. ## Information -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/additionaldata/timeseries.md b/docs/readthedocs/models/input/additionaldata/timeseries.md index d486f78ca..84546f689 100644 --- a/docs/readthedocs/models/input/additionaldata/timeseries.md +++ b/docs/readthedocs/models/input/additionaldata/timeseries.md @@ -17,8 +17,7 @@ In addition to actual data, a mapping function has to be known. To be as flexible, as possible, the actual content of the time series is given as children of the `Value` class. The following different values are available: -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index 5f9c698c6..d08b5a276 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -7,8 +7,7 @@ Participants are connected to an EM each via their `em` field. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/gridcontainer.md b/docs/readthedocs/models/input/grid/gridcontainer.md index 85cad16a9..c35541a87 100644 --- a/docs/readthedocs/models/input/grid/gridcontainer.md +++ b/docs/readthedocs/models/input/grid/gridcontainer.md @@ -37,8 +37,7 @@ A synoptic overview of both classes' attributes is given here: ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/line.md b/docs/readthedocs/models/input/grid/line.md index 1f0ebebee..87f649e59 100644 --- a/docs/readthedocs/models/input/grid/line.md +++ b/docs/readthedocs/models/input/grid/line.md @@ -6,8 +6,7 @@ Representation of an AC line. ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -53,8 +52,7 @@ A list with some standard line types can be found here: [Standard Line Types](#s ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -126,8 +124,7 @@ The lines which source is ``simBench`` are from [here](https://simbench.de/en/do Some standard overhead lines. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 11 11 11 11 11 11 11 11 11 :header-rows: 1 @@ -309,8 +306,7 @@ Some standard overhead lines. Some standard cables. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 11 11 11 11 11 11 11 11 11 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/linegraphic.md b/docs/readthedocs/models/input/grid/linegraphic.md index f23fa1b16..79f307684 100644 --- a/docs/readthedocs/models/input/grid/linegraphic.md +++ b/docs/readthedocs/models/input/grid/linegraphic.md @@ -6,8 +6,7 @@ Schematic drawing information for a line model. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/measurementunit.md b/docs/readthedocs/models/input/grid/measurementunit.md index aa5a58195..a2c972fb0 100644 --- a/docs/readthedocs/models/input/grid/measurementunit.md +++ b/docs/readthedocs/models/input/grid/measurementunit.md @@ -8,8 +8,7 @@ The measured information are indicated by boolean fields. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/node.md b/docs/readthedocs/models/input/grid/node.md index d409c3141..e4d78993b 100644 --- a/docs/readthedocs/models/input/grid/node.md +++ b/docs/readthedocs/models/input/grid/node.md @@ -6,8 +6,7 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/nodegraphic.md b/docs/readthedocs/models/input/grid/nodegraphic.md index 07a55a948..320b3583b 100644 --- a/docs/readthedocs/models/input/grid/nodegraphic.md +++ b/docs/readthedocs/models/input/grid/nodegraphic.md @@ -6,8 +6,7 @@ Schematic drawing information for a node model. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/switch.md b/docs/readthedocs/models/input/grid/switch.md index 6a4ae4db1..5f8b7d245 100644 --- a/docs/readthedocs/models/input/grid/switch.md +++ b/docs/readthedocs/models/input/grid/switch.md @@ -6,8 +6,7 @@ Model of an ideal switch connecting two node models of the same voltage level ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/transformer2w.md b/docs/readthedocs/models/input/grid/transformer2w.md index 32be9b754..26c6bb8f5 100644 --- a/docs/readthedocs/models/input/grid/transformer2w.md +++ b/docs/readthedocs/models/input/grid/transformer2w.md @@ -10,8 +10,7 @@ It is assumed, that node A is the node with higher voltage. All impedances and admittances are given with respect to the higher voltage side. As obvious, the parameter can be used in T- as in 𝜋-equivalent circuit representations. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -82,8 +81,7 @@ A list with some standard transformer types can be found here: [Standard Two Win ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -142,8 +140,7 @@ below can be found [here](https://github.com/ie3-institute/PowerSystemDataModel/ file can be used directly for any simulation with ``simona``. The transformers which source is ``simBench`` are from [here](https://simbench.de/en/download/datasets/). -```{eval-rst} -.. list-table:: +```{list-table} :widths: 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/transformer3w.md b/docs/readthedocs/models/input/grid/transformer3w.md index ec2c21b3f..caecfefda 100644 --- a/docs/readthedocs/models/input/grid/transformer3w.md +++ b/docs/readthedocs/models/input/grid/transformer3w.md @@ -22,8 +22,7 @@ name: Equivalent circuit diagram of a three winding transformer All impedances and admittances are given with respect to the higher voltage side. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -120,8 +119,7 @@ All impedances and admittances are given with respect to the higher voltage side ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/operator.md b/docs/readthedocs/models/input/operator.md index 30d29374c..7159485c3 100644 --- a/docs/readthedocs/models/input/operator.md +++ b/docs/readthedocs/models/input/operator.md @@ -7,8 +7,7 @@ having control over one or more physical entitites. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index 913c0f5a5..d2083c278 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -8,8 +8,7 @@ Model of a biomass power plant. ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -55,8 +54,7 @@ Model of a biomass power plant. ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index b9012a02a..4b2892389 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -8,8 +8,7 @@ Combined heat and power plant. ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -63,8 +62,7 @@ Combined heat and power plant. ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index aeee017ab..ccb3dac83 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -8,8 +8,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -59,8 +58,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index f4b836ebe..45752b156 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -9,8 +9,7 @@ station and has some limitations outlined below. ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -78,8 +77,7 @@ available standard types and how to use custom types. The actual model definition for charging point types looks as follows: -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -116,8 +114,7 @@ To simplify the application of electric vehicle charging stations, some common s They can either by used code wise or directly from database or file input by referencing their id or one of their synonymous ids. All standard types can be found in {code}`edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils`. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 25 25 25 25 :header-rows: 1 @@ -220,8 +217,7 @@ be in kVA! Evcs location types describe the type of charging location of a charging station. Parsing of these types is case-insensitive and underscores and minuses are ignored, that means "charginghubtown" is parsed as type {code}`CHARGING_HUB_TOWN`. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index a6348a7ed..dd4ccf14e 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -7,8 +7,7 @@ model can be derived. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index 08a092992..571b1ceb2 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -8,8 +8,7 @@ Model of a heat pump. ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -51,8 +50,7 @@ Model of a heat pump. ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index a153e8392..3706760fd 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -6,8 +6,7 @@ Model of (mainly) domestic loads. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 3e0946fd6..053db1d59 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -4,8 +4,7 @@ Detailed model of a photovoltaic power plant. -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index 9c3df5d93..a208551ba 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -8,8 +8,7 @@ Model of an ideal electrical battery energy storage. ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -64,8 +63,7 @@ Model of an ideal electrical battery energy storage. ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index e0330669e..5dd733f85 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -8,8 +8,7 @@ Model of a wind energy converter. ### Type Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 @@ -63,8 +62,7 @@ Model of a wind energy converter. ### Entity Model -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 98358479a..42bb55f35 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -6,8 +6,7 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/thermal/thermalbus.md b/docs/readthedocs/models/input/thermal/thermalbus.md index acffc8379..097566b02 100644 --- a/docs/readthedocs/models/input/thermal/thermalbus.md +++ b/docs/readthedocs/models/input/thermal/thermalbus.md @@ -7,8 +7,7 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index d06a1f59c..74e94a21f 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -7,8 +7,7 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index f55886613..d0865d3de 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -6,8 +6,7 @@ Representation of a congestion result for a given subnet. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/connector.md b/docs/readthedocs/models/result/grid/connector.md index 19cd58ec3..c1e3b90b7 100644 --- a/docs/readthedocs/models/result/grid/connector.md +++ b/docs/readthedocs/models/result/grid/connector.md @@ -6,8 +6,7 @@ Representation of all kinds of connectors. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/line.md b/docs/readthedocs/models/result/grid/line.md index e88f323ab..0e02f8704 100644 --- a/docs/readthedocs/models/result/grid/line.md +++ b/docs/readthedocs/models/result/grid/line.md @@ -6,8 +6,7 @@ Representation of an AC line. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/node.md b/docs/readthedocs/models/result/grid/node.md index b65e739d8..353185788 100644 --- a/docs/readthedocs/models/result/grid/node.md +++ b/docs/readthedocs/models/result/grid/node.md @@ -6,8 +6,7 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/switch.md b/docs/readthedocs/models/result/grid/switch.md index ae79fb2f0..5ba536377 100644 --- a/docs/readthedocs/models/result/grid/switch.md +++ b/docs/readthedocs/models/result/grid/switch.md @@ -6,8 +6,7 @@ Representation of electrical switches. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/transformer.md b/docs/readthedocs/models/result/grid/transformer.md index 8f3784a6a..063072523 100644 --- a/docs/readthedocs/models/result/grid/transformer.md +++ b/docs/readthedocs/models/result/grid/transformer.md @@ -6,8 +6,7 @@ Representation of transformers. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/transformer2w.md b/docs/readthedocs/models/result/grid/transformer2w.md index c19550d50..31de95f88 100644 --- a/docs/readthedocs/models/result/grid/transformer2w.md +++ b/docs/readthedocs/models/result/grid/transformer2w.md @@ -6,8 +6,7 @@ Representation of two winding transformers. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/grid/transformer3w.md b/docs/readthedocs/models/result/grid/transformer3w.md index 61b27a789..327628ba4 100644 --- a/docs/readthedocs/models/result/grid/transformer3w.md +++ b/docs/readthedocs/models/result/grid/transformer3w.md @@ -6,8 +6,7 @@ Representation of three winding transformers. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/bm.md b/docs/readthedocs/models/result/participant/bm.md index b36165809..38f8805e8 100644 --- a/docs/readthedocs/models/result/participant/bm.md +++ b/docs/readthedocs/models/result/participant/bm.md @@ -6,8 +6,7 @@ Result of a biomass power plant. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/chp.md b/docs/readthedocs/models/result/participant/chp.md index 410ff9e55..271cf309c 100644 --- a/docs/readthedocs/models/result/participant/chp.md +++ b/docs/readthedocs/models/result/participant/chp.md @@ -6,8 +6,7 @@ Result of a combined heat and power plant. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/cylindricalstorage.md b/docs/readthedocs/models/result/participant/cylindricalstorage.md index 84784f6a8..2db30bbb4 100644 --- a/docs/readthedocs/models/result/participant/cylindricalstorage.md +++ b/docs/readthedocs/models/result/participant/cylindricalstorage.md @@ -6,8 +6,7 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/em.md b/docs/readthedocs/models/result/participant/em.md index 58bf773ba..e52a73023 100644 --- a/docs/readthedocs/models/result/participant/em.md +++ b/docs/readthedocs/models/result/participant/em.md @@ -6,8 +6,7 @@ Result of an energy management entity. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/ev.md b/docs/readthedocs/models/result/participant/ev.md index d8cce0d25..1db80239b 100644 --- a/docs/readthedocs/models/result/participant/ev.md +++ b/docs/readthedocs/models/result/participant/ev.md @@ -6,8 +6,7 @@ Result of an electric vehicle, that is occasionally connected to the grid via an ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/evcs.md b/docs/readthedocs/models/result/participant/evcs.md index a42c1bd5f..dedb4aa29 100644 --- a/docs/readthedocs/models/result/participant/evcs.md +++ b/docs/readthedocs/models/result/participant/evcs.md @@ -6,8 +6,7 @@ This model is currently only a dummy implementation of an electric vehicle charg ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/fixedfeedin.md b/docs/readthedocs/models/result/participant/fixedfeedin.md index 4dc0ab47f..15e8a30cb 100644 --- a/docs/readthedocs/models/result/participant/fixedfeedin.md +++ b/docs/readthedocs/models/result/participant/fixedfeedin.md @@ -7,8 +7,7 @@ model can be derived. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/flexoption.md b/docs/readthedocs/models/result/participant/flexoption.md index 4c08755b6..2ddd701b9 100644 --- a/docs/readthedocs/models/result/participant/flexoption.md +++ b/docs/readthedocs/models/result/participant/flexoption.md @@ -6,8 +6,7 @@ Result of a flexibility option. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/hp.md b/docs/readthedocs/models/result/participant/hp.md index 233a0b64f..6ed5b4b73 100644 --- a/docs/readthedocs/models/result/participant/hp.md +++ b/docs/readthedocs/models/result/participant/hp.md @@ -6,8 +6,7 @@ Result of a heat pump. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/load.md b/docs/readthedocs/models/result/participant/load.md index 067795c17..3058aed01 100644 --- a/docs/readthedocs/models/result/participant/load.md +++ b/docs/readthedocs/models/result/participant/load.md @@ -6,8 +6,7 @@ Result of (mainly) domestic loads. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/pv.md b/docs/readthedocs/models/result/participant/pv.md index d1378864c..544cc50a4 100644 --- a/docs/readthedocs/models/result/participant/pv.md +++ b/docs/readthedocs/models/result/participant/pv.md @@ -6,8 +6,7 @@ Result of a photovoltaic power plant. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/storage.md b/docs/readthedocs/models/result/participant/storage.md index 5c5767dcd..a5f9beb6b 100644 --- a/docs/readthedocs/models/result/participant/storage.md +++ b/docs/readthedocs/models/result/participant/storage.md @@ -6,8 +6,7 @@ Result of an electrochemical storage ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/systemparticipant.md b/docs/readthedocs/models/result/participant/systemparticipant.md index 6b44abe6e..8b55b74b9 100644 --- a/docs/readthedocs/models/result/participant/systemparticipant.md +++ b/docs/readthedocs/models/result/participant/systemparticipant.md @@ -6,8 +6,7 @@ Groups together all system participants such as PV, Storage etc. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/thermalhouse.md b/docs/readthedocs/models/result/participant/thermalhouse.md index 942c7e39b..8836624d8 100644 --- a/docs/readthedocs/models/result/participant/thermalhouse.md +++ b/docs/readthedocs/models/result/participant/thermalhouse.md @@ -7,8 +7,7 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/thermalsink.md b/docs/readthedocs/models/result/participant/thermalsink.md index 92d19b9b8..db5977dfd 100644 --- a/docs/readthedocs/models/result/participant/thermalsink.md +++ b/docs/readthedocs/models/result/participant/thermalsink.md @@ -6,8 +6,7 @@ Result of a thermal sink. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/thermalstorage.md b/docs/readthedocs/models/result/participant/thermalstorage.md index abbad4e92..945ac99c8 100644 --- a/docs/readthedocs/models/result/participant/thermalstorage.md +++ b/docs/readthedocs/models/result/participant/thermalstorage.md @@ -6,8 +6,7 @@ Result of a thermal storage. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/thermalunit.md b/docs/readthedocs/models/result/participant/thermalunit.md index bedaa368d..a51f05bb9 100644 --- a/docs/readthedocs/models/result/participant/thermalunit.md +++ b/docs/readthedocs/models/result/participant/thermalunit.md @@ -6,8 +6,7 @@ Result of a thermal unit. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/result/participant/wec.md b/docs/readthedocs/models/result/participant/wec.md index b4e8e44ce..245b163c0 100644 --- a/docs/readthedocs/models/result/participant/wec.md +++ b/docs/readthedocs/models/result/participant/wec.md @@ -6,8 +6,7 @@ Result of a wind turbine. ## Attributes, Units and Remarks -```{eval-rst} -.. list-table:: +```{list-table} :widths: 33 33 33 :header-rows: 1 From 8fd14916156b45f6201408e5f6b5fb876c321fbc Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:22:51 +0200 Subject: [PATCH 084/310] CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 288162525..447c6adf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Storage minimum level parameter removed from cylindrical thermal storage [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1123) +- Converted eval-rst to myst syntax in ReadTheDocs [#1137](https://github.com/ie3-institute/PowerSystemDataModel/issues/1137) ## [5.1.0] - 2024-06-24 From e2bbf9a416d49784726cffa62c7c409222713244 Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:27:56 +0200 Subject: [PATCH 085/310] Fix in em.md --- docs/readthedocs/models/input/em.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index d08b5a276..f1a2e2752 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -18,7 +18,7 @@ Participants are connected to an EM each via their `em` field. * - uuid - -- - - + - -- * - id - -- @@ -26,7 +26,7 @@ Participants are connected to an EM each via their `em` field. * - operator - -- - - + - -- * - operationTime - -- From fc0a54e678c1567f5b930522609a35cf0bad6143 Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:31:02 +0200 Subject: [PATCH 086/310] Fix in em.md --- docs/readthedocs/models/input/em.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index f1a2e2752..157da803b 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -38,8 +38,8 @@ Participants are connected to an EM each via their `em` field. * - parentEm - -- - - | Reference to a superior Energy Management Unit that is controlling this EM. - | Field can be empty or missing, if this EM itself is not controlled. + - Reference to a superior Energy Management Unit that is controlling this EM. + Field can be empty or missing, if this EM itself is not controlled. ``` From 5d95809fa7bd130c680f04ad89b44a7e4adc3030 Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:33:48 +0200 Subject: [PATCH 087/310] Fix in em.md --- docs/readthedocs/models/input/em.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index 157da803b..5b86288e4 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -8,7 +8,6 @@ Participants are connected to an EM each via their `em` field. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 :header-rows: 1 From e3c01b61f101383ffe21bcf2bd18d2ad7d7f04b5 Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:36:56 +0200 Subject: [PATCH 088/310] Fix in em.md --- docs/readthedocs/models/input/em.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index 5b86288e4..26d6e69e9 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -8,6 +8,7 @@ Participants are connected to an EM each via their `em` field. ## Attributes, Units and Remarks ```{list-table} + :widths: auto :header-rows: 1 @@ -16,27 +17,27 @@ Participants are connected to an EM each via their `em` field. - Remarks * - uuid - - -- - - -- + - + - * - id - - -- + - - Human readable identifier * - operator - - -- - - -- + - + - * - operationTime - - -- + - - Timely restriction of operation * - controlStrategy - - -- + - - String representation (e.g. name) of a control strategy * - parentEm - - -- + - - Reference to a superior Energy Management Unit that is controlling this EM. Field can be empty or missing, if this EM itself is not controlled. From 25919d257e496552a21ab9781cec1cd24f23045f Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:46:48 +0200 Subject: [PATCH 089/310] Changed widths to auto and fixed tables --- docs/readthedocs/io/csvfiles.md | 2 +- .../models/input/grid/gridcontainer.md | 2 +- docs/readthedocs/models/input/grid/line.md | 4 +-- .../models/input/grid/linegraphic.md | 10 +++--- .../models/input/grid/measurementunit.md | 20 +++++------ docs/readthedocs/models/input/grid/node.md | 18 +++++----- .../models/input/grid/nodegraphic.md | 12 +++---- docs/readthedocs/models/input/grid/switch.md | 16 ++++----- .../models/input/grid/transformer2w.md | 4 +-- .../models/input/grid/transformer3w.md | 26 +++++++------- docs/readthedocs/models/input/operator.md | 6 ++-- .../models/input/participant/bm.md | 30 ++++++++-------- .../models/input/participant/chp.md | 32 ++++++++--------- .../models/input/participant/ev.md | 26 +++++++------- .../models/input/participant/evcs.md | 34 +++++++++---------- .../models/input/participant/fixedfeedin.md | 18 +++++----- .../models/input/participant/hp.md | 28 +++++++-------- .../models/input/participant/load.md | 22 ++++++------ .../models/input/participant/pv.md | 26 +++++++------- .../models/input/participant/storage.md | 28 +++++++-------- .../models/input/participant/wec.md | 30 ++++++++-------- .../input/thermal/cylindricalstorage.md | 12 +++---- .../models/input/thermal/thermalbus.md | 12 +++---- .../models/input/thermal/thermalhouse.md | 12 +++---- .../models/result/grid/congestion.md | 10 +++--- .../models/result/grid/connector.md | 4 +-- docs/readthedocs/models/result/grid/line.md | 4 +-- docs/readthedocs/models/result/grid/node.md | 4 +-- docs/readthedocs/models/result/grid/switch.md | 4 +-- .../models/result/grid/transformer.md | 6 ++-- .../models/result/grid/transformer2w.md | 6 ++-- .../models/result/grid/transformer3w.md | 6 ++-- .../models/result/participant/bm.md | 6 ++-- .../models/result/participant/chp.md | 6 ++-- .../result/participant/cylindricalstorage.md | 8 ++--- .../models/result/participant/em.md | 6 ++-- .../models/result/participant/ev.md | 6 ++-- .../models/result/participant/evcs.md | 6 ++-- .../models/result/participant/fixedfeedin.md | 6 ++-- .../models/result/participant/flexoption.md | 6 ++-- .../models/result/participant/hp.md | 6 ++-- .../models/result/participant/load.md | 6 ++-- .../models/result/participant/pv.md | 6 ++-- .../models/result/participant/storage.md | 8 ++--- .../result/participant/systemparticipant.md | 6 ++-- .../models/result/participant/thermalhouse.md | 6 ++-- .../models/result/participant/thermalsink.md | 6 ++-- .../result/participant/thermalstorage.md | 6 ++-- .../models/result/participant/thermalunit.md | 6 ++-- .../models/result/participant/wec.md | 6 ++-- 50 files changed, 293 insertions(+), 293 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 4729fc7aa..751c8d06a 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -88,7 +88,7 @@ Csv id coordinate sources can have two different ways to represent their coordin ### Time Series ```{list-table} - :widths: 50 50 + :widths: auto :header-rows: 1 * - Model diff --git a/docs/readthedocs/models/input/grid/gridcontainer.md b/docs/readthedocs/models/input/grid/gridcontainer.md index c35541a87..bde7081fd 100644 --- a/docs/readthedocs/models/input/grid/gridcontainer.md +++ b/docs/readthedocs/models/input/grid/gridcontainer.md @@ -38,7 +38,7 @@ A synoptic overview of both classes' attributes is given here: ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/line.md b/docs/readthedocs/models/input/grid/line.md index 87f649e59..4c170e514 100644 --- a/docs/readthedocs/models/input/grid/line.md +++ b/docs/readthedocs/models/input/grid/line.md @@ -7,7 +7,7 @@ Representation of an AC line. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 * - Attribute @@ -53,7 +53,7 @@ A list with some standard line types can be found here: [Standard Line Types](#s ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/linegraphic.md b/docs/readthedocs/models/input/grid/linegraphic.md index 79f307684..c517caae2 100644 --- a/docs/readthedocs/models/input/grid/linegraphic.md +++ b/docs/readthedocs/models/input/grid/linegraphic.md @@ -7,7 +7,7 @@ Schematic drawing information for a line model. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,20 +16,20 @@ Schematic drawing information for a line model. - Remarks * - uuid - - -- + - - * - graphicLayer - - -- + - - | Human readable identifier of the graphic layer to draw | this element on * - path - - -- + - - Line string of coordinates describing the drawing * - line - - -- + - - Reference to the physical line model ``` diff --git a/docs/readthedocs/models/input/grid/measurementunit.md b/docs/readthedocs/models/input/grid/measurementunit.md index a2c972fb0..db2888d67 100644 --- a/docs/readthedocs/models/input/grid/measurementunit.md +++ b/docs/readthedocs/models/input/grid/measurementunit.md @@ -9,7 +9,7 @@ The measured information are indicated by boolean fields. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,39 +18,39 @@ The measured information are indicated by boolean fields. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - vMag - - -- + - - Voltage magnitude measurements are available * - vAng - - -- + - - Voltage angle measurements are available * - p - - -- + - - Active power measurements are available * - q - - -- + - - Reactive power measurements are available ``` diff --git a/docs/readthedocs/models/input/grid/node.md b/docs/readthedocs/models/input/grid/node.md index e4d78993b..e85f23895 100644 --- a/docs/readthedocs/models/input/grid/node.md +++ b/docs/readthedocs/models/input/grid/node.md @@ -7,7 +7,7 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,19 +16,19 @@ Representation of an electrical node, with no further distinction into bus bar, - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - vTarget @@ -36,20 +36,20 @@ Representation of an electrical node, with no further distinction into bus bar, - Target voltage magnitude to be used by voltage regulation entities * - slack - - -- + - - | Boolean indicator, if this nodes serves as a slack node in power | flow calculation * - geoPosition - - -- + - - Geographical location * - voltLvl - - -- + - - Information of the voltage level (id and nominal voltage) * - subnet - - -- + - - Sub grid number ``` diff --git a/docs/readthedocs/models/input/grid/nodegraphic.md b/docs/readthedocs/models/input/grid/nodegraphic.md index 320b3583b..51eb18850 100644 --- a/docs/readthedocs/models/input/grid/nodegraphic.md +++ b/docs/readthedocs/models/input/grid/nodegraphic.md @@ -7,7 +7,7 @@ Schematic drawing information for a node model. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,24 +16,24 @@ Schematic drawing information for a node model. - Remarks * - uuid - - -- + - - * - graphicLayer - - -- + - - | Human readable identifier of the graphic layer to draw | this element on * - path - - -- + - - Line string of coordinates describing the drawing, e.g. for bus bars * - point - - -- + - - Alternative to line string, only drawing a point coordinate * - node - - -- + - - Reference to the physical node model ``` diff --git a/docs/readthedocs/models/input/grid/switch.md b/docs/readthedocs/models/input/grid/switch.md index 5f8b7d245..07228dc37 100644 --- a/docs/readthedocs/models/input/grid/switch.md +++ b/docs/readthedocs/models/input/grid/switch.md @@ -7,7 +7,7 @@ Model of an ideal switch connecting two node models of the same voltage level ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,31 +16,31 @@ Model of an ideal switch connecting two node models of the same voltage level - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - nodeA - - -- + - - * - nodeB - - -- + - - * - closed - - -- + - - true, if the switch is closed diff --git a/docs/readthedocs/models/input/grid/transformer2w.md b/docs/readthedocs/models/input/grid/transformer2w.md index 26c6bb8f5..e036746bd 100644 --- a/docs/readthedocs/models/input/grid/transformer2w.md +++ b/docs/readthedocs/models/input/grid/transformer2w.md @@ -11,7 +11,7 @@ All impedances and admittances are given with respect to the higher voltage side As obvious, the parameter can be used in T- as in 𝜋-equivalent circuit representations. ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 * - Attribute @@ -82,7 +82,7 @@ A list with some standard transformer types can be found here: [Standard Two Win ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 * - Attribute diff --git a/docs/readthedocs/models/input/grid/transformer3w.md b/docs/readthedocs/models/input/grid/transformer3w.md index caecfefda..c64ba4e85 100644 --- a/docs/readthedocs/models/input/grid/transformer3w.md +++ b/docs/readthedocs/models/input/grid/transformer3w.md @@ -23,7 +23,7 @@ name: Equivalent circuit diagram of a three winding transformer All impedances and admittances are given with respect to the higher voltage side. ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -120,7 +120,7 @@ All impedances and admittances are given with respect to the higher voltage side ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -129,49 +129,49 @@ All impedances and admittances are given with respect to the higher voltage side - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - nodeA - - -- + - - Higher voltage node * - nodeB - - -- + - - Intermediate voltage node * - nodeC - - -- + - - Lowest voltage node * - parallelDevices - - -- + - - | overall amount of parallel transformers to automatically | construct (e.g. parallelDevices = 2 will build a | total of two transformers using the specified parameters) * - type - - -- + - - * - tapPos - - -- + - - Current position of the tap changer * - autoTap - - -- + - - true, if there is a tap regulation apparent and active ``` diff --git a/docs/readthedocs/models/input/operator.md b/docs/readthedocs/models/input/operator.md index 7159485c3..c2becfe3a 100644 --- a/docs/readthedocs/models/input/operator.md +++ b/docs/readthedocs/models/input/operator.md @@ -8,7 +8,7 @@ having control over one or more physical entitites. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -17,11 +17,11 @@ having control over one or more physical entitites. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier ``` diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index d2083c278..5ef1a716a 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -9,7 +9,7 @@ Model of a biomass power plant. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,11 +18,11 @@ Model of a biomass power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -43,7 +43,7 @@ Model of a biomass power plant. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - etaConv @@ -55,7 +55,7 @@ Model of a biomass power plant. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -64,40 +64,40 @@ Model of a biomass power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not * - costControlled - - -- + - - | Whether to adapt output based on the difference | between production costs and fixed feed in tariff or not @@ -106,7 +106,7 @@ Model of a biomass power plant. - Fixed feed in tariff * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index 4b2892389..3a7c143f7 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -9,7 +9,7 @@ Combined heat and power plant. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,11 +18,11 @@ Combined heat and power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -47,7 +47,7 @@ Combined heat and power plant. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - pThermal @@ -63,7 +63,7 @@ Combined heat and power plant. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -72,48 +72,48 @@ Combined heat and power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - thermalBus - - -- + - - Connection point to the thermal system * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - thermalStorage - - -- + - - Reference to thermal storage * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index ccb3dac83..eb663d411 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -9,7 +9,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,11 +18,11 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -51,7 +51,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - power for DC * - cosPhiRated - - -- + - - Rated power factor ``` @@ -59,7 +59,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -68,35 +68,35 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 45752b156..38eb2a4a8 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -10,7 +10,7 @@ station and has some limitations outlined below. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -19,47 +19,47 @@ station and has some limitations outlined below. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - :ref:`Charging point type` (valid for all installed points) * - chargingPoints - - -- + - - no of installed charging points @ the specific station * - cosPhiRated - - -- + - - Rated power factor * - locationType - - -- + - - :ref:`Charging station location types` * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. @@ -78,7 +78,7 @@ available standard types and how to use custom types. The actual model definition for charging point types looks as follows: ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -87,7 +87,7 @@ The actual model definition for charging point types looks as follows: - Remarks * - id - - -- + - - Human readable identifier * - sRated @@ -95,11 +95,11 @@ The actual model definition for charging point types looks as follows: - Rated apparent power * - electricCurrentType - - -- + - - Electric current type * - synonymousIds - - -- + - - Set of alternative human readable identifiers ``` @@ -218,7 +218,7 @@ Evcs location types describe the type of charging location of a charging station and underscores and minuses are ignored, that means "charginghubtown" is parsed as type {code}`CHARGING_HUB_TOWN`. ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index dd4ccf14e..022868c89 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -8,7 +8,7 @@ model can be derived. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -17,27 +17,27 @@ model can be derived. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - sRated @@ -45,11 +45,11 @@ model can be derived. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index 571b1ceb2..f5f5b5258 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -9,7 +9,7 @@ Model of a heat pump. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,11 +18,11 @@ Model of a heat pump. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -39,7 +39,7 @@ Model of a heat pump. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - pThermal @@ -51,7 +51,7 @@ Model of a heat pump. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -60,39 +60,39 @@ Model of a heat pump. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - thermalBus - - -- + - - Connection point to the thermal system * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 3706760fd..72ebc9278 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -7,7 +7,7 @@ Model of (mainly) domestic loads. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,35 +16,35 @@ Model of (mainly) domestic loads. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - loadProfile - - -- + - - :ref:`Load profile` as model behaviour * - dsm - - -- + - - Whether the load is able to follow demand side management signals * - eConsAnnual @@ -56,11 +56,11 @@ Model of (mainly) domestic loads. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 053db1d59..41ed84638 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -5,7 +5,7 @@ Detailed model of a photovoltaic power plant. ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -14,31 +14,31 @@ Detailed model of a photovoltaic power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - albedo - - -- + - - `Albedo `_ of the plant's surrounding * - azimuth @@ -55,15 +55,15 @@ Detailed model of a photovoltaic power plant. - Tilted inclination from horizontal [0°, 90°] * - kG - - -- + - - Generator correction factor merging technical influences * - kT - - -- + - - Temperature correction factor merging thermal influences * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not @@ -72,11 +72,11 @@ Detailed model of a photovoltaic power plant. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index a208551ba..84fc2f735 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -9,7 +9,7 @@ Model of an ideal electrical battery energy storage. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,11 +18,11 @@ Model of an ideal electrical battery energy storage. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -43,7 +43,7 @@ Model of an ideal electrical battery energy storage. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - pMax @@ -64,7 +64,7 @@ Model of an ideal electrical battery energy storage. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -73,40 +73,40 @@ Model of an ideal electrical battery energy storage. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - behaviour - - -- + - - | Foreseen operation strategy of the storage. | Eligible input: *"market"*, *"grid"*, *"self"* * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index 5dd733f85..0672d0e7c 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -9,7 +9,7 @@ Model of a wind energy converter. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -18,11 +18,11 @@ Model of a wind energy converter. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -39,11 +39,11 @@ Model of a wind energy converter. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - cpCharacteristic - - -- + - - Wind velocity dependent :ref:`Betz factors`. * - etaConv @@ -63,7 +63,7 @@ Model of a wind energy converter. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -72,40 +72,40 @@ Model of a wind energy converter. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 42bb55f35..da143003a 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -7,7 +7,7 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,23 +16,23 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - thermalBus - - -- + - - Connection point to the thermal system * - storageVolumeLvl diff --git a/docs/readthedocs/models/input/thermal/thermalbus.md b/docs/readthedocs/models/input/thermal/thermalbus.md index 097566b02..6e5bfd5c6 100644 --- a/docs/readthedocs/models/input/thermal/thermalbus.md +++ b/docs/readthedocs/models/input/thermal/thermalbus.md @@ -8,7 +8,7 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -17,23 +17,23 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - bus - - -- + - - Connection point to the thermal system ``` diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index 74e94a21f..07ed31309 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -8,7 +8,7 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -17,23 +17,23 @@ This reflects a simple shoe box with transmission losses - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - bus - - -- + - - Thermal bus, the model is connected to * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - ethLosses diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index d0865d3de..606f79068 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -7,7 +7,7 @@ Representation of a congestion result for a given subnet. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of a congestion result for a given subnet. - date and time for the produced result * - subgrid - - -- + - - Sub grid number * - vMin @@ -32,15 +32,15 @@ Representation of a congestion result for a given subnet. - maximal voltage of the subnet * - voltage - - -- + - - Boolean indicator, if a voltage congestion occurred * - line - - -- + - - Boolean indicator, if a line congestion occurred * - transformer - - -- + - - Boolean indicator, if a transformer congestion occurred ``` diff --git a/docs/readthedocs/models/result/grid/connector.md b/docs/readthedocs/models/result/grid/connector.md index c1e3b90b7..0898ecd60 100644 --- a/docs/readthedocs/models/result/grid/connector.md +++ b/docs/readthedocs/models/result/grid/connector.md @@ -7,7 +7,7 @@ Representation of all kinds of connectors. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of all kinds of connectors. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag diff --git a/docs/readthedocs/models/result/grid/line.md b/docs/readthedocs/models/result/grid/line.md index 0e02f8704..c92f8352d 100644 --- a/docs/readthedocs/models/result/grid/line.md +++ b/docs/readthedocs/models/result/grid/line.md @@ -7,7 +7,7 @@ Representation of an AC line. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of an AC line. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag diff --git a/docs/readthedocs/models/result/grid/node.md b/docs/readthedocs/models/result/grid/node.md index 353185788..c28f16e7a 100644 --- a/docs/readthedocs/models/result/grid/node.md +++ b/docs/readthedocs/models/result/grid/node.md @@ -7,7 +7,7 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of an electrical node, with no further distinction into bus bar, - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - vMag diff --git a/docs/readthedocs/models/result/grid/switch.md b/docs/readthedocs/models/result/grid/switch.md index 5ba536377..e2a59a105 100644 --- a/docs/readthedocs/models/result/grid/switch.md +++ b/docs/readthedocs/models/result/grid/switch.md @@ -7,7 +7,7 @@ Representation of electrical switches. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of electrical switches. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - closed diff --git a/docs/readthedocs/models/result/grid/transformer.md b/docs/readthedocs/models/result/grid/transformer.md index 063072523..a38034f22 100644 --- a/docs/readthedocs/models/result/grid/transformer.md +++ b/docs/readthedocs/models/result/grid/transformer.md @@ -7,7 +7,7 @@ Representation of transformers. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of transformers. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag @@ -40,7 +40,7 @@ Representation of transformers. - * - tapPos - - -- + - - ``` diff --git a/docs/readthedocs/models/result/grid/transformer2w.md b/docs/readthedocs/models/result/grid/transformer2w.md index 31de95f88..edd89ea66 100644 --- a/docs/readthedocs/models/result/grid/transformer2w.md +++ b/docs/readthedocs/models/result/grid/transformer2w.md @@ -7,7 +7,7 @@ Representation of two winding transformers. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of two winding transformers. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag @@ -40,7 +40,7 @@ Representation of two winding transformers. - * - tapPos - - -- + - - ``` diff --git a/docs/readthedocs/models/result/grid/transformer3w.md b/docs/readthedocs/models/result/grid/transformer3w.md index 327628ba4..2fecf7ecc 100644 --- a/docs/readthedocs/models/result/grid/transformer3w.md +++ b/docs/readthedocs/models/result/grid/transformer3w.md @@ -7,7 +7,7 @@ Representation of three winding transformers. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -20,7 +20,7 @@ Representation of three winding transformers. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag @@ -48,7 +48,7 @@ Representation of three winding transformers. - * - tapPos - - -- + - - ``` diff --git a/docs/readthedocs/models/result/participant/bm.md b/docs/readthedocs/models/result/participant/bm.md index 38f8805e8..4e6726fa5 100644 --- a/docs/readthedocs/models/result/participant/bm.md +++ b/docs/readthedocs/models/result/participant/bm.md @@ -7,7 +7,7 @@ Result of a biomass power plant. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a biomass power plant. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/chp.md b/docs/readthedocs/models/result/participant/chp.md index 271cf309c..0f86fd815 100644 --- a/docs/readthedocs/models/result/participant/chp.md +++ b/docs/readthedocs/models/result/participant/chp.md @@ -7,7 +7,7 @@ Result of a combined heat and power plant. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a combined heat and power plant. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/cylindricalstorage.md b/docs/readthedocs/models/result/participant/cylindricalstorage.md index 2db30bbb4..3ff3e2071 100644 --- a/docs/readthedocs/models/result/participant/cylindricalstorage.md +++ b/docs/readthedocs/models/result/participant/cylindricalstorage.md @@ -7,7 +7,7 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - energy @@ -32,7 +32,7 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. - heat demand of the sink * - fillLevel - - -- + - - ``` diff --git a/docs/readthedocs/models/result/participant/em.md b/docs/readthedocs/models/result/participant/em.md index e52a73023..226192e2a 100644 --- a/docs/readthedocs/models/result/participant/em.md +++ b/docs/readthedocs/models/result/participant/em.md @@ -7,7 +7,7 @@ Result of an energy management entity. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of an energy management entity. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/ev.md b/docs/readthedocs/models/result/participant/ev.md index 1db80239b..f03034649 100644 --- a/docs/readthedocs/models/result/participant/ev.md +++ b/docs/readthedocs/models/result/participant/ev.md @@ -7,7 +7,7 @@ Result of an electric vehicle, that is occasionally connected to the grid via an ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/evcs.md b/docs/readthedocs/models/result/participant/evcs.md index dedb4aa29..9d87a0741 100644 --- a/docs/readthedocs/models/result/participant/evcs.md +++ b/docs/readthedocs/models/result/participant/evcs.md @@ -7,7 +7,7 @@ This model is currently only a dummy implementation of an electric vehicle charg ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ This model is currently only a dummy implementation of an electric vehicle charg - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/fixedfeedin.md b/docs/readthedocs/models/result/participant/fixedfeedin.md index 15e8a30cb..5f6b444b6 100644 --- a/docs/readthedocs/models/result/participant/fixedfeedin.md +++ b/docs/readthedocs/models/result/participant/fixedfeedin.md @@ -8,7 +8,7 @@ model can be derived. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -17,11 +17,11 @@ model can be derived. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/flexoption.md b/docs/readthedocs/models/result/participant/flexoption.md index 2ddd701b9..0c498face 100644 --- a/docs/readthedocs/models/result/participant/flexoption.md +++ b/docs/readthedocs/models/result/participant/flexoption.md @@ -7,7 +7,7 @@ Result of a flexibility option. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a flexibility option. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - pRef diff --git a/docs/readthedocs/models/result/participant/hp.md b/docs/readthedocs/models/result/participant/hp.md index 6ed5b4b73..a3274b85d 100644 --- a/docs/readthedocs/models/result/participant/hp.md +++ b/docs/readthedocs/models/result/participant/hp.md @@ -7,7 +7,7 @@ Result of a heat pump. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a heat pump. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/load.md b/docs/readthedocs/models/result/participant/load.md index 3058aed01..4d96b3a2c 100644 --- a/docs/readthedocs/models/result/participant/load.md +++ b/docs/readthedocs/models/result/participant/load.md @@ -7,7 +7,7 @@ Result of (mainly) domestic loads. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of (mainly) domestic loads. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/pv.md b/docs/readthedocs/models/result/participant/pv.md index 544cc50a4..b8f4ec27b 100644 --- a/docs/readthedocs/models/result/participant/pv.md +++ b/docs/readthedocs/models/result/participant/pv.md @@ -7,7 +7,7 @@ Result of a photovoltaic power plant. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a photovoltaic power plant. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/storage.md b/docs/readthedocs/models/result/participant/storage.md index a5f9beb6b..0ef4e5bb8 100644 --- a/docs/readthedocs/models/result/participant/storage.md +++ b/docs/readthedocs/models/result/participant/storage.md @@ -7,7 +7,7 @@ Result of an electrochemical storage ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of an electrochemical storage - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p @@ -32,7 +32,7 @@ Result of an electrochemical storage - * - soc - - -- + - - ``` diff --git a/docs/readthedocs/models/result/participant/systemparticipant.md b/docs/readthedocs/models/result/participant/systemparticipant.md index 8b55b74b9..ee7a136c2 100644 --- a/docs/readthedocs/models/result/participant/systemparticipant.md +++ b/docs/readthedocs/models/result/participant/systemparticipant.md @@ -7,7 +7,7 @@ Groups together all system participants such as PV, Storage etc. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Groups together all system participants such as PV, Storage etc. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/thermalhouse.md b/docs/readthedocs/models/result/participant/thermalhouse.md index 8836624d8..317e0dc43 100644 --- a/docs/readthedocs/models/result/participant/thermalhouse.md +++ b/docs/readthedocs/models/result/participant/thermalhouse.md @@ -8,7 +8,7 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -17,11 +17,11 @@ This reflects a simple shoe box with transmission losses - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/thermalsink.md b/docs/readthedocs/models/result/participant/thermalsink.md index db5977dfd..d9d74e7d2 100644 --- a/docs/readthedocs/models/result/participant/thermalsink.md +++ b/docs/readthedocs/models/result/participant/thermalsink.md @@ -7,7 +7,7 @@ Result of a thermal sink. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a thermal sink. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/thermalstorage.md b/docs/readthedocs/models/result/participant/thermalstorage.md index 945ac99c8..b3fb5dd51 100644 --- a/docs/readthedocs/models/result/participant/thermalstorage.md +++ b/docs/readthedocs/models/result/participant/thermalstorage.md @@ -7,7 +7,7 @@ Result of a thermal storage. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a thermal storage. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - energy diff --git a/docs/readthedocs/models/result/participant/thermalunit.md b/docs/readthedocs/models/result/participant/thermalunit.md index a51f05bb9..877f40e97 100644 --- a/docs/readthedocs/models/result/participant/thermalunit.md +++ b/docs/readthedocs/models/result/participant/thermalunit.md @@ -7,7 +7,7 @@ Result of a thermal unit. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a thermal unit. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/wec.md b/docs/readthedocs/models/result/participant/wec.md index 245b163c0..3d5223185 100644 --- a/docs/readthedocs/models/result/participant/wec.md +++ b/docs/readthedocs/models/result/participant/wec.md @@ -7,7 +7,7 @@ Result of a wind turbine. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto :header-rows: 1 @@ -16,11 +16,11 @@ Result of a wind turbine. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p From 6b1db712d4bdb2a0cbc98fc14802fefef2092ad4 Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:56:16 +0200 Subject: [PATCH 090/310] Revert "Changed widths to auto and fixed tables" This reverts commit 25919d257e496552a21ab9781cec1cd24f23045f. --- docs/readthedocs/io/csvfiles.md | 2 +- .../models/input/grid/gridcontainer.md | 2 +- docs/readthedocs/models/input/grid/line.md | 4 +-- .../models/input/grid/linegraphic.md | 10 +++--- .../models/input/grid/measurementunit.md | 20 +++++------ docs/readthedocs/models/input/grid/node.md | 18 +++++----- .../models/input/grid/nodegraphic.md | 12 +++---- docs/readthedocs/models/input/grid/switch.md | 16 ++++----- .../models/input/grid/transformer2w.md | 4 +-- .../models/input/grid/transformer3w.md | 26 +++++++------- docs/readthedocs/models/input/operator.md | 6 ++-- .../models/input/participant/bm.md | 30 ++++++++-------- .../models/input/participant/chp.md | 32 ++++++++--------- .../models/input/participant/ev.md | 26 +++++++------- .../models/input/participant/evcs.md | 34 +++++++++---------- .../models/input/participant/fixedfeedin.md | 18 +++++----- .../models/input/participant/hp.md | 28 +++++++-------- .../models/input/participant/load.md | 22 ++++++------ .../models/input/participant/pv.md | 26 +++++++------- .../models/input/participant/storage.md | 28 +++++++-------- .../models/input/participant/wec.md | 30 ++++++++-------- .../input/thermal/cylindricalstorage.md | 12 +++---- .../models/input/thermal/thermalbus.md | 12 +++---- .../models/input/thermal/thermalhouse.md | 12 +++---- .../models/result/grid/congestion.md | 10 +++--- .../models/result/grid/connector.md | 4 +-- docs/readthedocs/models/result/grid/line.md | 4 +-- docs/readthedocs/models/result/grid/node.md | 4 +-- docs/readthedocs/models/result/grid/switch.md | 4 +-- .../models/result/grid/transformer.md | 6 ++-- .../models/result/grid/transformer2w.md | 6 ++-- .../models/result/grid/transformer3w.md | 6 ++-- .../models/result/participant/bm.md | 6 ++-- .../models/result/participant/chp.md | 6 ++-- .../result/participant/cylindricalstorage.md | 8 ++--- .../models/result/participant/em.md | 6 ++-- .../models/result/participant/ev.md | 6 ++-- .../models/result/participant/evcs.md | 6 ++-- .../models/result/participant/fixedfeedin.md | 6 ++-- .../models/result/participant/flexoption.md | 6 ++-- .../models/result/participant/hp.md | 6 ++-- .../models/result/participant/load.md | 6 ++-- .../models/result/participant/pv.md | 6 ++-- .../models/result/participant/storage.md | 8 ++--- .../result/participant/systemparticipant.md | 6 ++-- .../models/result/participant/thermalhouse.md | 6 ++-- .../models/result/participant/thermalsink.md | 6 ++-- .../result/participant/thermalstorage.md | 6 ++-- .../models/result/participant/thermalunit.md | 6 ++-- .../models/result/participant/wec.md | 6 ++-- 50 files changed, 293 insertions(+), 293 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 751c8d06a..4729fc7aa 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -88,7 +88,7 @@ Csv id coordinate sources can have two different ways to represent their coordin ### Time Series ```{list-table} - :widths: auto + :widths: 50 50 :header-rows: 1 * - Model diff --git a/docs/readthedocs/models/input/grid/gridcontainer.md b/docs/readthedocs/models/input/grid/gridcontainer.md index bde7081fd..c35541a87 100644 --- a/docs/readthedocs/models/input/grid/gridcontainer.md +++ b/docs/readthedocs/models/input/grid/gridcontainer.md @@ -38,7 +38,7 @@ A synoptic overview of both classes' attributes is given here: ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/line.md b/docs/readthedocs/models/input/grid/line.md index 4c170e514..87f649e59 100644 --- a/docs/readthedocs/models/input/grid/line.md +++ b/docs/readthedocs/models/input/grid/line.md @@ -7,7 +7,7 @@ Representation of an AC line. ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 * - Attribute @@ -53,7 +53,7 @@ A list with some standard line types can be found here: [Standard Line Types](#s ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/linegraphic.md b/docs/readthedocs/models/input/grid/linegraphic.md index c517caae2..79f307684 100644 --- a/docs/readthedocs/models/input/grid/linegraphic.md +++ b/docs/readthedocs/models/input/grid/linegraphic.md @@ -7,7 +7,7 @@ Schematic drawing information for a line model. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,20 +16,20 @@ Schematic drawing information for a line model. - Remarks * - uuid - - + - -- - * - graphicLayer - - + - -- - | Human readable identifier of the graphic layer to draw | this element on * - path - - + - -- - Line string of coordinates describing the drawing * - line - - + - -- - Reference to the physical line model ``` diff --git a/docs/readthedocs/models/input/grid/measurementunit.md b/docs/readthedocs/models/input/grid/measurementunit.md index db2888d67..a2c972fb0 100644 --- a/docs/readthedocs/models/input/grid/measurementunit.md +++ b/docs/readthedocs/models/input/grid/measurementunit.md @@ -9,7 +9,7 @@ The measured information are indicated by boolean fields. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,39 +18,39 @@ The measured information are indicated by boolean fields. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - vMag - - + - -- - Voltage magnitude measurements are available * - vAng - - + - -- - Voltage angle measurements are available * - p - - + - -- - Active power measurements are available * - q - - + - -- - Reactive power measurements are available ``` diff --git a/docs/readthedocs/models/input/grid/node.md b/docs/readthedocs/models/input/grid/node.md index e85f23895..e4d78993b 100644 --- a/docs/readthedocs/models/input/grid/node.md +++ b/docs/readthedocs/models/input/grid/node.md @@ -7,7 +7,7 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,19 +16,19 @@ Representation of an electrical node, with no further distinction into bus bar, - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - vTarget @@ -36,20 +36,20 @@ Representation of an electrical node, with no further distinction into bus bar, - Target voltage magnitude to be used by voltage regulation entities * - slack - - + - -- - | Boolean indicator, if this nodes serves as a slack node in power | flow calculation * - geoPosition - - + - -- - Geographical location * - voltLvl - - + - -- - Information of the voltage level (id and nominal voltage) * - subnet - - + - -- - Sub grid number ``` diff --git a/docs/readthedocs/models/input/grid/nodegraphic.md b/docs/readthedocs/models/input/grid/nodegraphic.md index 51eb18850..320b3583b 100644 --- a/docs/readthedocs/models/input/grid/nodegraphic.md +++ b/docs/readthedocs/models/input/grid/nodegraphic.md @@ -7,7 +7,7 @@ Schematic drawing information for a node model. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,24 +16,24 @@ Schematic drawing information for a node model. - Remarks * - uuid - - + - -- - * - graphicLayer - - + - -- - | Human readable identifier of the graphic layer to draw | this element on * - path - - + - -- - Line string of coordinates describing the drawing, e.g. for bus bars * - point - - + - -- - Alternative to line string, only drawing a point coordinate * - node - - + - -- - Reference to the physical node model ``` diff --git a/docs/readthedocs/models/input/grid/switch.md b/docs/readthedocs/models/input/grid/switch.md index 07228dc37..5f8b7d245 100644 --- a/docs/readthedocs/models/input/grid/switch.md +++ b/docs/readthedocs/models/input/grid/switch.md @@ -7,7 +7,7 @@ Model of an ideal switch connecting two node models of the same voltage level ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,31 +16,31 @@ Model of an ideal switch connecting two node models of the same voltage level - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - nodeA - - + - -- - * - nodeB - - + - -- - * - closed - - + - -- - true, if the switch is closed diff --git a/docs/readthedocs/models/input/grid/transformer2w.md b/docs/readthedocs/models/input/grid/transformer2w.md index e036746bd..26c6bb8f5 100644 --- a/docs/readthedocs/models/input/grid/transformer2w.md +++ b/docs/readthedocs/models/input/grid/transformer2w.md @@ -11,7 +11,7 @@ All impedances and admittances are given with respect to the higher voltage side As obvious, the parameter can be used in T- as in 𝜋-equivalent circuit representations. ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 * - Attribute @@ -82,7 +82,7 @@ A list with some standard transformer types can be found here: [Standard Two Win ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 * - Attribute diff --git a/docs/readthedocs/models/input/grid/transformer3w.md b/docs/readthedocs/models/input/grid/transformer3w.md index c64ba4e85..caecfefda 100644 --- a/docs/readthedocs/models/input/grid/transformer3w.md +++ b/docs/readthedocs/models/input/grid/transformer3w.md @@ -23,7 +23,7 @@ name: Equivalent circuit diagram of a three winding transformer All impedances and admittances are given with respect to the higher voltage side. ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -120,7 +120,7 @@ All impedances and admittances are given with respect to the higher voltage side ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -129,49 +129,49 @@ All impedances and admittances are given with respect to the higher voltage side - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - nodeA - - + - -- - Higher voltage node * - nodeB - - + - -- - Intermediate voltage node * - nodeC - - + - -- - Lowest voltage node * - parallelDevices - - + - -- - | overall amount of parallel transformers to automatically | construct (e.g. parallelDevices = 2 will build a | total of two transformers using the specified parameters) * - type - - + - -- - * - tapPos - - + - -- - Current position of the tap changer * - autoTap - - + - -- - true, if there is a tap regulation apparent and active ``` diff --git a/docs/readthedocs/models/input/operator.md b/docs/readthedocs/models/input/operator.md index c2becfe3a..7159485c3 100644 --- a/docs/readthedocs/models/input/operator.md +++ b/docs/readthedocs/models/input/operator.md @@ -8,7 +8,7 @@ having control over one or more physical entitites. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -17,11 +17,11 @@ having control over one or more physical entitites. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier ``` diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index 5ef1a716a..d2083c278 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -9,7 +9,7 @@ Model of a biomass power plant. ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,11 +18,11 @@ Model of a biomass power plant. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - capex @@ -43,7 +43,7 @@ Model of a biomass power plant. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - etaConv @@ -55,7 +55,7 @@ Model of a biomass power plant. ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -64,40 +64,40 @@ Model of a biomass power plant. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - * - marketReaction - - + - -- - | Whether to adapt output based on (volatile) | market price or not * - costControlled - - + - -- - | Whether to adapt output based on the difference | between production costs and fixed feed in tariff or not @@ -106,7 +106,7 @@ Model of a biomass power plant. - Fixed feed in tariff * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index 3a7c143f7..4b2892389 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -9,7 +9,7 @@ Combined heat and power plant. ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,11 +18,11 @@ Combined heat and power plant. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - capex @@ -47,7 +47,7 @@ Combined heat and power plant. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - pThermal @@ -63,7 +63,7 @@ Combined heat and power plant. ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -72,48 +72,48 @@ Combined heat and power plant. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - thermalBus - - + - -- - Connection point to the thermal system * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - * - thermalStorage - - + - -- - Reference to thermal storage * - marketReaction - - + - -- - | Whether to adapt output based on (volatile) | market price or not * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index eb663d411..ccb3dac83 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -9,7 +9,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,11 +18,11 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - capex @@ -51,7 +51,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - power for DC * - cosPhiRated - - + - -- - Rated power factor ``` @@ -59,7 +59,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -68,35 +68,35 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 38eb2a4a8..45752b156 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -10,7 +10,7 @@ station and has some limitations outlined below. ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -19,47 +19,47 @@ station and has some limitations outlined below. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - :ref:`Charging point type` (valid for all installed points) * - chargingPoints - - + - -- - no of installed charging points @ the specific station * - cosPhiRated - - + - -- - Rated power factor * - locationType - - + - -- - :ref:`Charging station location types` * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. @@ -78,7 +78,7 @@ available standard types and how to use custom types. The actual model definition for charging point types looks as follows: ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -87,7 +87,7 @@ The actual model definition for charging point types looks as follows: - Remarks * - id - - + - -- - Human readable identifier * - sRated @@ -95,11 +95,11 @@ The actual model definition for charging point types looks as follows: - Rated apparent power * - electricCurrentType - - + - -- - Electric current type * - synonymousIds - - + - -- - Set of alternative human readable identifiers ``` @@ -218,7 +218,7 @@ Evcs location types describe the type of charging location of a charging station and underscores and minuses are ignored, that means "charginghubtown" is parsed as type {code}`CHARGING_HUB_TOWN`. ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index 022868c89..dd4ccf14e 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -8,7 +8,7 @@ model can be derived. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -17,27 +17,27 @@ model can be derived. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - sRated @@ -45,11 +45,11 @@ model can be derived. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index f5f5b5258..571b1ceb2 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -9,7 +9,7 @@ Model of a heat pump. ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,11 +18,11 @@ Model of a heat pump. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - capex @@ -39,7 +39,7 @@ Model of a heat pump. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - pThermal @@ -51,7 +51,7 @@ Model of a heat pump. ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -60,39 +60,39 @@ Model of a heat pump. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - thermalBus - - + - -- - Connection point to the thermal system * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 72ebc9278..3706760fd 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -7,7 +7,7 @@ Model of (mainly) domestic loads. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,35 +16,35 @@ Model of (mainly) domestic loads. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - loadProfile - - + - -- - :ref:`Load profile` as model behaviour * - dsm - - + - -- - Whether the load is able to follow demand side management signals * - eConsAnnual @@ -56,11 +56,11 @@ Model of (mainly) domestic loads. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 41ed84638..053db1d59 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -5,7 +5,7 @@ Detailed model of a photovoltaic power plant. ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -14,31 +14,31 @@ Detailed model of a photovoltaic power plant. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - albedo - - + - -- - `Albedo `_ of the plant's surrounding * - azimuth @@ -55,15 +55,15 @@ Detailed model of a photovoltaic power plant. - Tilted inclination from horizontal [0°, 90°] * - kG - - + - -- - Generator correction factor merging technical influences * - kT - - + - -- - Temperature correction factor merging thermal influences * - marketReaction - - + - -- - | Whether to adapt output based on (volatile) | market price or not @@ -72,11 +72,11 @@ Detailed model of a photovoltaic power plant. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index 84fc2f735..a208551ba 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -9,7 +9,7 @@ Model of an ideal electrical battery energy storage. ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,11 +18,11 @@ Model of an ideal electrical battery energy storage. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - capex @@ -43,7 +43,7 @@ Model of an ideal electrical battery energy storage. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - pMax @@ -64,7 +64,7 @@ Model of an ideal electrical battery energy storage. ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -73,40 +73,40 @@ Model of an ideal electrical battery energy storage. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - * - behaviour - - + - -- - | Foreseen operation strategy of the storage. | Eligible input: *"market"*, *"grid"*, *"self"* * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index 0672d0e7c..5dd733f85 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -9,7 +9,7 @@ Model of a wind energy converter. ### Type Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -18,11 +18,11 @@ Model of a wind energy converter. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - capex @@ -39,11 +39,11 @@ Model of a wind energy converter. - Rated apparent power * - cosPhiRated - - + - -- - Rated power factor * - cpCharacteristic - - + - -- - Wind velocity dependent :ref:`Betz factors`. * - etaConv @@ -63,7 +63,7 @@ Model of a wind energy converter. ### Entity Model ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -72,40 +72,40 @@ Model of a wind energy converter. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - node - - + - -- - * - qCharacteristics - - + - -- - :ref:`Reactive power characteristic` to follow * - type - - + - -- - * - marketReaction - - + - -- - | Whether to adapt output based on (volatile) | market price or not * - em - - + - -- - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index da143003a..42bb55f35 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -7,7 +7,7 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,23 +16,23 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - thermalBus - - + - -- - Connection point to the thermal system * - storageVolumeLvl diff --git a/docs/readthedocs/models/input/thermal/thermalbus.md b/docs/readthedocs/models/input/thermal/thermalbus.md index 6e5bfd5c6..097566b02 100644 --- a/docs/readthedocs/models/input/thermal/thermalbus.md +++ b/docs/readthedocs/models/input/thermal/thermalbus.md @@ -8,7 +8,7 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -17,23 +17,23 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - bus - - + - -- - Connection point to the thermal system ``` diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index 07ed31309..74e94a21f 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -8,7 +8,7 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -17,23 +17,23 @@ This reflects a simple shoe box with transmission losses - Remarks * - uuid - - + - -- - * - id - - + - -- - Human readable identifier * - bus - - + - -- - Thermal bus, the model is connected to * - operator - - + - -- - * - operationTime - - + - -- - Timely restriction of operation * - ethLosses diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 606f79068..d0865d3de 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -7,7 +7,7 @@ Representation of a congestion result for a given subnet. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of a congestion result for a given subnet. - date and time for the produced result * - subgrid - - + - -- - Sub grid number * - vMin @@ -32,15 +32,15 @@ Representation of a congestion result for a given subnet. - maximal voltage of the subnet * - voltage - - + - -- - Boolean indicator, if a voltage congestion occurred * - line - - + - -- - Boolean indicator, if a line congestion occurred * - transformer - - + - -- - Boolean indicator, if a transformer congestion occurred ``` diff --git a/docs/readthedocs/models/result/grid/connector.md b/docs/readthedocs/models/result/grid/connector.md index 0898ecd60..c1e3b90b7 100644 --- a/docs/readthedocs/models/result/grid/connector.md +++ b/docs/readthedocs/models/result/grid/connector.md @@ -7,7 +7,7 @@ Representation of all kinds of connectors. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of all kinds of connectors. - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - iAMag diff --git a/docs/readthedocs/models/result/grid/line.md b/docs/readthedocs/models/result/grid/line.md index c92f8352d..0e02f8704 100644 --- a/docs/readthedocs/models/result/grid/line.md +++ b/docs/readthedocs/models/result/grid/line.md @@ -7,7 +7,7 @@ Representation of an AC line. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of an AC line. - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - iAMag diff --git a/docs/readthedocs/models/result/grid/node.md b/docs/readthedocs/models/result/grid/node.md index c28f16e7a..353185788 100644 --- a/docs/readthedocs/models/result/grid/node.md +++ b/docs/readthedocs/models/result/grid/node.md @@ -7,7 +7,7 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of an electrical node, with no further distinction into bus bar, - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - vMag diff --git a/docs/readthedocs/models/result/grid/switch.md b/docs/readthedocs/models/result/grid/switch.md index e2a59a105..5ba536377 100644 --- a/docs/readthedocs/models/result/grid/switch.md +++ b/docs/readthedocs/models/result/grid/switch.md @@ -7,7 +7,7 @@ Representation of electrical switches. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of electrical switches. - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - closed diff --git a/docs/readthedocs/models/result/grid/transformer.md b/docs/readthedocs/models/result/grid/transformer.md index a38034f22..063072523 100644 --- a/docs/readthedocs/models/result/grid/transformer.md +++ b/docs/readthedocs/models/result/grid/transformer.md @@ -7,7 +7,7 @@ Representation of transformers. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of transformers. - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - iAMag @@ -40,7 +40,7 @@ Representation of transformers. - * - tapPos - - + - -- - ``` diff --git a/docs/readthedocs/models/result/grid/transformer2w.md b/docs/readthedocs/models/result/grid/transformer2w.md index edd89ea66..31de95f88 100644 --- a/docs/readthedocs/models/result/grid/transformer2w.md +++ b/docs/readthedocs/models/result/grid/transformer2w.md @@ -7,7 +7,7 @@ Representation of two winding transformers. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of two winding transformers. - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - iAMag @@ -40,7 +40,7 @@ Representation of two winding transformers. - * - tapPos - - + - -- - ``` diff --git a/docs/readthedocs/models/result/grid/transformer3w.md b/docs/readthedocs/models/result/grid/transformer3w.md index 2fecf7ecc..327628ba4 100644 --- a/docs/readthedocs/models/result/grid/transformer3w.md +++ b/docs/readthedocs/models/result/grid/transformer3w.md @@ -7,7 +7,7 @@ Representation of three winding transformers. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -20,7 +20,7 @@ Representation of three winding transformers. - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - iAMag @@ -48,7 +48,7 @@ Representation of three winding transformers. - * - tapPos - - + - -- - ``` diff --git a/docs/readthedocs/models/result/participant/bm.md b/docs/readthedocs/models/result/participant/bm.md index 4e6726fa5..38f8805e8 100644 --- a/docs/readthedocs/models/result/participant/bm.md +++ b/docs/readthedocs/models/result/participant/bm.md @@ -7,7 +7,7 @@ Result of a biomass power plant. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a biomass power plant. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/chp.md b/docs/readthedocs/models/result/participant/chp.md index 0f86fd815..271cf309c 100644 --- a/docs/readthedocs/models/result/participant/chp.md +++ b/docs/readthedocs/models/result/participant/chp.md @@ -7,7 +7,7 @@ Result of a combined heat and power plant. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a combined heat and power plant. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/cylindricalstorage.md b/docs/readthedocs/models/result/participant/cylindricalstorage.md index 3ff3e2071..2db30bbb4 100644 --- a/docs/readthedocs/models/result/participant/cylindricalstorage.md +++ b/docs/readthedocs/models/result/participant/cylindricalstorage.md @@ -7,7 +7,7 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - energy @@ -32,7 +32,7 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. - heat demand of the sink * - fillLevel - - + - -- - ``` diff --git a/docs/readthedocs/models/result/participant/em.md b/docs/readthedocs/models/result/participant/em.md index 226192e2a..e52a73023 100644 --- a/docs/readthedocs/models/result/participant/em.md +++ b/docs/readthedocs/models/result/participant/em.md @@ -7,7 +7,7 @@ Result of an energy management entity. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of an energy management entity. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/ev.md b/docs/readthedocs/models/result/participant/ev.md index f03034649..1db80239b 100644 --- a/docs/readthedocs/models/result/participant/ev.md +++ b/docs/readthedocs/models/result/participant/ev.md @@ -7,7 +7,7 @@ Result of an electric vehicle, that is occasionally connected to the grid via an ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/evcs.md b/docs/readthedocs/models/result/participant/evcs.md index 9d87a0741..dedb4aa29 100644 --- a/docs/readthedocs/models/result/participant/evcs.md +++ b/docs/readthedocs/models/result/participant/evcs.md @@ -7,7 +7,7 @@ This model is currently only a dummy implementation of an electric vehicle charg ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ This model is currently only a dummy implementation of an electric vehicle charg - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/fixedfeedin.md b/docs/readthedocs/models/result/participant/fixedfeedin.md index 5f6b444b6..15e8a30cb 100644 --- a/docs/readthedocs/models/result/participant/fixedfeedin.md +++ b/docs/readthedocs/models/result/participant/fixedfeedin.md @@ -8,7 +8,7 @@ model can be derived. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -17,11 +17,11 @@ model can be derived. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/flexoption.md b/docs/readthedocs/models/result/participant/flexoption.md index 0c498face..2ddd701b9 100644 --- a/docs/readthedocs/models/result/participant/flexoption.md +++ b/docs/readthedocs/models/result/participant/flexoption.md @@ -7,7 +7,7 @@ Result of a flexibility option. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a flexibility option. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - pRef diff --git a/docs/readthedocs/models/result/participant/hp.md b/docs/readthedocs/models/result/participant/hp.md index a3274b85d..6ed5b4b73 100644 --- a/docs/readthedocs/models/result/participant/hp.md +++ b/docs/readthedocs/models/result/participant/hp.md @@ -7,7 +7,7 @@ Result of a heat pump. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a heat pump. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/load.md b/docs/readthedocs/models/result/participant/load.md index 4d96b3a2c..3058aed01 100644 --- a/docs/readthedocs/models/result/participant/load.md +++ b/docs/readthedocs/models/result/participant/load.md @@ -7,7 +7,7 @@ Result of (mainly) domestic loads. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of (mainly) domestic loads. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/pv.md b/docs/readthedocs/models/result/participant/pv.md index b8f4ec27b..544cc50a4 100644 --- a/docs/readthedocs/models/result/participant/pv.md +++ b/docs/readthedocs/models/result/participant/pv.md @@ -7,7 +7,7 @@ Result of a photovoltaic power plant. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a photovoltaic power plant. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/storage.md b/docs/readthedocs/models/result/participant/storage.md index 0ef4e5bb8..a5f9beb6b 100644 --- a/docs/readthedocs/models/result/participant/storage.md +++ b/docs/readthedocs/models/result/participant/storage.md @@ -7,7 +7,7 @@ Result of an electrochemical storage ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of an electrochemical storage - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p @@ -32,7 +32,7 @@ Result of an electrochemical storage - * - soc - - + - -- - ``` diff --git a/docs/readthedocs/models/result/participant/systemparticipant.md b/docs/readthedocs/models/result/participant/systemparticipant.md index ee7a136c2..8b55b74b9 100644 --- a/docs/readthedocs/models/result/participant/systemparticipant.md +++ b/docs/readthedocs/models/result/participant/systemparticipant.md @@ -7,7 +7,7 @@ Groups together all system participants such as PV, Storage etc. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Groups together all system participants such as PV, Storage etc. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/thermalhouse.md b/docs/readthedocs/models/result/participant/thermalhouse.md index 317e0dc43..8836624d8 100644 --- a/docs/readthedocs/models/result/participant/thermalhouse.md +++ b/docs/readthedocs/models/result/participant/thermalhouse.md @@ -8,7 +8,7 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -17,11 +17,11 @@ This reflects a simple shoe box with transmission losses - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/thermalsink.md b/docs/readthedocs/models/result/participant/thermalsink.md index d9d74e7d2..db5977dfd 100644 --- a/docs/readthedocs/models/result/participant/thermalsink.md +++ b/docs/readthedocs/models/result/participant/thermalsink.md @@ -7,7 +7,7 @@ Result of a thermal sink. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a thermal sink. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/thermalstorage.md b/docs/readthedocs/models/result/participant/thermalstorage.md index b3fb5dd51..945ac99c8 100644 --- a/docs/readthedocs/models/result/participant/thermalstorage.md +++ b/docs/readthedocs/models/result/participant/thermalstorage.md @@ -7,7 +7,7 @@ Result of a thermal storage. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a thermal storage. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - energy diff --git a/docs/readthedocs/models/result/participant/thermalunit.md b/docs/readthedocs/models/result/participant/thermalunit.md index 877f40e97..a51f05bb9 100644 --- a/docs/readthedocs/models/result/participant/thermalunit.md +++ b/docs/readthedocs/models/result/participant/thermalunit.md @@ -7,7 +7,7 @@ Result of a thermal unit. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a thermal unit. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/wec.md b/docs/readthedocs/models/result/participant/wec.md index 3d5223185..245b163c0 100644 --- a/docs/readthedocs/models/result/participant/wec.md +++ b/docs/readthedocs/models/result/participant/wec.md @@ -7,7 +7,7 @@ Result of a wind turbine. ## Attributes, Units and Remarks ```{list-table} - :widths: auto + :widths: 33 33 33 :header-rows: 1 @@ -16,11 +16,11 @@ Result of a wind turbine. - Remarks * - time - - + - -- - date and time for the produced result * - inputModel - - + - -- - uuid for the associated input model * - p From b08c7215e2405a9ef3c03d6061145085312ce08c Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Wed, 21 Aug 2024 16:57:14 +0200 Subject: [PATCH 091/310] Fixed tables --- .../models/input/grid/linegraphic.md | 8 +++--- .../models/input/grid/measurementunit.md | 18 ++++++------ docs/readthedocs/models/input/grid/node.md | 16 +++++------ .../models/input/grid/nodegraphic.md | 10 +++---- docs/readthedocs/models/input/grid/switch.md | 14 +++++----- .../models/input/grid/transformer3w.md | 22 +++++++-------- docs/readthedocs/models/input/operator.md | 4 +-- .../models/input/participant/bm.md | 26 ++++++++--------- .../models/input/participant/chp.md | 28 +++++++++---------- .../models/input/participant/ev.md | 22 +++++++-------- .../models/input/participant/evcs.md | 28 +++++++++---------- .../models/input/participant/fixedfeedin.md | 16 +++++------ .../models/input/participant/hp.md | 24 ++++++++-------- .../models/input/participant/load.md | 20 ++++++------- .../models/input/participant/pv.md | 24 ++++++++-------- .../models/input/participant/storage.md | 24 ++++++++-------- .../models/input/participant/wec.md | 26 ++++++++--------- .../input/thermal/cylindricalstorage.md | 10 +++---- .../models/input/thermal/thermalbus.md | 10 +++---- .../models/input/thermal/thermalhouse.md | 10 +++---- .../models/result/grid/congestion.md | 8 +++--- .../models/result/grid/connector.md | 2 +- docs/readthedocs/models/result/grid/line.md | 2 +- docs/readthedocs/models/result/grid/node.md | 2 +- docs/readthedocs/models/result/grid/switch.md | 2 +- .../models/result/grid/transformer.md | 4 +-- .../models/result/grid/transformer2w.md | 4 +-- .../models/result/grid/transformer3w.md | 4 +-- .../models/result/participant/bm.md | 4 +-- .../models/result/participant/chp.md | 4 +-- .../result/participant/cylindricalstorage.md | 6 ++-- .../models/result/participant/em.md | 4 +-- .../models/result/participant/ev.md | 4 +-- .../models/result/participant/evcs.md | 4 +-- .../models/result/participant/fixedfeedin.md | 4 +-- .../models/result/participant/flexoption.md | 4 +-- .../models/result/participant/hp.md | 4 +-- .../models/result/participant/load.md | 4 +-- .../models/result/participant/pv.md | 4 +-- .../models/result/participant/storage.md | 6 ++-- .../result/participant/systemparticipant.md | 4 +-- .../models/result/participant/thermalhouse.md | 4 +-- .../models/result/participant/thermalsink.md | 4 +-- .../result/participant/thermalstorage.md | 4 +-- .../models/result/participant/thermalunit.md | 4 +-- .../models/result/participant/wec.md | 4 +-- 46 files changed, 232 insertions(+), 232 deletions(-) diff --git a/docs/readthedocs/models/input/grid/linegraphic.md b/docs/readthedocs/models/input/grid/linegraphic.md index 79f307684..4016d6928 100644 --- a/docs/readthedocs/models/input/grid/linegraphic.md +++ b/docs/readthedocs/models/input/grid/linegraphic.md @@ -16,20 +16,20 @@ Schematic drawing information for a line model. - Remarks * - uuid - - -- + - - * - graphicLayer - - -- + - - | Human readable identifier of the graphic layer to draw | this element on * - path - - -- + - - Line string of coordinates describing the drawing * - line - - -- + - - Reference to the physical line model ``` diff --git a/docs/readthedocs/models/input/grid/measurementunit.md b/docs/readthedocs/models/input/grid/measurementunit.md index a2c972fb0..f800955b4 100644 --- a/docs/readthedocs/models/input/grid/measurementunit.md +++ b/docs/readthedocs/models/input/grid/measurementunit.md @@ -18,39 +18,39 @@ The measured information are indicated by boolean fields. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - vMag - - -- + - - Voltage magnitude measurements are available * - vAng - - -- + - - Voltage angle measurements are available * - p - - -- + - - Active power measurements are available * - q - - -- + - - Reactive power measurements are available ``` diff --git a/docs/readthedocs/models/input/grid/node.md b/docs/readthedocs/models/input/grid/node.md index e4d78993b..31f3e9a1d 100644 --- a/docs/readthedocs/models/input/grid/node.md +++ b/docs/readthedocs/models/input/grid/node.md @@ -16,19 +16,19 @@ Representation of an electrical node, with no further distinction into bus bar, - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - vTarget @@ -36,20 +36,20 @@ Representation of an electrical node, with no further distinction into bus bar, - Target voltage magnitude to be used by voltage regulation entities * - slack - - -- + - - | Boolean indicator, if this nodes serves as a slack node in power | flow calculation * - geoPosition - - -- + - - Geographical location * - voltLvl - - -- + - - Information of the voltage level (id and nominal voltage) * - subnet - - -- + - - Sub grid number ``` diff --git a/docs/readthedocs/models/input/grid/nodegraphic.md b/docs/readthedocs/models/input/grid/nodegraphic.md index 320b3583b..1ca714156 100644 --- a/docs/readthedocs/models/input/grid/nodegraphic.md +++ b/docs/readthedocs/models/input/grid/nodegraphic.md @@ -16,24 +16,24 @@ Schematic drawing information for a node model. - Remarks * - uuid - - -- + - - * - graphicLayer - - -- + - - | Human readable identifier of the graphic layer to draw | this element on * - path - - -- + - - Line string of coordinates describing the drawing, e.g. for bus bars * - point - - -- + - - Alternative to line string, only drawing a point coordinate * - node - - -- + - - Reference to the physical node model ``` diff --git a/docs/readthedocs/models/input/grid/switch.md b/docs/readthedocs/models/input/grid/switch.md index 5f8b7d245..244bf8756 100644 --- a/docs/readthedocs/models/input/grid/switch.md +++ b/docs/readthedocs/models/input/grid/switch.md @@ -16,31 +16,31 @@ Model of an ideal switch connecting two node models of the same voltage level - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - nodeA - - -- + - - * - nodeB - - -- + - - * - closed - - -- + - - true, if the switch is closed diff --git a/docs/readthedocs/models/input/grid/transformer3w.md b/docs/readthedocs/models/input/grid/transformer3w.md index caecfefda..a5b2a556f 100644 --- a/docs/readthedocs/models/input/grid/transformer3w.md +++ b/docs/readthedocs/models/input/grid/transformer3w.md @@ -129,49 +129,49 @@ All impedances and admittances are given with respect to the higher voltage side - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - nodeA - - -- + - - Higher voltage node * - nodeB - - -- + - - Intermediate voltage node * - nodeC - - -- + - - Lowest voltage node * - parallelDevices - - -- + - - | overall amount of parallel transformers to automatically | construct (e.g. parallelDevices = 2 will build a | total of two transformers using the specified parameters) * - type - - -- + - - * - tapPos - - -- + - - Current position of the tap changer * - autoTap - - -- + - - true, if there is a tap regulation apparent and active ``` diff --git a/docs/readthedocs/models/input/operator.md b/docs/readthedocs/models/input/operator.md index 7159485c3..6958ffb89 100644 --- a/docs/readthedocs/models/input/operator.md +++ b/docs/readthedocs/models/input/operator.md @@ -17,11 +17,11 @@ having control over one or more physical entitites. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier ``` diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index d2083c278..df2092b7d 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -18,11 +18,11 @@ Model of a biomass power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -43,7 +43,7 @@ Model of a biomass power plant. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - etaConv @@ -64,40 +64,40 @@ Model of a biomass power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not * - costControlled - - -- + - - | Whether to adapt output based on the difference | between production costs and fixed feed in tariff or not @@ -106,7 +106,7 @@ Model of a biomass power plant. - Fixed feed in tariff * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index 4b2892389..2b42cd851 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -18,11 +18,11 @@ Combined heat and power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -47,7 +47,7 @@ Combined heat and power plant. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - pThermal @@ -72,48 +72,48 @@ Combined heat and power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - thermalBus - - -- + - - Connection point to the thermal system * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - thermalStorage - - -- + - - Reference to thermal storage * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index ccb3dac83..b52222b47 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -18,11 +18,11 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -51,7 +51,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - power for DC * - cosPhiRated - - -- + - - Rated power factor ``` @@ -68,35 +68,35 @@ Model of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 45752b156..1723289b9 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -19,47 +19,47 @@ station and has some limitations outlined below. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - :ref:`Charging point type` (valid for all installed points) * - chargingPoints - - -- + - - no of installed charging points @ the specific station * - cosPhiRated - - -- + - - Rated power factor * - locationType - - -- + - - :ref:`Charging station location types` * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. @@ -87,7 +87,7 @@ The actual model definition for charging point types looks as follows: - Remarks * - id - - -- + - - Human readable identifier * - sRated @@ -95,11 +95,11 @@ The actual model definition for charging point types looks as follows: - Rated apparent power * - electricCurrentType - - -- + - - Electric current type * - synonymousIds - - -- + - - Set of alternative human readable identifiers ``` diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index dd4ccf14e..00de1b258 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -17,27 +17,27 @@ model can be derived. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - sRated @@ -45,11 +45,11 @@ model can be derived. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index 571b1ceb2..1bb6d36fb 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -18,11 +18,11 @@ Model of a heat pump. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -39,7 +39,7 @@ Model of a heat pump. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - pThermal @@ -60,39 +60,39 @@ Model of a heat pump. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - thermalBus - - -- + - - Connection point to the thermal system * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 3706760fd..3bddaacfb 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -16,35 +16,35 @@ Model of (mainly) domestic loads. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - loadProfile - - -- + - - :ref:`Load profile` as model behaviour * - dsm - - -- + - - Whether the load is able to follow demand side management signals * - eConsAnnual @@ -56,11 +56,11 @@ Model of (mainly) domestic loads. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 053db1d59..e30aaf1f7 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -14,31 +14,31 @@ Detailed model of a photovoltaic power plant. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - albedo - - -- + - - `Albedo `_ of the plant's surrounding * - azimuth @@ -55,15 +55,15 @@ Detailed model of a photovoltaic power plant. - Tilted inclination from horizontal [0°, 90°] * - kG - - -- + - - Generator correction factor merging technical influences * - kT - - -- + - - Temperature correction factor merging thermal influences * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not @@ -72,11 +72,11 @@ Detailed model of a photovoltaic power plant. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index a208551ba..f166758d1 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -18,11 +18,11 @@ Model of an ideal electrical battery energy storage. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -43,7 +43,7 @@ Model of an ideal electrical battery energy storage. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - pMax @@ -73,40 +73,40 @@ Model of an ideal electrical battery energy storage. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - behaviour - - -- + - - | Foreseen operation strategy of the storage. | Eligible input: *"market"*, *"grid"*, *"self"* * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index 5dd733f85..2c5a753a7 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -18,11 +18,11 @@ Model of a wind energy converter. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - capex @@ -39,11 +39,11 @@ Model of a wind energy converter. - Rated apparent power * - cosPhiRated - - -- + - - Rated power factor * - cpCharacteristic - - -- + - - Wind velocity dependent :ref:`Betz factors`. * - etaConv @@ -72,40 +72,40 @@ Model of a wind energy converter. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - node - - -- + - - * - qCharacteristics - - -- + - - :ref:`Reactive power characteristic` to follow * - type - - -- + - - * - marketReaction - - -- + - - | Whether to adapt output based on (volatile) | market price or not * - em - - -- + - - | UUID reference to an :ref:`Energy Management Unit` that is controlling | this system participant. Field can be empty or missing, if this participant | is not controlled. diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 42bb55f35..fb3304b4a 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -16,23 +16,23 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - thermalBus - - -- + - - Connection point to the thermal system * - storageVolumeLvl diff --git a/docs/readthedocs/models/input/thermal/thermalbus.md b/docs/readthedocs/models/input/thermal/thermalbus.md index 097566b02..4cd31e996 100644 --- a/docs/readthedocs/models/input/thermal/thermalbus.md +++ b/docs/readthedocs/models/input/thermal/thermalbus.md @@ -17,23 +17,23 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - bus - - -- + - - Connection point to the thermal system ``` diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index 74e94a21f..803864941 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -17,23 +17,23 @@ This reflects a simple shoe box with transmission losses - Remarks * - uuid - - -- + - - * - id - - -- + - - Human readable identifier * - bus - - -- + - - Thermal bus, the model is connected to * - operator - - -- + - - * - operationTime - - -- + - - Timely restriction of operation * - ethLosses diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index d0865d3de..e0f687fa4 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -20,7 +20,7 @@ Representation of a congestion result for a given subnet. - date and time for the produced result * - subgrid - - -- + - - Sub grid number * - vMin @@ -32,15 +32,15 @@ Representation of a congestion result for a given subnet. - maximal voltage of the subnet * - voltage - - -- + - - Boolean indicator, if a voltage congestion occurred * - line - - -- + - - Boolean indicator, if a line congestion occurred * - transformer - - -- + - - Boolean indicator, if a transformer congestion occurred ``` diff --git a/docs/readthedocs/models/result/grid/connector.md b/docs/readthedocs/models/result/grid/connector.md index c1e3b90b7..ff3e65203 100644 --- a/docs/readthedocs/models/result/grid/connector.md +++ b/docs/readthedocs/models/result/grid/connector.md @@ -20,7 +20,7 @@ Representation of all kinds of connectors. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag diff --git a/docs/readthedocs/models/result/grid/line.md b/docs/readthedocs/models/result/grid/line.md index 0e02f8704..72ca71ce3 100644 --- a/docs/readthedocs/models/result/grid/line.md +++ b/docs/readthedocs/models/result/grid/line.md @@ -20,7 +20,7 @@ Representation of an AC line. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag diff --git a/docs/readthedocs/models/result/grid/node.md b/docs/readthedocs/models/result/grid/node.md index 353185788..8a9578f8c 100644 --- a/docs/readthedocs/models/result/grid/node.md +++ b/docs/readthedocs/models/result/grid/node.md @@ -20,7 +20,7 @@ Representation of an electrical node, with no further distinction into bus bar, - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - vMag diff --git a/docs/readthedocs/models/result/grid/switch.md b/docs/readthedocs/models/result/grid/switch.md index 5ba536377..63b00035c 100644 --- a/docs/readthedocs/models/result/grid/switch.md +++ b/docs/readthedocs/models/result/grid/switch.md @@ -20,7 +20,7 @@ Representation of electrical switches. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - closed diff --git a/docs/readthedocs/models/result/grid/transformer.md b/docs/readthedocs/models/result/grid/transformer.md index 063072523..48620f9fe 100644 --- a/docs/readthedocs/models/result/grid/transformer.md +++ b/docs/readthedocs/models/result/grid/transformer.md @@ -20,7 +20,7 @@ Representation of transformers. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag @@ -40,7 +40,7 @@ Representation of transformers. - * - tapPos - - -- + - - ``` diff --git a/docs/readthedocs/models/result/grid/transformer2w.md b/docs/readthedocs/models/result/grid/transformer2w.md index 31de95f88..967cc9eaf 100644 --- a/docs/readthedocs/models/result/grid/transformer2w.md +++ b/docs/readthedocs/models/result/grid/transformer2w.md @@ -20,7 +20,7 @@ Representation of two winding transformers. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag @@ -40,7 +40,7 @@ Representation of two winding transformers. - * - tapPos - - -- + - - ``` diff --git a/docs/readthedocs/models/result/grid/transformer3w.md b/docs/readthedocs/models/result/grid/transformer3w.md index 327628ba4..6ba3684d3 100644 --- a/docs/readthedocs/models/result/grid/transformer3w.md +++ b/docs/readthedocs/models/result/grid/transformer3w.md @@ -20,7 +20,7 @@ Representation of three winding transformers. - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - iAMag @@ -48,7 +48,7 @@ Representation of three winding transformers. - * - tapPos - - -- + - - ``` diff --git a/docs/readthedocs/models/result/participant/bm.md b/docs/readthedocs/models/result/participant/bm.md index 38f8805e8..ec49e84e0 100644 --- a/docs/readthedocs/models/result/participant/bm.md +++ b/docs/readthedocs/models/result/participant/bm.md @@ -16,11 +16,11 @@ Result of a biomass power plant. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/chp.md b/docs/readthedocs/models/result/participant/chp.md index 271cf309c..69960aa18 100644 --- a/docs/readthedocs/models/result/participant/chp.md +++ b/docs/readthedocs/models/result/participant/chp.md @@ -16,11 +16,11 @@ Result of a combined heat and power plant. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/cylindricalstorage.md b/docs/readthedocs/models/result/participant/cylindricalstorage.md index 2db30bbb4..b8a83dbf7 100644 --- a/docs/readthedocs/models/result/participant/cylindricalstorage.md +++ b/docs/readthedocs/models/result/participant/cylindricalstorage.md @@ -16,11 +16,11 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - energy @@ -32,7 +32,7 @@ Result of a cylindrical thermal storage using a fluent to store thermal energy. - heat demand of the sink * - fillLevel - - -- + - - ``` diff --git a/docs/readthedocs/models/result/participant/em.md b/docs/readthedocs/models/result/participant/em.md index e52a73023..ec4a20b6a 100644 --- a/docs/readthedocs/models/result/participant/em.md +++ b/docs/readthedocs/models/result/participant/em.md @@ -16,11 +16,11 @@ Result of an energy management entity. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/ev.md b/docs/readthedocs/models/result/participant/ev.md index 1db80239b..9307ff613 100644 --- a/docs/readthedocs/models/result/participant/ev.md +++ b/docs/readthedocs/models/result/participant/ev.md @@ -16,11 +16,11 @@ Result of an electric vehicle, that is occasionally connected to the grid via an - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/evcs.md b/docs/readthedocs/models/result/participant/evcs.md index dedb4aa29..306b5f02a 100644 --- a/docs/readthedocs/models/result/participant/evcs.md +++ b/docs/readthedocs/models/result/participant/evcs.md @@ -16,11 +16,11 @@ This model is currently only a dummy implementation of an electric vehicle charg - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/fixedfeedin.md b/docs/readthedocs/models/result/participant/fixedfeedin.md index 15e8a30cb..bbf741b06 100644 --- a/docs/readthedocs/models/result/participant/fixedfeedin.md +++ b/docs/readthedocs/models/result/participant/fixedfeedin.md @@ -17,11 +17,11 @@ model can be derived. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/flexoption.md b/docs/readthedocs/models/result/participant/flexoption.md index 2ddd701b9..acfa88a20 100644 --- a/docs/readthedocs/models/result/participant/flexoption.md +++ b/docs/readthedocs/models/result/participant/flexoption.md @@ -16,11 +16,11 @@ Result of a flexibility option. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - pRef diff --git a/docs/readthedocs/models/result/participant/hp.md b/docs/readthedocs/models/result/participant/hp.md index 6ed5b4b73..f0207be0a 100644 --- a/docs/readthedocs/models/result/participant/hp.md +++ b/docs/readthedocs/models/result/participant/hp.md @@ -16,11 +16,11 @@ Result of a heat pump. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/load.md b/docs/readthedocs/models/result/participant/load.md index 3058aed01..a2557f338 100644 --- a/docs/readthedocs/models/result/participant/load.md +++ b/docs/readthedocs/models/result/participant/load.md @@ -16,11 +16,11 @@ Result of (mainly) domestic loads. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/pv.md b/docs/readthedocs/models/result/participant/pv.md index 544cc50a4..e127def89 100644 --- a/docs/readthedocs/models/result/participant/pv.md +++ b/docs/readthedocs/models/result/participant/pv.md @@ -16,11 +16,11 @@ Result of a photovoltaic power plant. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/storage.md b/docs/readthedocs/models/result/participant/storage.md index a5f9beb6b..ad55716c8 100644 --- a/docs/readthedocs/models/result/participant/storage.md +++ b/docs/readthedocs/models/result/participant/storage.md @@ -16,11 +16,11 @@ Result of an electrochemical storage - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p @@ -32,7 +32,7 @@ Result of an electrochemical storage - * - soc - - -- + - - ``` diff --git a/docs/readthedocs/models/result/participant/systemparticipant.md b/docs/readthedocs/models/result/participant/systemparticipant.md index 8b55b74b9..85f2e9d23 100644 --- a/docs/readthedocs/models/result/participant/systemparticipant.md +++ b/docs/readthedocs/models/result/participant/systemparticipant.md @@ -16,11 +16,11 @@ Groups together all system participants such as PV, Storage etc. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p diff --git a/docs/readthedocs/models/result/participant/thermalhouse.md b/docs/readthedocs/models/result/participant/thermalhouse.md index 8836624d8..4660c28b2 100644 --- a/docs/readthedocs/models/result/participant/thermalhouse.md +++ b/docs/readthedocs/models/result/participant/thermalhouse.md @@ -17,11 +17,11 @@ This reflects a simple shoe box with transmission losses - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/thermalsink.md b/docs/readthedocs/models/result/participant/thermalsink.md index db5977dfd..e7fa5583d 100644 --- a/docs/readthedocs/models/result/participant/thermalsink.md +++ b/docs/readthedocs/models/result/participant/thermalsink.md @@ -16,11 +16,11 @@ Result of a thermal sink. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/thermalstorage.md b/docs/readthedocs/models/result/participant/thermalstorage.md index 945ac99c8..b8ed500d2 100644 --- a/docs/readthedocs/models/result/participant/thermalstorage.md +++ b/docs/readthedocs/models/result/participant/thermalstorage.md @@ -16,11 +16,11 @@ Result of a thermal storage. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - energy diff --git a/docs/readthedocs/models/result/participant/thermalunit.md b/docs/readthedocs/models/result/participant/thermalunit.md index a51f05bb9..9757a915c 100644 --- a/docs/readthedocs/models/result/participant/thermalunit.md +++ b/docs/readthedocs/models/result/participant/thermalunit.md @@ -16,11 +16,11 @@ Result of a thermal unit. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - qDot diff --git a/docs/readthedocs/models/result/participant/wec.md b/docs/readthedocs/models/result/participant/wec.md index 245b163c0..a117d2d14 100644 --- a/docs/readthedocs/models/result/participant/wec.md +++ b/docs/readthedocs/models/result/participant/wec.md @@ -16,11 +16,11 @@ Result of a wind turbine. - Remarks * - time - - -- + - - date and time for the produced result * - inputModel - - -- + - - uuid for the associated input model * - p From aa301729b87c1576bd2f73441cd8564ca20440d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 07:53:10 +0000 Subject: [PATCH 092/310] Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 (#1143) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c3105ef23..a5fabd18b 100644 --- a/build.gradle +++ b/build.gradle @@ -91,7 +91,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' implementation 'com.couchbase.client:java-client:3.7.2' - runtimeOnly 'org.postgresql:postgresql:42.7.3' // postgresql jdbc driver required during runtime + runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.16.1' // I/O functionalities implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress From e2c8564a509d986969f02ecde1796593b9c9642e Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 23 Aug 2024 12:50:01 +0200 Subject: [PATCH 093/310] Adding more bdew standard load profiles. --- .../io/csv/CsvLoadProfileMetaInformation.java | 56 ++++++ .../timeseries/BDEWLoadProfileFactory.java | 126 ++++++++++++ .../factory/timeseries/LoadProfileData.java | 16 ++ .../timeseries/LoadProfileFactory.java | 25 +++ .../EntityPersistenceNamingStrategy.java | 6 +- .../io/naming/FileNamingStrategy.java | 11 +- .../io/source/LoadProfileSource.java | 182 ++++++++---------- .../io/source/csv/CsvDataSource.java | 55 ++++-- .../io/source/csv/CsvLoadProfileSource.java | 105 ++++++++++ .../io/source/csv/CsvTimeSeriesSource.java | 2 +- .../java/edu/ie3/datamodel/models/Season.java | 82 ++++++++ .../models/profile/LoadProfileKey.java | 104 ---------- .../repetitive/BDEWLoadProfileEntry.java | 10 +- .../repetitive/BDEWLoadProfileInput.java | 87 --------- .../repetitive/BDEWLoadProfileTimeSeries.java | 80 ++++++++ .../repetitive/LoadProfileEntry.java | 2 +- .../repetitive/LoadProfileInput.java | 60 ++---- .../repetitive/LoadProfileTimeSeries.java | 88 +++++++++ .../repetitive/RepetitiveTimeSeries.java | 13 +- ...0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv | 97 ++++++++++ ...1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv | 97 ++++++++++ ...2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv | 97 ++++++++++ ...3_9b880468-309c-43c1-a3f4-26dd26266216.csv | 97 ++++++++++ ...4_b7682f84-d317-4f7d-a888-0a9502abd763.csv | 97 ++++++++++ ...5_ec51ae43-3849-4f14-8330-b2eea9414101.csv | 97 ++++++++++ ...6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv | 97 ++++++++++ ...0_de021c4d-bb57-4310-8f21-298e6af8b245.csv | 97 ++++++++++ ...0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv | 97 ++++++++++ ...1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv | 97 ++++++++++ ...2_9029deec-5f70-4647-96db-086f463d0e0d.csv | 97 ++++++++++ .../resources/load/standard_load_profiles.csv | 97 ---------- 31 files changed, 1803 insertions(+), 471 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java create mode 100644 src/main/java/edu/ie3/datamodel/models/Season.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java create mode 100644 src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv create mode 100644 src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv create mode 100644 src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv create mode 100644 src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv create mode 100644 src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv create mode 100644 src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv create mode 100644 src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv create mode 100644 src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv create mode 100644 src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv create mode 100644 src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv create mode 100644 src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv delete mode 100644 src/main/resources/load/standard_load_profiles.csv diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java new file mode 100644 index 000000000..8db0ef7fe --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java @@ -0,0 +1,56 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.csv; + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import java.nio.file.Path; +import java.util.Objects; +import java.util.UUID; + +public class CsvLoadProfileMetaInformation extends LoadProfileTimeSeriesMetaInformation { + private final Path fullFilePath; + + public CsvLoadProfileMetaInformation(UUID uuid, String profile, Path fullFilePath) { + super(uuid, profile); + this.fullFilePath = fullFilePath; + } + + public CsvLoadProfileMetaInformation( + LoadProfileTimeSeriesMetaInformation metaInformation, Path fullFilePath) { + this(metaInformation.getUuid(), metaInformation.getProfile(), fullFilePath); + } + + public Path getFullFilePath() { + return fullFilePath; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CsvLoadProfileMetaInformation that)) return false; + if (!super.equals(o)) return false; + return fullFilePath.equals(that.fullFilePath); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), fullFilePath); + } + + @Override + public String toString() { + return "CsvLoadProfileMetaInformation{" + + "uuid='" + + getUuid() + + '\'' + + ", profile='" + + getProfile() + + '\'' + + "fullFilePath=" + + fullFilePath + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java new file mode 100644 index 000000000..8d767c8c3 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java @@ -0,0 +1,126 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static java.time.DayOfWeek.*; + +import edu.ie3.datamodel.models.Season; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.PValue; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public class BDEWLoadProfileFactory + extends LoadProfileFactory { + public static final String SUMMER_WEEKDAY = "SuWd"; + public static final String SUMMER_SATURDAY = "SuSa"; + public static final String SUMMER_SUNDAY = "SuSu"; + public static final String WINTER_WEEKDAY = "WiWd"; + public static final String WINTER_SATURDAY = "WiSa"; + public static final String WINTER_SUNDAY = "WiSu"; + public static final String TRANSITION_WEEKDAY = "TrWd"; + public static final String TRANSITION_SATURDAY = "TrSa"; + public static final String TRANSITION_SUNDAY = "TrSu"; + + public BDEWLoadProfileFactory(Class valueClass) { + super(valueClass); + } + + @Override + protected List buildModel(LoadProfileData data) { + List entries = new ArrayList<>(); + int quarterHour = data.getInt(QUARTER_HOUR); + + /* summer */ + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(SUMMER_WEEKDAY, KILOWATT)), + Season.SUMMER, + MONDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(SUMMER_SATURDAY, KILOWATT)), + Season.SUMMER, + SATURDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(SUMMER_SUNDAY, KILOWATT)), + Season.SUMMER, + SUNDAY, + quarterHour)); + + /* winter */ + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(WINTER_WEEKDAY, KILOWATT)), + Season.WINTER, + MONDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(WINTER_SATURDAY, KILOWATT)), + Season.WINTER, + SATURDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(WINTER_SUNDAY, KILOWATT)), + Season.WINTER, + SUNDAY, + quarterHour)); + + /* transition */ + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(TRANSITION_WEEKDAY, KILOWATT)), + Season.TRANSITION, + MONDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(TRANSITION_SATURDAY, KILOWATT)), + Season.TRANSITION, + SATURDAY, + quarterHour)); + entries.add( + new BDEWLoadProfileEntry( + new PValue(data.getQuantity(TRANSITION_SUNDAY, KILOWATT)), + Season.TRANSITION, + SUNDAY, + quarterHour)); + + return entries; + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + SUMMER_WEEKDAY, + SUMMER_SATURDAY, + SUMMER_SUNDAY, + WINTER_WEEKDAY, + WINTER_SATURDAY, + WINTER_SUNDAY, + TRANSITION_WEEKDAY, + TRANSITION_SATURDAY, + TRANSITION_SUNDAY)); + } + + @Override + public LoadProfileTimeSeries build( + UUID uuid, BdewStandardLoadProfile loadProfile, Set entries) { + return new BDEWLoadProfileTimeSeries(uuid, loadProfile, entries); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java new file mode 100644 index 000000000..5e6c0c904 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java @@ -0,0 +1,16 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.FactoryData; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import java.util.Map; + +public class LoadProfileData extends FactoryData { + public LoadProfileData(Map fieldsToAttributes, Class targetClass) { + super(fieldsToAttributes, targetClass); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java new file mode 100644 index 000000000..5b2a5e1ce --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -0,0 +1,25 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.Factory; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +public abstract class LoadProfileFactory

    + extends Factory, List> { + public static final String QUARTER_HOUR = "quarterHour"; + + public LoadProfileFactory(Class valueClass) { + super(valueClass); + } + + public abstract LoadProfileTimeSeries build(UUID uuid, P loadProfile, Set entries); +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 208fa0b81..a13ffdc03 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -17,7 +17,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.*; import edu.ie3.util.StringUtils; import java.util.Optional; @@ -383,12 +383,12 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { + } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileInput) { return Optional.of( prefix .concat("lpts") .concat("_") - .concat(loadProfileInput.getType().getKey()) + .concat(loadProfileInput.getLoadProfile().getKey()) .concat("_") .concat(loadProfileInput.getUuid().toString()) .concat(suffix)); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 8aadbc0be..84a18283e 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -7,11 +7,12 @@ import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.FileUtils; import java.nio.file.Path; @@ -180,7 +181,7 @@ public Pattern getIndividualTimeSeriesPattern() { * @return A load profile time series pattern */ public Pattern getLoadProfileTimeSeriesPattern() { - Optional subDirectory = fileHierarchy.getSubDirectory(LoadProfileInput.class); + Optional subDirectory = fileHierarchy.getSubDirectory(LoadProfileTimeSeries.class); if (subDirectory.isEmpty()) { return entityPersistenceNamingStrategy.getLoadProfileTimeSeriesPattern(); @@ -237,6 +238,12 @@ public IndividualTimeSeriesMetaInformation individualTimeSeriesMetaInformation(S removeFileNameEnding(fileName)); } + public LoadProfileTimeSeriesMetaInformation loadProfileTimeSeriesMetaInformation( + String fileName) { + return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation( + removeFileNameEnding(fileName)); + } + public static String removeFileNameEnding(String fileName) { return fileName.replaceAll("(?:\\.[^.\\\\/\\s]{1,255}){1,2}$", ""); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index dc0b1d790..c4c0b5312 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -5,123 +5,99 @@ */ package edu.ie3.datamodel.io.source; -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; - +import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.exceptions.ValidationException; -import edu.ie3.datamodel.io.connectors.CsvFileConnector; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; +import edu.ie3.datamodel.io.factory.timeseries.BDEWLoadProfileFactory; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; +import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.source.csv.CsvDataSource; +import edu.ie3.datamodel.io.source.csv.CsvLoadProfileSource; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.profile.LoadProfileKey; -import edu.ie3.datamodel.models.profile.LoadProfileKey.BDEWLoadProfileKey; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileInput; -import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.Try; -import java.io.BufferedReader; -import java.io.IOException; import java.nio.file.Path; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; -import tech.units.indriya.quantity.Quantities; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -public class LoadProfileSource extends EntitySource { +public abstract class LoadProfileSource

    + extends EntitySource { - private final Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); + protected final Class entryClass; + protected final LoadProfileFactory entryFactory; - @Override - public void validate() throws ValidationException { - /* Nothing to do here */ + protected LoadProfileSource(Class entryClass, LoadProfileFactory entryFactory) { + this.entryClass = entryClass; + this.entryFactory = entryFactory; } - public Map getBDEWLoadProfiles() - throws SourceException { - CsvFileConnector connector = new CsvFileConnector(bdewLoadProfilePath); - - try (BufferedReader reader = connector.initReader(Path.of("standard_load_profiles"))) { - return parseBDEWStandardProfiles(reader); - } catch (IOException | ParsingException e) { - throw new SourceException("The bdew standard load profiles could not be loaded!", e); - } + /** + * Build a list of type {@code E}, whereas the underlying {@link Value} does not need any + * additional information. + * + * @param fieldToValues Mapping from field id to values + * @return {@link Try} of simple time based value + */ + protected Try, FactoryException> createEntries(Map fieldToValues) { + LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); + return entryFactory.get(factoryData); } - protected Map parseBDEWStandardProfiles( - BufferedReader reader) throws IOException, ParsingException, SourceException { - - Map>> dataMap = - readLoadProfile( - reader, - ",", - str -> Try.of(() -> LoadProfileKey.parseBDEWProfile(str), ParsingException.class)); - - return Arrays.stream(BdewStandardLoadProfile.values()) - .map( - profile -> { - Set entries = - dataMap.keySet().stream() - .filter(e -> e.profile() == profile) - .map(dataMap::get) - .flatMap(Collection::stream) - .map( - d -> - new BDEWLoadProfileEntry( - d.value, - d.profileKey.season(), - d.profileKey.dayOfWeek(), - d.quarterHour)) - .collect(Collectors.toSet()); - - return Map.entry(profile, new BDEWLoadProfileInput(profile, entries)); - }) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - private Map>> readLoadProfile( - BufferedReader reader, String csvSep, Function> keyExtractor) - throws IOException, SourceException, ParsingException { - List headline = Arrays.asList(reader.readLine().split(csvSep)); - - int quarterHourColumn = headline.indexOf("quarterHour"); - - if (quarterHourColumn < 0) { - throw new SourceException("There is no column for quarter hour values."); - } - - Map profileKeys = new HashMap<>(); - - for (int i = 0; i < headline.size(); i++) { - if (i != quarterHourColumn) { - profileKeys.put(i, keyExtractor.apply(headline.get(i)).getOrThrow()); + public abstract LoadProfileTimeSeries getTimeSeries(); + + /** + * Method to return all time keys after a given timestamp. + * + * @param time given time + * @return a list of time keys + */ + public abstract List getTimeKeysAfter(ZonedDateTime time); + + /** + * Method to read in the build-in {@link BdewStandardLoadProfile}s. + * + * @return a map: load profile to time series + * @throws SourceException if an exception occurred + */ + public static Map + readBDEWStandardLoadProfiles() throws SourceException { + Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); + CsvDataSource dataSource = + new CsvDataSource(",", bdewLoadProfilePath, new FileNamingStrategy()); + + BdewStandardLoadProfile[] implemented = BdewStandardLoadProfile.values(); + Map loadProfileInputs = new HashMap<>(); + + try { + for (CsvLoadProfileMetaInformation metaInformation : + dataSource.getCsvLoadProfileMetaInformation(implemented).values()) { + BdewStandardLoadProfile profile = BdewStandardLoadProfile.get(metaInformation.getProfile()); + + Class entryClass = BDEWLoadProfileEntry.class; + + CsvLoadProfileSource source = + new CsvLoadProfileSource<>( + dataSource, + metaInformation, + entryClass, + profile, + new BDEWLoadProfileFactory(entryClass)); + + loadProfileInputs.put(profile, (BDEWLoadProfileTimeSeries) source.getTimeSeries()); } - } - return reader - .lines() - .map( - csvRow -> { - List elements = Arrays.asList(csvRow.split(csvSep)); - int quarterHour = Integer.parseInt(elements.get(quarterHourColumn)); - - List> loadProfileToValue = new ArrayList<>(); - - for (int i = 0; i < elements.size(); i++) { - if (i != quarterHourColumn) { - loadProfileToValue.add( - new LoadProfileData<>( - profileKeys.get(i), - quarterHour, - new PValue( - Quantities.getQuantity( - Double.parseDouble(elements.get(i)), KILOWATT)))); - } - } - return loadProfileToValue; - }) - .flatMap(Collection::stream) - .collect(Collectors.groupingBy(LoadProfileData::profileKey)); + return loadProfileInputs; + } catch (ParsingException e) { + throw new SourceException("Unable to read standard load profiles due to: ", e); + } } - - public record LoadProfileData( - T profileKey, int quarterHour, PValue value) {} } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 3232f2a24..ef77cbf69 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -8,12 +8,15 @@ import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.connectors.CsvFileConnector; import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.DataSource; import edu.ie3.datamodel.models.Entity; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; import edu.ie3.datamodel.utils.Try.Success; @@ -25,6 +28,7 @@ import java.nio.file.Path; import java.util.*; import java.util.function.Function; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -102,7 +106,8 @@ public FileNamingStrategy getNamingStrategy() { */ public Map getCsvIndividualTimeSeriesMetaInformation(final ColumnScheme... columnSchemes) { - return getIndividualTimeSeriesFilePaths().parallelStream() + return getTimeSeriesFilePaths(fileNamingStrategy.getIndividualTimeSeriesPattern()) + .parallelStream() .map( filePath -> { /* Extract meta information from file path and enhance it with the file path itself */ @@ -120,13 +125,41 @@ public FileNamingStrategy getNamingStrategy() { .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, Function.identity())); } + /** + * Receive the information for specific load profile time series. They are given back mapped to + * their uuid. + * + * @return A mapping from uuid to the load profile time series meta information + */ + public Map getCsvLoadProfileMetaInformation( + LoadProfile... profiles) { + return getTimeSeriesFilePaths(fileNamingStrategy.getLoadProfileTimeSeriesPattern()) + .parallelStream() + .map( + filePath -> { + /* Extract meta information from file path and enhance it with the file path itself */ + LoadProfileTimeSeriesMetaInformation metaInformation = + fileNamingStrategy.loadProfileTimeSeriesMetaInformation(filePath.toString()); + return new CsvLoadProfileMetaInformation( + metaInformation, FileNamingStrategy.removeFileNameEnding(filePath.getFileName())); + }) + .filter( + metaInformation -> + profiles == null + || profiles.length == 0 + || Stream.of(profiles) + .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) + .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, Function.identity())); + } + /** * Returns a set of relative paths strings to time series files, with respect to the base folder * path * + * @param pattern for matching the time series * @return A set of relative paths to time series files, with respect to the base folder path */ - protected Set getIndividualTimeSeriesFilePaths() { + protected Set getTimeSeriesFilePaths(Pattern pattern) { Path baseDirectory = connector.getBaseDirectory(); try (Stream pathStream = Files.walk(baseDirectory)) { return pathStream @@ -135,10 +168,7 @@ protected Set getIndividualTimeSeriesFilePaths() { path -> { Path withoutEnding = Path.of(FileNamingStrategy.removeFileNameEnding(path.toString())); - return fileNamingStrategy - .getIndividualTimeSeriesPattern() - .matcher(withoutEnding.toString()) - .matches(); + return pattern.matcher(withoutEnding.toString()).matches(); }) .collect(Collectors.toSet()); } catch (IOException e) { @@ -228,8 +258,7 @@ protected String[] parseCsvRow(String csvRow, String csvSep) { protected Try>, SourceException> buildStreamWithFieldsToAttributesMap( Class entityClass, boolean allowFileNotExisting) { return getFilePath(entityClass) - .flatMap( - path -> buildStreamWithFieldsToAttributesMap(entityClass, path, allowFileNotExisting)); + .flatMap(path -> buildStreamWithFieldsToAttributesMap(path, allowFileNotExisting)); } /** @@ -237,14 +266,12 @@ protected Try>, SourceException> buildStreamWithField * of (fieldName to fieldValue) mapping where each map represents one row of the .csv file. Since * the returning stream is a parallel stream, the order of the elements cannot be guaranteed. * - * @param entityClass the entity class that should be build * @param filePath the path of the file to read * @return a try containing either a parallel stream of maps, where each map represents one row of * the csv file with the mapping (fieldName to fieldValue) or an exception */ - protected - Try>, SourceException> buildStreamWithFieldsToAttributesMap( - Class entityClass, Path filePath, boolean allowFileNotExisting) { + protected Try>, SourceException> buildStreamWithFieldsToAttributesMap( + Path filePath, boolean allowFileNotExisting) { try (BufferedReader reader = connector.initReader(filePath)) { final String[] headline = parseCsvRow(reader.readLine(), csvSep); @@ -261,9 +288,7 @@ Try>, SourceException> buildStreamWithFieldsToAttribu return Failure.of(new SourceException("Unable to find file '" + filePath + "'.", e)); } } catch (IOException e) { - return Failure.of( - new SourceException( - "Cannot read file to build entity '" + entityClass.getSimpleName() + "'", e)); + return Failure.of(new SourceException("Cannot read file '" + filePath + "'.", e)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java new file mode 100644 index 000000000..9ef9ff656 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -0,0 +1,105 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.source.csv; + +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; +import edu.ie3.datamodel.io.source.LoadProfileSource; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.utils.Try; +import java.nio.file.Path; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Source that is capable of providing information around load profile time series from csv files. + */ +public class CsvLoadProfileSource

    + extends LoadProfileSource { + private final LoadProfileTimeSeries loadProfileTimeSeries; + private final CsvDataSource dataSource; + private final Path filePath; + + public CsvLoadProfileSource( + CsvDataSource source, + CsvLoadProfileMetaInformation metaInformation, + Class entryClass, + P loadProfile, + LoadProfileFactory entryFactory) { + super(entryClass, entryFactory); + this.dataSource = source; + this.filePath = metaInformation.getFullFilePath(); + + /* Read in the full time series */ + try { + this.loadProfileTimeSeries = + buildLoadProfileTimeSeries( + metaInformation.getUuid(), filePath, loadProfile, this::createEntries); + } catch (SourceException e) { + throw new IllegalArgumentException( + "Unable to obtain time series with UUID '" + + metaInformation.getUuid() + + "'. Please check arguments!", + e); + } + } + + @Override + public void validate() throws ValidationException { + validate(entryClass, () -> dataSource.getSourceFields(filePath), entryFactory); + } + + @Override + public LoadProfileTimeSeries getTimeSeries() { + return loadProfileTimeSeries; + } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + return loadProfileTimeSeries.getTimeKeysAfter(time); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Attempts to read a load profile time series with given unique identifier and file path. Single + * entries are obtained entries with the help of {@code fieldToValueFunction}. If the file does + * not exist, an empty Stream is returned. + * + * @param timeSeriesUuid unique identifier of the time series + * @param filePath path to the file to read + * @param fieldToValueFunction function, that is able to transfer a mapping (from field to value) + * onto a specific instance of the targeted entry class + * @throws SourceException If the file cannot be read properly + * @return an individual time series + */ + protected LoadProfileTimeSeries buildLoadProfileTimeSeries( + UUID timeSeriesUuid, + Path filePath, + P loadProfile, + Function, Try, FactoryException>> fieldToValueFunction) + throws SourceException { + Set entries = + dataSource + .buildStreamWithFieldsToAttributesMap(filePath, false) + .flatMap( + stream -> + Try.scanStream(stream.map(fieldToValueFunction), "LoadProfileEntry") + .transformF(SourceException::new)) + .getOrThrow() + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + return entryFactory.build(timeSeriesUuid, loadProfile, entries); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 1bbab427a..8a8b5e341 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -154,7 +154,7 @@ protected IndividualTimeSeries buildIndividualTimeSeries( throws SourceException { Try>, SourceException> timeBasedValues = dataSource - .buildStreamWithFieldsToAttributesMap(TimeBasedValue.class, filePath, false) + .buildStreamWithFieldsToAttributesMap(filePath, false) .flatMap( stream -> Try.scanStream(stream.map(fieldToValueFunction), "TimeBasedValue") diff --git a/src/main/java/edu/ie3/datamodel/models/Season.java b/src/main/java/edu/ie3/datamodel/models/Season.java new file mode 100644 index 000000000..286dcf6af --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/Season.java @@ -0,0 +1,82 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models; + +import edu.ie3.datamodel.exceptions.ParsingException; +import java.time.ZonedDateTime; + +public enum Season { + WINTER("Wi"), + SUMMER("Su"), + TRANSITION("Tr"); + + private final String key; + + Season(String key) { + this.key = key.toLowerCase(); + } + + public static Season parse(String key) throws ParsingException { + return switch (key) { + case "Wi" -> WINTER; + case "Su" -> SUMMER; + case "Tr" -> TRANSITION; + default -> throw new ParsingException("There is no season for key:" + key); + }; + } + + /** + * Creates a season from given time + * + * @param time the time + * @return a season + */ + public static Season get(ZonedDateTime time) { + int day = time.getDayOfMonth(); + + // winter: 1.11.-20.03. + // summer: 15.05.-14.09. + // transition: 21.03.-14.05. and + // 15.09.-31.10. + // (VDEW handbook) + + return switch (time.getMonth()) { + case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; + case MARCH -> { + if (day <= 20) { + yield WINTER; + } else { + yield TRANSITION; + } + } + case MAY -> { + if (day >= 15) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + case JUNE, JULY, AUGUST -> SUMMER; + case SEPTEMBER -> { + if (day <= 14) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + default -> TRANSITION; + }; + } + + public String getKey() { + return key; + } + + @Override + public String toString() { + return "Season{" + "key='" + key + '\'' + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java deleted file mode 100644 index b11157eca..000000000 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfileKey.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.profile; - -import edu.ie3.datamodel.exceptions.ParsingException; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; - -public interface LoadProfileKey { - - static BDEWLoadProfileKey parseBDEWProfile(String key) throws ParsingException { - String profile = key.substring(0, 2); - String season = key.substring(2, 4); - String dayString = key.substring(4, 6); - - DayOfWeek day = - switch (dayString) { - case "Sa" -> DayOfWeek.SATURDAY; - case "Su" -> DayOfWeek.SUNDAY; - default -> DayOfWeek.MONDAY; - }; - - return new BDEWLoadProfileKey(BdewStandardLoadProfile.get(profile), Season.parse(season), day); - } - - record BDEWLoadProfileKey(LoadProfile profile, Season season, DayOfWeek dayOfWeek) - implements LoadProfileKey {} - - enum Season { - WINTER("Wi"), - SUMMER("Su"), - TRANSITION("Tr"); - - private final String key; - - Season(String key) { - this.key = key.toLowerCase(); - } - - public static Season parse(String key) throws ParsingException { - return switch (key) { - case "Wi" -> WINTER; - case "Su" -> SUMMER; - case "Tr" -> TRANSITION; - default -> throw new ParsingException("There is no season for key:" + key); - }; - } - - /** - * Creates a season from given time - * - * @param time the time - * @return a season - */ - public static Season get(ZonedDateTime time) { - int day = time.getDayOfMonth(); - - // winter: 1.11.-20.03. - // summer: 15.05.-14.09. - // transition: 21.03.-14.05. and - // 15.09.-31.10. - // (VDEW handbook) - - return switch (time.getMonth()) { - case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; - case MARCH -> { - if (day <= 20) { - yield WINTER; - } else { - yield TRANSITION; - } - } - case MAY -> { - if (day >= 15) { - yield SUMMER; - } else { - yield TRANSITION; - } - } - case JUNE, JULY, AUGUST -> SUMMER; - case SEPTEMBER -> { - if (day <= 14) { - yield SUMMER; - } else { - yield TRANSITION; - } - } - default -> TRANSITION; - }; - } - - public String getKey() { - return key; - } - - @Override - public String toString() { - return "Season{" + "key='" + key + '\'' + '}'; - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java index 556323071..049c30e97 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java @@ -5,22 +5,22 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import edu.ie3.datamodel.models.profile.LoadProfileKey; +import edu.ie3.datamodel.models.Season; import edu.ie3.datamodel.models.value.PValue; import java.time.DayOfWeek; import java.util.Objects; -/** Unique entry to a {@link BDEWLoadProfileInput} */ +/** Unique entry to a {@link BDEWLoadProfileTimeSeries} */ public class BDEWLoadProfileEntry extends LoadProfileEntry { - private final LoadProfileKey.Season season; + private final Season season; public BDEWLoadProfileEntry( - PValue value, LoadProfileKey.Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { + PValue value, Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { super(value, dayOfWeek, quarterHourOfDay); this.season = season; } - public LoadProfileKey.Season getSeason() { + public Season getSeason() { return season; } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java deleted file mode 100644 index fc2c170f5..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileInput.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.profile.LoadProfileKey; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -public class BDEWLoadProfileInput extends RepetitiveTimeSeries { - private final BdewStandardLoadProfile loadProfile; - private final Map> valueMapping; - - public BDEWLoadProfileInput( - BdewStandardLoadProfile loadProfile, Set values) { - super(UUID.randomUUID(), values); - this.loadProfile = loadProfile; - - this.valueMapping = - values.stream() - .collect( - Collectors.groupingBy( - e -> new Key(e.getSeason(), e.getDayOfWeek()), - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); - } - - @Override - public PValue calc(ZonedDateTime time) { - Key key = fromTime(time); - int quarterHour = time.getHour() * 4 + time.getMinute() / 15; - - return valueMapping.get(key).get(quarterHour); - } - - public BdewStandardLoadProfile getLoadProfile() { - return loadProfile; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - BDEWLoadProfileInput that = (BDEWLoadProfileInput) o; - return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), loadProfile, valueMapping); - } - - @Override - public String toString() { - return "BDEWLoadProfileInput{" - + "loadProfile=" - + loadProfile - + ", valueMapping=" - + valueMapping - + '}'; - } - - private Key fromTime(ZonedDateTime time) { - LoadProfileKey.Season season = LoadProfileKey.Season.get(time); - - DayOfWeek day = - switch (time.getDayOfWeek()) { - case SATURDAY -> DayOfWeek.SATURDAY; - case SUNDAY -> DayOfWeek.SUNDAY; - default -> DayOfWeek.MONDAY; - }; - - return new Key(season, day); - } - - private record Key(LoadProfileKey.Season season, DayOfWeek dayOfWeek) {} -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java new file mode 100644 index 000000000..6df6a92f0 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java @@ -0,0 +1,80 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.Season; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +/** + * Describes a bdew load profile time series with repetitive values that can be calculated from a + * pattern + */ +public class BDEWLoadProfileTimeSeries extends LoadProfileTimeSeries { + + public BDEWLoadProfileTimeSeries( + UUID uuid, BdewStandardLoadProfile loadProfile, Set values) { + super(uuid, values, loadProfile, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); + } + + @Override + public PValue calc(ZonedDateTime time) { + if (getLoadProfile() == BdewStandardLoadProfile.H0) { + PValue value = super.calc(time); + + // TODO: Add factor calculation + + return value; + } else { + return super.calc(time); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "BDEWLoadProfileInput{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } + + @Override + protected LoadProfileKey fromTime(ZonedDateTime time) { + Season season = Season.get(time); + + DayOfWeek day = + switch (time.getDayOfWeek()) { + case SATURDAY -> DayOfWeek.SATURDAY; + case SUNDAY -> DayOfWeek.SUNDAY; + default -> DayOfWeek.MONDAY; + }; + + return new BdewKey(season, day); + } + + private record BdewKey(Season season, DayOfWeek dayOfWeek) implements LoadProfileKey {} +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java index 2e0359967..29a62684c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java @@ -10,7 +10,7 @@ import java.time.DayOfWeek; import java.util.Objects; -/** Unique entry to a {@link LoadProfileInput} */ +/** Unique entry to a {@link LoadProfileTimeSeries} */ public class LoadProfileEntry extends TimeSeriesEntry { private final DayOfWeek dayOfWeek; private final int quarterHourOfDay; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java index 43f228967..e08f69195 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java @@ -6,30 +6,17 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.profile.StandardLoadProfile; -import edu.ie3.datamodel.models.value.PValue; import java.time.DayOfWeek; import java.time.ZonedDateTime; -import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; // TODO This is a sample implementation, please implement a real scenario -public class LoadProfileInput extends RepetitiveTimeSeries { - private final StandardLoadProfile type; - private final Map> dayOfWeekToHourlyValues; - +@Deprecated +public class LoadProfileInput extends LoadProfileTimeSeries { public LoadProfileInput(UUID uuid, StandardLoadProfile type, Set values) { - super(uuid, values); - this.type = type; - this.dayOfWeekToHourlyValues = - getEntries().stream() - .collect( - Collectors.groupingBy( - LoadProfileEntry::getDayOfWeek, - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + super(uuid, values, type, e -> new Key(e.getDayOfWeek())); } public LoadProfileInput(StandardLoadProfile type, Set values) { @@ -37,54 +24,33 @@ public LoadProfileInput(StandardLoadProfile type, Set values) } @Override - public PValue calc(ZonedDateTime time) { - // dummy value - return dayOfWeekToHourlyValues.get(time.getDayOfWeek()).get(time.getHour()); - } - - @Override - protected Optional getPreviousDateTime(ZonedDateTime time) { - // dummy value - return Optional.of(time.minusHours(1)); - } - - @Override - protected Optional getNextDateTime(ZonedDateTime time) { - // dummy value - return Optional.of(time.plusHours(1)); - } - - @Override - public List getTimeKeysAfter(ZonedDateTime time) { - // dummy value - return List.of(time.plusHours(1)); - } - - public StandardLoadProfile getType() { - return type; + protected LoadProfileKey fromTime(ZonedDateTime time) { + return new Key(time.getDayOfWeek()); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - LoadProfileInput that = (LoadProfileInput) o; - return type.equals(that.type) && dayOfWeekToHourlyValues.equals(that.dayOfWeekToHourlyValues); + return super.equals(o); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), type, dayOfWeekToHourlyValues); + return Objects.hash(super.hashCode()); } @Override public String toString() { return "LoadProfileInput{" + + "uuid=" + + getUuid() + "type=" - + type + + getLoadProfile() + ", dayOfWeekToHourlyValues=" - + dayOfWeekToHourlyValues + + getValueMapping() + '}'; } + + private record Key(DayOfWeek dayOfWeek) implements LoadProfileKey {} } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java new file mode 100644 index 000000000..d6344fd0b --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -0,0 +1,88 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Describes a load profile time series with repetitive values that can be calculated from a pattern + */ +public abstract class LoadProfileTimeSeries + extends RepetitiveTimeSeries { + private final LoadProfile loadProfile; + private final Map> valueMapping; + + public LoadProfileTimeSeries( + UUID uuid, Set entries, LoadProfile loadProfile, Function extractor) { + super(uuid, entries); + this.loadProfile = loadProfile; + + this.valueMapping = + entries.stream() + .collect( + Collectors.groupingBy( + extractor, + Collectors.toMap( + LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + } + + /** Returns the {@link LoadProfile}. */ + public LoadProfile getLoadProfile() { + return loadProfile; + } + + /** Returns the value mapping. */ + protected Map> getValueMapping() { + return valueMapping; + } + + @Override + protected PValue calc(ZonedDateTime time) { + LoadProfileKey key = fromTime(time); + int quarterHour = time.getHour() * 4 + time.getMinute() / 15; + + return valueMapping.get(key).get(quarterHour); + } + + protected abstract LoadProfileKey fromTime(ZonedDateTime time); + + public interface LoadProfileKey {} + + @Override + @SuppressWarnings("unchecked") + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; + return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "LoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index c488098ab..3a5c01209 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -9,16 +9,11 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import java.time.ZonedDateTime; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; /** Describes a TimeSeries with repetitive values that can be calculated from a pattern */ public abstract class RepetitiveTimeSeries, V extends Value> extends TimeSeries { - protected RepetitiveTimeSeries(Set entries) { - super(entries); - } protected RepetitiveTimeSeries(UUID uuid, Set entries) { super(uuid, entries); @@ -46,4 +41,10 @@ protected Optional getPreviousDateTime(ZonedDateTime time) { protected Optional getNextDateTime(ZonedDateTime time) { return Optional.of(time.plusHours(1)); } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + // dummy value + return getNextDateTime(time).map(List::of).orElseGet(Collections::emptyList); + } } diff --git a/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv b/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv new file mode 100644 index 000000000..386b6012c --- /dev/null +++ b/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,0 +76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,1 +77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,2 +78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,3 +77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,4 +76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,5 +74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,6 +71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,7 +70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,8 +68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,9 +67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,10 +67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,11 +66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,12 +66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,13 +66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,14 +67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,15 +68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,16 +69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,17 +70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,18 +71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,19 +71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,20 +72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,21 +72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,22 +72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,23 +73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,24 +73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,25 +77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,26 +83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,27 +93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,28 +106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,29 +120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,30 +134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,31 +147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,32 +157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,33 +166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,34 +171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,35 +175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,36 +176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,37 +176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,38 +176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,39 +177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,40 +179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,41 +181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,42 +183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,43 +184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,44 +185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,45 +185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,46 +185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,47 +184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,48 +182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,49 +179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,50 +175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,51 +170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,52 +163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,53 +154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,54 +144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,55 +133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,56 +122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,57 +112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,58 +102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,59 +95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,60 +90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,61 +86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,62 +83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,63 +80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,64 +77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,65 +75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,66 +74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,67 +74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,68 +74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,69 +75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,70 +76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,71 +77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,72 +78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,73 +79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,74 +79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,75 +79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,76 +79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,77 +79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,78 +80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,79 +81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,80 +83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,81 +85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,82 +86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,83 +87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,84 +86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,85 +84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,86 +83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,87 +81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,88 +79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,89 +77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,90 +75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,91 +74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,92 +72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,93 +71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,94 +70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,95 diff --git a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv new file mode 100644 index 000000000..4348e6322 --- /dev/null +++ b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,1 +22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,2 +21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,3 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,4 +20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,5 +20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,6 +20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,7 +20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,8 +20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,9 +20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,10 +20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,11 +20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,12 +20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,13 +20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,14 +20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,15 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,16 +20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,17 +20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,18 +20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,19 +20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,20 +21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,21 +21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,22 +22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,23 +22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,24 +23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,25 +23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,26 +24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,27 +24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,28 +24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,29 +25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,30 +25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,31 +26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,32 +27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,33 +29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,34 +31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,35 +34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,36 +37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,37 +40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,38 +43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,39 +45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,40 +47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,41 +48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,42 +49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,43 +49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,44 +49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,45 +48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,46 +47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,47 +45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,48 +42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,49 +39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,50 +36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,51 +34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,52 +31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,53 +30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,54 +29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,55 +28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,56 +27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,57 +27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,58 +27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,59 +26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,60 +25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,61 +25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,62 +24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,63 +24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,64 +24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,65 +24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,66 +24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,67 +24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,68 +24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,69 +23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,70 +22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,71 +22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,72 +23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,73 +23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,74 +24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,75 +24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,76 +24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,77 +24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,78 +23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,79 +22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,80 +22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,81 +22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,82 +22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,83 +22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,84 +23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,85 +23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,86 +24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,87 +24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,88 +24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,89 +23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,90 +23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,91 +22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,92 +22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,93 +22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,94 +22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,95 +22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,96 diff --git a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv new file mode 100644 index 000000000..ef76980b7 --- /dev/null +++ b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,1 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,2 +53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,3 +48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,4 +43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,5 +38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,6 +33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,7 +29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,8 +27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,9 +26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,10 +26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,11 +26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,12 +26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,13 +25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,14 +25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,15 +24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,16 +23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,17 +23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,18 +23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,19 +24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,20 +26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,21 +29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,22 +33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,23 +38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,24 +43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,25 +48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,26 +51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,27 +52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,28 +51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,29 +48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,30 +45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,31 +45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,32 +48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,33 +54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,34 +62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,35 +72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,36 +82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,37 +93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,38 +102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,39 +111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,40 +118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,41 +124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,42 +128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,43 +131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,44 +132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,45 +133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,46 +133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,47 +133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,48 +132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,49 +131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,50 +131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,51 +131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,52 +131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,53 +131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,54 +131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,55 +132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,56 +132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,57 +132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,58 +132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,59 +133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,60 +134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,61 +135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,62 +137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,63 +139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,64 +141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,65 +144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,66 +146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,67 +149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,68 +153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,69 +157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,70 +160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,71 +163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,72 +164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,73 +163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,74 +162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,75 +160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,76 +158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,77 +156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,78 +154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,79 +153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,80 +152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,81 +152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,82 +150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,83 +148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,84 +144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,85 +139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,86 +131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,87 +122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,88 +110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,89 +98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,90 +85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,91 +75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,92 +67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,93 +61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,94 +57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,95 +53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,96 diff --git a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv new file mode 100644 index 000000000..9d45a55a3 --- /dev/null +++ b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,1 +100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,2 +100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,3 +101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,4 +99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,5 +97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,6 +95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,7 +94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,8 +94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,9 +94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,10 +94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,11 +95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,12 +94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,13 +93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,14 +91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,15 +90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,16 +90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,17 +90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,18 +90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,19 +89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,20 +88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,21 +87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,22 +86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,23 +88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,24 +92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,25 +97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,26 +102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,27 +105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,28 +105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,29 +104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,30 +104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,31 +107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,32 +115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,33 +125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,34 +134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,35 +142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,36 +144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,37 +144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,38 +141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,39 +139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,40 +139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,41 +140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,42 +141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,43 +142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,44 +143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,45 +143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,46 +143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,47 +143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,48 +144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,49 +145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,50 +145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,51 +143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,52 +141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,53 +137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,54 +133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,55 +128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,56 +123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,57 +118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,58 +114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,59 +111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,60 +110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,61 +110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,62 +110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,63 +111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,64 +111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,65 +111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,66 +112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,67 +112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,68 +113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,69 +113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,70 +114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,71 +113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,72 +112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,73 +110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,74 +109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,75 +109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,76 +112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,77 +116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,78 +120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,79 +122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,80 +123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,81 +121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,82 +118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,83 +114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,84 +111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,85 +108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,86 +106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,87 +104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,88 +103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,89 +102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,90 +101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,91 +99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,92 +98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,93 +96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,94 +95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,95 +94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,96 diff --git a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv new file mode 100644 index 000000000..b7f7de240 --- /dev/null +++ b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,1 +75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,2 +75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,3 +75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,4 +74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,5 +73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,6 +72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,7 +71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,8 +70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,9 +69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,10 +69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,11 +69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,12 +69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,13 +68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,14 +68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,15 +68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,16 +68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,17 +68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,18 +68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,19 +68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,20 +68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,21 +68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,22 +68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,23 +67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,24 +66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,25 +67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,26 +71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,27 +81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,28 +96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,29 +115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,30 +135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,31 +153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,32 +165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,33 +174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,34 +180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,35 +184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,36 +187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,37 +190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,38 +192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,39 +194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,40 +196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,41 +197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,42 +198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,43 +199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,44 +200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,45 +201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,46 +202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,47 +203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,48 +204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,49 +205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,50 +205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,51 +202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,52 +197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,53 +188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,54 +177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,55 +163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,56 +147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,57 +131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,58 +115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,59 +102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,60 +94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,61 +89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,62 +86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,63 +85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,64 +84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,65 +83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,66 +82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,67 +81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,68 +79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,69 +77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,70 +76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,71 +76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,72 +77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,73 +78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,74 +80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,75 +81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,76 +80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,77 +80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,78 +80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,79 +81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,80 +83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,81 +86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,82 +89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,83 +90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,84 +90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,85 +87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,86 +84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,87 +81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,88 +78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,89 +77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,90 +75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,91 +74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,92 +73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,93 +71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,94 +70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,95 +69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,96 diff --git a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv new file mode 100644 index 000000000..56ce37f83 --- /dev/null +++ b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,1 +118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,2 +145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,3 +168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,4 +182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,5 +188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,6 +189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,7 +187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,8 +184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,9 +182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,10 +181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,11 +182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,12 +186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,13 +192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,14 +199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,15 +206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,16 +212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,17 +217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,18 +221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,19 +224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,20 +228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,21 +231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,22 +234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,23 +235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,24 +236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,25 +235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,26 +234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,27 +233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,28 +232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,29 +230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,30 +225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,31 +217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,32 +204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,33 +189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,34 +173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,35 +158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,36 +146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,37 +137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,38 +131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,39 +128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,40 +126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,41 +125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,42 +125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,43 +124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,44 +124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,45 +123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,46 +122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,47 +122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,48 +124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,49 +125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,50 +125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,51 +122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,52 +116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,53 +106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,54 +96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,55 +86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,56 +79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,57 +75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,58 +73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,59 +73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,60 +75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,61 +77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,62 +79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,63 +80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,64 +80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,65 +78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,66 +76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,67 +74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,68 +72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,69 +71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,70 +69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,71 +67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,72 +65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,73 +62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,74 +59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,75 +58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,76 +58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,77 +58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,78 +59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,79 +59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,80 +59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,81 +57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,82 +56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,83 +54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,84 +52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,85 +51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,86 +49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,87 +48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,88 +47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,89 +47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,90 +47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,91 +47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,92 +48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,93 +48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,94 +49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,95 +49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,96 diff --git a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv new file mode 100644 index 000000000..a2d141656 --- /dev/null +++ b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,1 +59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,2 +59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,3 +58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,4 +57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,5 +54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,6 +51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,7 +48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,8 +46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,9 +45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,10 +44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,11 +43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,12 +43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,13 +43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,14 +42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,15 +41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,16 +40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,17 +39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,18 +38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,19 +38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,20 +38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,21 +38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,22 +39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,23 +40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,24 +41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,25 +42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,26 +43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,27 +46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,28 +49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,29 +53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,30 +57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,31 +61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,32 +64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,33 +67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,34 +70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,35 +73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,36 +78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,37 +84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,38 +91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,39 +100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,40 +110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,41 +120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,42 +129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,43 +137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,44 +142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,45 +145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,46 +147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,47 +147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,48 +147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,49 +146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,50 +145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,51 +144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,52 +143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,53 +142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,54 +142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,55 +144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,56 +148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,57 +154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,58 +160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,59 +167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,60 +173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,61 +179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,62 +183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,63 +184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,64 +184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,65 +182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,66 +179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,67 +179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,68 +180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,69 +183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,70 +189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,71 +196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,72 +204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,73 +213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,74 +221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,75 +228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,76 +233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,77 +236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,78 +237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,79 +236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,80 +234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,81 +231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,82 +226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,83 +220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,84 +213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,85 +206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,86 +197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,87 +187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,88 +175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,89 +163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,90 +150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,91 +137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,92 +125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,93 +113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,94 +102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,95 +93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,96 diff --git a/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv b/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv new file mode 100644 index 000000000..673ac0535 --- /dev/null +++ b/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,0 +84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,1 +80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,2 +76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,3 +71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,4 +66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,5 +61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,6 +57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,7 +54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,8 +52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,9 +51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,10 +50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,11 +50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,12 +50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,13 +49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,14 +49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,15 +50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,16 +50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,17 +50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,18 +50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,19 +50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,20 +50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,21 +51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,22 +53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,23 +56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,24 +60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,25 +65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,26 +72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,27 +80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,28 +88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,29 +97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,30 +106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,31 +115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,32 +124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,33 +132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,34 +140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,35 +147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,36 +154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,37 +158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,38 +162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,39 +164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,40 +164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,41 +165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,42 +165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,43 +167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,44 +169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,45 +172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,46 +175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,47 +179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,48 +181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,49 +183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,50 +183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,51 +182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,52 +178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,53 +174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,54 +169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,55 +163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,56 +158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,57 +154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,58 +151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,59 +149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,60 +148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,61 +148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,62 +147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,63 +146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,64 +145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,65 +144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,66 +144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,67 +144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,68 +146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,69 +150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,70 +154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,71 +158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,72 +164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,73 +169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,74 +174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,75 +177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,76 +180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,77 +181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,78 +181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,79 +179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,80 +175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,81 +171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,82 +165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,83 +160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,84 +155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,85 +151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,86 +149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,87 +148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88 +149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,89 +149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,90 +146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,91 +139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,92 +130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,93 +119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,94 +109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,95 diff --git a/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv b/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv new file mode 100644 index 000000000..0d0fb954a --- /dev/null +++ b/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 +65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 +64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 +63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 +61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 +59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 +58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 +56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 +55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 +54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 +53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 +52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 +52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 +51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 +51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 +50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 +50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 +50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 +50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 +50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 +50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 +50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 +51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 +52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 +54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 +57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 +62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 +70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 +82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 +97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 +114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 +131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 +148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 +162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 +173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 +179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 +179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 +174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 +167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 +158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 +150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 +143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 +139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 +138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 +140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 +144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 +147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 +147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 +142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 +133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 +122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 +113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 +105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 +100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 +96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 +93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 +90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 +87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 +84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 +82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 +81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 +81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 +81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 +81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 +81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 +81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 +81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 +83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 +86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 +91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 +99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 +109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 +122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 +135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 +148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 +158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 +163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 +164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 +161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 +155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 +147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 +137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 +127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 +118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 +110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 +104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 +98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 +93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 +88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 +84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 +80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 +76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 +73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 +70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 +67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 +64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 diff --git a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv new file mode 100644 index 000000000..d1a2c5f8f --- /dev/null +++ b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,1 +57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,2 +56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,3 +56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,4 +55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,5 +54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,6 +53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,7 +52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,8 +52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,9 +52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,10 +51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,11 +51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,12 +50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,13 +49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,14 +48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,15 +47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,16 +47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,17 +47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,18 +47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,19 +47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,20 +48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,21 +49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,22 +50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,23 +51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,24 +53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,25 +57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,26 +66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,27 +81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,28 +105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,29 +135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,30 +167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,31 +196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,32 +220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,33 +235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,34 +241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,35 +236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,36 +217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,37 +190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,38 +161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,39 +135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,40 +117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,41 +107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,42 +102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,43 +102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,44 +105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,45 +109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,46 +112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,47 +112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,48 +107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,49 +98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,50 +89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,51 +81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,52 +76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,53 +74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,54 +73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,55 +72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,56 +71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,57 +69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,58 +68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,59 +66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,60 +65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,61 +65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,62 +64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,63 +64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,64 +63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,65 +63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,66 +64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,67 +65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,68 +68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,69 +74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,70 +85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,71 +105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,72 +133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,73 +164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,74 +193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,75 +213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,76 +220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,77 +215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,78 +201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,79 +183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,80 +163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,81 +142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,82 +123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,83 +107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,84 +95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,85 +86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,86 +80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,87 +75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,88 +72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,89 +70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,90 +67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,91 +65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,92 +62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,93 +59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,94 +57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,95 +54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,96 diff --git a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv new file mode 100644 index 000000000..29346ad06 --- /dev/null +++ b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,1 +69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,2 +68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,3 +66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,4 +65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,5 +63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,6 +61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,7 +59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,8 +57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,9 +56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,10 +56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,11 +55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,12 +54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,13 +53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,14 +53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,15 +52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,16 +52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,17 +52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,18 +51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,19 +51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,20 +52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,21 +52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,22 +53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,23 +54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,24 +56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,25 +58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,26 +62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,27 +67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,28 +75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,29 +84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,30 +95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,31 +107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,32 +119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,33 +132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,34 +144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,35 +154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,36 +161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,37 +165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,38 +167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,39 +165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,40 +162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,41 +157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,42 +153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,43 +152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,44 +155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,45 +159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,46 +163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,47 +163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,48 +157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,49 +148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,50 +137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,51 +127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,52 +118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,53 +112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,54 +108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,55 +103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,56 +99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,57 +95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,58 +92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,59 +89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,60 +88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,61 +88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,62 +88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,63 +88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,64 +88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,65 +88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,66 +89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,67 +90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,68 +93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,69 +98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,70 +103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,71 +109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,72 +116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,73 +123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,74 +130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,75 +136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,76 +139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,77 +142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,78 +142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,79 +141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,80 +138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,81 +133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,82 +128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,83 +122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,84 +116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,85 +111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,86 +105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,87 +99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,88 +94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,89 +90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,90 +85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,91 +81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,92 +77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,93 +74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,94 +71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,95 +68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,96 diff --git a/src/main/resources/load/standard_load_profiles.csv b/src/main/resources/load/standard_load_profiles.csv deleted file mode 100644 index 64780bf40..000000000 --- a/src/main/resources/load/standard_load_profiles.csv +++ /dev/null @@ -1,97 +0,0 @@ -g0SuSa,g0SuSu,g0SuWd,g0TrSa,g0TrSu,g0TrWd,g0WiSa,g0WiSu,g0WiWd,h0SuSa,h0SuSu,h0SuWd,h0TrSa,h0TrSu,h0TrWd,h0WiSa,h0WiSu,h0WiWd,l0SuSa,l0SuSu,l0SuWd,l0TrSa,l0TrSu,l0TrWd,l0WiSa,l0WiSu,l0WiWd,quarterHour -74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 -76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 -77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 -78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 -77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 -76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 -74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 -71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 -70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 -68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 -67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 -67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 -66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 -66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 -66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 -67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 -68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 -69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 -70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 -71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 -71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 -72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 -72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 -72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 -73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 -73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 -77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 -83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 -93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 -106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 -120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 -134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 -147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 -157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 -166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 -171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 -175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 -176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 -176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 -176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 -177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 -179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 -181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 -183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 -184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 -185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 -185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 -185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 -184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 -182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 -179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 -175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 -170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 -163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 -154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 -144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 -133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 -122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 -112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 -102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 -95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 -90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 -86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 -83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 -80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 -77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 -75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 -74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 -74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 -74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 -75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 -76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 -77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 -78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 -79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 -79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 -79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 -79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 -79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 -80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 -81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 -83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 -85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 -86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 -87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 -86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 -84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 -83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 -81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 -79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 -77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 -75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 -74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 -72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 -71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 -70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 From a1a527075d557fcab86a6fbe3c6a921a50dd6425 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 05:43:19 +0000 Subject: [PATCH 094/310] Bump net.bytebuddy:byte-buddy from 1.14.19 to 1.15.0 (#1144) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a5fabd18b..c188005c6 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.14.19' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.0' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From 91bea33221fda8344c9736c0f3abc5899c8b63c9 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 26 Aug 2024 15:09:03 +0200 Subject: [PATCH 095/310] introduce DomesticHotWaterStorageResult --- .../factory/result/ThermalResultFactory.java | 20 ++++- .../result/ResultEntityProcessor.java | 2 + .../thermal/AbstractThermalStorageResult.java | 79 +++++++++++++++++++ .../thermal/CylindricalStorageResult.java | 59 +------------- .../DomesticHotWaterStorageResult.java | 26 ++++++ .../result/ThermalResultFactoryTest.groovy | 4 +- .../io/processor/ProcessorProviderTest.groovy | 4 +- .../result/ResultEntityProcessorTest.groovy | 27 ++++++- 8 files changed, 160 insertions(+), 61 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java create mode 100644 src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java index 0ff9180d0..8bb06ba54 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java @@ -10,6 +10,7 @@ import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; +import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult; import java.time.ZonedDateTime; @@ -28,7 +29,10 @@ public class ThermalResultFactory extends ModelResultFactory private static final String FILL_LEVEL = "fillLevel"; public ThermalResultFactory() { - super(ThermalHouseResult.class, CylindricalStorageResult.class); + super( + ThermalHouseResult.class, + CylindricalStorageResult.class, + DomesticHotWaterStorageResult.class); } /** @@ -38,7 +42,11 @@ public ThermalResultFactory() { * @param dateTimeFormatter parse date time strings */ public ThermalResultFactory(DateTimeFormatter dateTimeFormatter) { - super(dateTimeFormatter, ThermalHouseResult.class, CylindricalStorageResult.class); + super( + dateTimeFormatter, + ThermalHouseResult.class, + CylindricalStorageResult.class, + DomesticHotWaterStorageResult.class); } @Override @@ -75,6 +83,14 @@ protected ThermalUnitResult buildModel(EntityData data) { return new CylindricalStorageResult( zdtTime, inputModelUuid, energyQuantity, qDotQuantity, fillLevelQuantity); + } else if (clazz.equals(DomesticHotWaterStorageResult.class)) { + ComparableQuantity energyQuantity = + data.getQuantity(ENERGY, StandardUnits.ENERGY_RESULT); + ComparableQuantity fillLevelQuantity = + data.getQuantity(FILL_LEVEL, StandardUnits.FILL_LEVEL); + + return new DomesticHotWaterStorageResult( + zdtTime, inputModelUuid, energyQuantity, qDotQuantity, fillLevelQuantity); } else { throw new FactoryException("Cannot process " + clazz.getSimpleName() + ".class."); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java index 0e347aa5f..224b75850 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/result/ResultEntityProcessor.java @@ -18,6 +18,7 @@ import edu.ie3.datamodel.models.result.connector.Transformer3WResult; import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; +import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; @@ -58,6 +59,7 @@ public class ResultEntityProcessor extends EntityProcessor { NodeResult.class, ThermalHouseResult.class, CylindricalStorageResult.class, + DomesticHotWaterStorageResult.class, EmResult.class, FlexOptionsResult.class, CongestionResult.class); diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java new file mode 100644 index 000000000..a64d72b07 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java @@ -0,0 +1,79 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.result.thermal; + +import edu.ie3.datamodel.models.StandardUnits; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.UUID; +import javax.measure.quantity.Dimensionless; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; + +/** Abstract class representing the common results of different types of thermal storages */ +public abstract class AbstractThermalStorageResult extends ThermalStorageResult { + /** Fill level of the storage */ + private ComparableQuantity fillLevel; + + /** + * Constructs the result with + * + * @param time date and time when the result is produced + * @param inputModel uuid of the input model that produces the result + * @param energy Currently stored energy + * @param qDot Heat power flowing into (> 0) or coming from (< 0) the storage + * @param fillLevel Fill level of the storage + */ + public AbstractThermalStorageResult( + ZonedDateTime time, + UUID inputModel, + ComparableQuantity energy, + ComparableQuantity qDot, + ComparableQuantity fillLevel) { + super(time, inputModel, energy, qDot); + this.fillLevel = fillLevel.to(StandardUnits.FILL_LEVEL); + } + + public ComparableQuantity getFillLevel() { + return fillLevel; + } + + public void setFillLevel(ComparableQuantity fillLevel) { + this.fillLevel = fillLevel.to(StandardUnits.FILL_LEVEL); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AbstractThermalStorageResult that = (AbstractThermalStorageResult) o; + return fillLevel.equals(that.fillLevel); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), fillLevel); + } + + @Override + public String toString() { + return getClass().getSimpleName() + + "{" + + "time=" + + getTime() + + ", inputModel=" + + getInputModel() + + ", qDot=" + + getqDot() + + ", energy=" + + getEnergy() + + ", fillLevel=" + + fillLevel + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java index 40ab5bc1f..eeadc0bb8 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/CylindricalStorageResult.java @@ -5,75 +5,22 @@ */ package edu.ie3.datamodel.models.result.thermal; -import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; import java.time.ZonedDateTime; -import java.util.Objects; import java.util.UUID; import javax.measure.quantity.Dimensionless; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -/** Respresents the results of {@link CylindricalStorageInput} */ -public class CylindricalStorageResult extends ThermalStorageResult { - /** Fill level of the storage */ - private ComparableQuantity fillLevel; +/** Represents the results of Cylindrical Storage */ +public class CylindricalStorageResult extends AbstractThermalStorageResult { - /** - * Constructs the result with - * - * @param time date and time when the result is produced - * @param inputModel uuid of the input model that produces the result - * @param energy Currently stored energy - * @param qDot Heat power flowing into (> 0) or coming from (< 0) the storage - * @param fillLevel Fill level of the storage - */ public CylindricalStorageResult( ZonedDateTime time, UUID inputModel, ComparableQuantity energy, ComparableQuantity qDot, ComparableQuantity fillLevel) { - super(time, inputModel, energy, qDot); - this.fillLevel = fillLevel.to(StandardUnits.FILL_LEVEL); - } - - public ComparableQuantity getFillLevel() { - return fillLevel; - } - - public void setFillLevel(ComparableQuantity fillLevel) { - this.fillLevel = fillLevel.to(StandardUnits.FILL_LEVEL); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - CylindricalStorageResult that = (CylindricalStorageResult) o; - return fillLevel.equals(that.fillLevel); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), fillLevel); - } - - @Override - public String toString() { - return "CylindricalStorageResult{" - + "time=" - + getTime() - + ", inputModel=" - + getInputModel() - + ", qDot=" - + getqDot() - + ", energy=" - + getEnergy() - + ", fillLevel=" - + fillLevel - + '}'; + super(time, inputModel, energy, qDot, fillLevel); } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java new file mode 100644 index 000000000..cf604fe0e --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/DomesticHotWaterStorageResult.java @@ -0,0 +1,26 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.result.thermal; + +import java.time.ZonedDateTime; +import java.util.UUID; +import javax.measure.quantity.Dimensionless; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; + +/** Represents the results of Domestic Hot Water Storage */ +public class DomesticHotWaterStorageResult extends AbstractThermalStorageResult { + + public DomesticHotWaterStorageResult( + ZonedDateTime time, + UUID inputModel, + ComparableQuantity energy, + ComparableQuantity qDot, + ComparableQuantity fillLevel) { + super(time, inputModel, energy, qDot, fillLevel); + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy index 9c64a97ec..1f22de467 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy @@ -9,6 +9,7 @@ import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult +import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult import edu.ie3.datamodel.utils.Try @@ -23,7 +24,8 @@ class ThermalResultFactoryTest extends Specification implements FactoryTestHelpe def resultFactory = new ThermalResultFactory() def expectedClasses = [ ThermalHouseResult, - CylindricalStorageResult + CylindricalStorageResult, + DomesticHotWaterStorageResult ] expect: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 257b8e33b..35f60261e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -35,6 +35,7 @@ import edu.ie3.datamodel.models.result.connector.Transformer2WResult import edu.ie3.datamodel.models.result.connector.Transformer3WResult import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult +import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.TimeSeries @@ -121,7 +122,8 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData NodeResult, CongestionResult, ThermalHouseResult, - CylindricalStorageResult + CylindricalStorageResult, + DomesticHotWaterStorageResult ] // currently known processors diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy index 7bf12fbb9..12924e74a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy @@ -15,6 +15,7 @@ import edu.ie3.datamodel.models.result.connector.Transformer2WResult import edu.ie3.datamodel.models.result.connector.Transformer3WResult import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult +import edu.ie3.datamodel.models.result.thermal.DomesticHotWaterStorageResult import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared import spock.lang.Specification @@ -252,6 +253,30 @@ class ResultEntityProcessorTest extends Specification { validProcessedElement == expectedResults } + def "A ResultEntityProcessor should serialize a DomesticHotWaterStorageResult correctly"() { + given: + def sysPartResProcessor = new ResultEntityProcessor(DomesticHotWaterStorageResult) + + Quantity qDot = Quantities.getQuantity(2, StandardUnits.Q_DOT_RESULT) + Quantity energy = Quantities.getQuantity(3, StandardUnits.ENERGY_RESULT) + Quantity fillLevel = Quantities.getQuantity(20, Units.PERCENT) + + def validResult = new DomesticHotWaterStorageResult(ZonedDateTime.parse("2020-01-30T17:26:44Z"), inputModel, energy, qDot, fillLevel) + + def expectedResults = [ + energy : '3.0', + fillLevel : '20.0', + inputModel: '22bea5fc-2cb2-4c61-beb9-b476e0107f52', + qDot : '2.0', + time : '2020-01-30T17:26:44Z'] + + when: + def validProcessedElement = sysPartResProcessor.handleEntity(validResult) + + then: + validProcessedElement == expectedResults + } + def "A ResultEntityProcessor should throw an EntityProcessorException when it receives an entity result that is not eligible"() { given: @@ -270,7 +295,7 @@ class ResultEntityProcessorTest extends Specification { def "The list of eligible entity classes for a ResultEntityProcessor should be valid"() { given: - int noOfElements = 20 // number of all currently implemented entity results + int noOfElements = 21 // number of all currently implemented entity results expect: ResultEntityProcessor.eligibleEntityClasses.size() == noOfElements From 7aa786fc917da2e83f1ebb2e0962d78430ea05d1 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 26 Aug 2024 15:14:32 +0200 Subject: [PATCH 096/310] docs for domesticHotWaterStorage --- docs/readthedocs/models/models.md | 1 + .../participant/domesticHotWaterStorage.md | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 docs/readthedocs/models/result/participant/domesticHotWaterStorage.md diff --git a/docs/readthedocs/models/models.md b/docs/readthedocs/models/models.md index f49d958b6..a1b148f09 100644 --- a/docs/readthedocs/models/models.md +++ b/docs/readthedocs/models/models.md @@ -210,6 +210,7 @@ result/participant/thermalstorage result/participant/thermalunit result/participant/thermalhouse result/participant/cylindricalstorage +result/participant/domesticthotwaterstorage result/participant/systemparticipant result/participant/flexoption result/participant/em diff --git a/docs/readthedocs/models/result/participant/domesticHotWaterStorage.md b/docs/readthedocs/models/result/participant/domesticHotWaterStorage.md new file mode 100644 index 000000000..122841944 --- /dev/null +++ b/docs/readthedocs/models/result/participant/domesticHotWaterStorage.md @@ -0,0 +1,44 @@ +(domestichotwaterstorage-result)= + +# Domestic Hot Water Storage + +Result of a domestic hot water storage using a fluent to store thermal energy. + +## Attributes, Units and Remarks + +```{eval-rst} +.. list-table:: + :widths: 33 33 33 + :header-rows: 1 + + + * - Attribute + - Unit + - Remarks + + * - time + - -- + - date and time for the produced result + + * - inputModel + - -- + - uuid for the associated input model + + * - energy + - MWh + - + + * - qDot + - MW + - heat demand of the sink + + * - fillLevel + - -- + - + +``` + +## Caveats + +Nothing - at least not known. +If you found something, please contact us! From 18b24fa37b00be02987ca18ad8c4a80d73718b6b Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Mon, 26 Aug 2024 15:14:53 +0200 Subject: [PATCH 097/310] Adapted rtd override styles and fixed scrollable table --- docs/readthedocs/_static/css/theme_override.css | 5 ++++- docs/readthedocs/models/input/em.md | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/readthedocs/_static/css/theme_override.css b/docs/readthedocs/_static/css/theme_override.css index 914a12811..12a13c535 100644 --- a/docs/readthedocs/_static/css/theme_override.css +++ b/docs/readthedocs/_static/css/theme_override.css @@ -10,4 +10,7 @@ } .wy-table-responsive table th p { margin-bottom: 0; -} \ No newline at end of file +} +table.wrapping td { + white-space: normal; +} diff --git a/docs/readthedocs/models/input/em.md b/docs/readthedocs/models/input/em.md index 26d6e69e9..cbb562109 100644 --- a/docs/readthedocs/models/input/em.md +++ b/docs/readthedocs/models/input/em.md @@ -10,6 +10,7 @@ Participants are connected to an EM each via their `em` field. ```{list-table} :widths: auto :header-rows: 1 + :class: wrapping * - Attribute From d7506ce87deb7b7dc10f8a62fa90cda205b78b51 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 26 Aug 2024 15:17:38 +0200 Subject: [PATCH 098/310] rtd --- .../{domesticHotWaterStorage.md => domestichotwaterstorage.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/readthedocs/models/result/participant/{domesticHotWaterStorage.md => domestichotwaterstorage.md} (100%) diff --git a/docs/readthedocs/models/result/participant/domesticHotWaterStorage.md b/docs/readthedocs/models/result/participant/domestichotwaterstorage.md similarity index 100% rename from docs/readthedocs/models/result/participant/domesticHotWaterStorage.md rename to docs/readthedocs/models/result/participant/domestichotwaterstorage.md From 3b89d3e9b5c21ae80aac073203c8298bfe651ea5 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 26 Aug 2024 15:23:08 +0200 Subject: [PATCH 099/310] fix rtd --- docs/readthedocs/models/models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/models/models.md b/docs/readthedocs/models/models.md index a1b148f09..390d650cb 100644 --- a/docs/readthedocs/models/models.md +++ b/docs/readthedocs/models/models.md @@ -210,7 +210,7 @@ result/participant/thermalstorage result/participant/thermalunit result/participant/thermalhouse result/participant/cylindricalstorage -result/participant/domesticthotwaterstorage +result/participant/domestichotwaterstorage result/participant/systemparticipant result/participant/flexoption result/participant/em From 62757d8d98548d7533cc82826aa9686c5cfa9022 Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Mon, 26 Aug 2024 15:26:21 +0200 Subject: [PATCH 100/310] Enabled Line-Wrapping for all list-table environments. Updated CHANGELOG.md --- CHANGELOG.md | 2 +- .../input/additionaldata/idcoordinatesource.md | 3 ++- .../models/input/additionaldata/timeseries.md | 3 ++- docs/readthedocs/models/input/grid/gridcontainer.md | 3 ++- docs/readthedocs/models/input/grid/line.md | 12 ++++++++---- docs/readthedocs/models/input/grid/linegraphic.md | 3 ++- .../readthedocs/models/input/grid/measurementunit.md | 3 ++- docs/readthedocs/models/input/grid/node.md | 3 ++- docs/readthedocs/models/input/grid/nodegraphic.md | 3 ++- docs/readthedocs/models/input/grid/switch.md | 3 ++- docs/readthedocs/models/input/grid/transformer2w.md | 9 ++++++--- docs/readthedocs/models/input/grid/transformer3w.md | 6 ++++-- docs/readthedocs/models/input/operator.md | 3 ++- docs/readthedocs/models/input/participant/bm.md | 6 ++++-- docs/readthedocs/models/input/participant/chp.md | 6 ++++-- docs/readthedocs/models/input/participant/ev.md | 6 ++++-- docs/readthedocs/models/input/participant/evcs.md | 12 ++++++++---- .../models/input/participant/fixedfeedin.md | 3 ++- docs/readthedocs/models/input/participant/hp.md | 6 ++++-- docs/readthedocs/models/input/participant/load.md | 3 ++- docs/readthedocs/models/input/participant/pv.md | 3 ++- docs/readthedocs/models/input/participant/storage.md | 6 ++++-- docs/readthedocs/models/input/participant/wec.md | 6 ++++-- .../models/input/thermal/cylindricalstorage.md | 3 ++- docs/readthedocs/models/input/thermal/thermalbus.md | 3 ++- .../readthedocs/models/input/thermal/thermalhouse.md | 3 ++- 26 files changed, 81 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 685355269..3a2de9e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Storage minimum level parameter removed from cylindrical thermal storage [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1123) -- Converted eval-rst to myst syntax in ReadTheDocs [#1137](https://github.com/ie3-institute/PowerSystemDataModel/issues/1137) +- Converted eval-rst to myst syntax in ReadTheDocs, fixed line wrapping and widths[#1137](https://github.com/ie3-institute/PowerSystemDataModel/issues/1137) ## [5.1.0] - 2024-06-24 diff --git a/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md b/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md index 8a93d608c..b8f356cb2 100644 --- a/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md +++ b/docs/readthedocs/models/input/additionaldata/idcoordinatesource.md @@ -8,7 +8,8 @@ coordinates. ## Information ```{list-table} - :widths: 33 33 + :widths: auto + :class: wrapping :header-rows: 1 * - Attribute diff --git a/docs/readthedocs/models/input/additionaldata/timeseries.md b/docs/readthedocs/models/input/additionaldata/timeseries.md index 84546f689..a082ba2fb 100644 --- a/docs/readthedocs/models/input/additionaldata/timeseries.md +++ b/docs/readthedocs/models/input/additionaldata/timeseries.md @@ -18,7 +18,8 @@ To be as flexible, as possible, the actual content of the time series is given a The following different values are available: ```{list-table} - :widths: 33 33 + :widths: auto + :class: wrapping :header-rows: 1 * - Value Class diff --git a/docs/readthedocs/models/input/grid/gridcontainer.md b/docs/readthedocs/models/input/grid/gridcontainer.md index c35541a87..24f8e66c4 100644 --- a/docs/readthedocs/models/input/grid/gridcontainer.md +++ b/docs/readthedocs/models/input/grid/gridcontainer.md @@ -38,7 +38,8 @@ A synoptic overview of both classes' attributes is given here: ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/line.md b/docs/readthedocs/models/input/grid/line.md index 87f649e59..fab04d266 100644 --- a/docs/readthedocs/models/input/grid/line.md +++ b/docs/readthedocs/models/input/grid/line.md @@ -7,7 +7,8 @@ Representation of an AC line. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 * - Attribute @@ -53,7 +54,8 @@ A list with some standard line types can be found here: [Standard Line Types](#s ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -125,7 +127,8 @@ The lines which source is ``simBench`` are from [here](https://simbench.de/en/do Some standard overhead lines. ```{list-table} - :widths: 11 11 11 11 11 11 11 11 11 + :widths: auto + :class: wrapping11 11 11 11 11 11 11 11 11 :header-rows: 1 @@ -307,7 +310,8 @@ Some standard overhead lines. Some standard cables. ```{list-table} - :widths: 11 11 11 11 11 11 11 11 11 + :widths: auto + :class: wrapping11 11 11 11 11 11 11 11 11 :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/linegraphic.md b/docs/readthedocs/models/input/grid/linegraphic.md index 4016d6928..fdd885fc9 100644 --- a/docs/readthedocs/models/input/grid/linegraphic.md +++ b/docs/readthedocs/models/input/grid/linegraphic.md @@ -7,7 +7,8 @@ Schematic drawing information for a line model. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/measurementunit.md b/docs/readthedocs/models/input/grid/measurementunit.md index f800955b4..69aea3086 100644 --- a/docs/readthedocs/models/input/grid/measurementunit.md +++ b/docs/readthedocs/models/input/grid/measurementunit.md @@ -9,7 +9,8 @@ The measured information are indicated by boolean fields. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/node.md b/docs/readthedocs/models/input/grid/node.md index 31f3e9a1d..3b994a652 100644 --- a/docs/readthedocs/models/input/grid/node.md +++ b/docs/readthedocs/models/input/grid/node.md @@ -7,7 +7,8 @@ Representation of an electrical node, with no further distinction into bus bar, ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/nodegraphic.md b/docs/readthedocs/models/input/grid/nodegraphic.md index 1ca714156..31aec04e9 100644 --- a/docs/readthedocs/models/input/grid/nodegraphic.md +++ b/docs/readthedocs/models/input/grid/nodegraphic.md @@ -7,7 +7,8 @@ Schematic drawing information for a node model. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/switch.md b/docs/readthedocs/models/input/grid/switch.md index 244bf8756..33534401a 100644 --- a/docs/readthedocs/models/input/grid/switch.md +++ b/docs/readthedocs/models/input/grid/switch.md @@ -7,7 +7,8 @@ Model of an ideal switch connecting two node models of the same voltage level ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/transformer2w.md b/docs/readthedocs/models/input/grid/transformer2w.md index 26c6bb8f5..2b874fce3 100644 --- a/docs/readthedocs/models/input/grid/transformer2w.md +++ b/docs/readthedocs/models/input/grid/transformer2w.md @@ -11,7 +11,8 @@ All impedances and admittances are given with respect to the higher voltage side As obvious, the parameter can be used in T- as in 𝜋-equivalent circuit representations. ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 * - Attribute @@ -82,7 +83,8 @@ A list with some standard transformer types can be found here: [Standard Two Win ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 * - Attribute @@ -141,7 +143,8 @@ file can be used directly for any simulation with ``simona``. The transformers which source is ``simBench`` are from [here](https://simbench.de/en/download/datasets/). ```{list-table} - :widths: 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 + :widths: auto + :class: wrapping6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 :header-rows: 1 * - uuid diff --git a/docs/readthedocs/models/input/grid/transformer3w.md b/docs/readthedocs/models/input/grid/transformer3w.md index a5b2a556f..4e6111f9b 100644 --- a/docs/readthedocs/models/input/grid/transformer3w.md +++ b/docs/readthedocs/models/input/grid/transformer3w.md @@ -23,7 +23,8 @@ name: Equivalent circuit diagram of a three winding transformer All impedances and admittances are given with respect to the higher voltage side. ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -120,7 +121,8 @@ All impedances and admittances are given with respect to the higher voltage side ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/operator.md b/docs/readthedocs/models/input/operator.md index 6958ffb89..1674de745 100644 --- a/docs/readthedocs/models/input/operator.md +++ b/docs/readthedocs/models/input/operator.md @@ -8,7 +8,8 @@ having control over one or more physical entitites. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index df2092b7d..82a2fdf79 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -9,7 +9,8 @@ Model of a biomass power plant. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -55,7 +56,8 @@ Model of a biomass power plant. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index 2b42cd851..2f41785a0 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -9,7 +9,8 @@ Combined heat and power plant. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -63,7 +64,8 @@ Combined heat and power plant. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index b52222b47..38ad16fcf 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -9,7 +9,8 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -59,7 +60,8 @@ Model of an electric vehicle, that is occasionally connected to the grid via an ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 1723289b9..71138c13b 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -10,7 +10,8 @@ station and has some limitations outlined below. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -78,7 +79,8 @@ available standard types and how to use custom types. The actual model definition for charging point types looks as follows: ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -115,7 +117,8 @@ They can either by used code wise or directly from database or file input by ref synonymous ids. All standard types can be found in {code}`edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils`. ```{list-table} - :widths: 25 25 25 25 + :widths: auto + :class: wrapping25 25 25 25 :header-rows: 1 @@ -218,7 +221,8 @@ Evcs location types describe the type of charging location of a charging station and underscores and minuses are ignored, that means "charginghubtown" is parsed as type {code}`CHARGING_HUB_TOWN`. ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index 00de1b258..2ff1efd3e 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -8,7 +8,8 @@ model can be derived. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index 1bb6d36fb..e087607bc 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -9,7 +9,8 @@ Model of a heat pump. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -51,7 +52,8 @@ Model of a heat pump. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 3bddaacfb..1a57d9a7d 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -7,7 +7,8 @@ Model of (mainly) domestic loads. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index e30aaf1f7..6309af655 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -5,7 +5,8 @@ Detailed model of a photovoltaic power plant. ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index f166758d1..45b118688 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -9,7 +9,8 @@ Model of an ideal electrical battery energy storage. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -64,7 +65,8 @@ Model of an ideal electrical battery energy storage. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index 2c5a753a7..ebf89129f 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -9,7 +9,8 @@ Model of a wind energy converter. ### Type Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 @@ -63,7 +64,8 @@ Model of a wind energy converter. ### Entity Model ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index fb3304b4a..6e674f91b 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -7,7 +7,8 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/thermal/thermalbus.md b/docs/readthedocs/models/input/thermal/thermalbus.md index 4cd31e996..12740d858 100644 --- a/docs/readthedocs/models/input/thermal/thermalbus.md +++ b/docs/readthedocs/models/input/thermal/thermalbus.md @@ -8,7 +8,8 @@ A coupling point to thermal system - equivalent to [electrical node](../grid/nod ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index 803864941..50837ee65 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -8,7 +8,8 @@ This reflects a simple shoe box with transmission losses ## Attributes, Units and Remarks ```{list-table} - :widths: 33 33 33 + :widths: auto + :class: wrapping :header-rows: 1 From bdc791a957c9a2e43302edb3e0d9b44e81fd34cb Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Mon, 26 Aug 2024 15:35:42 +0200 Subject: [PATCH 101/310] Fixed replacement issues. --- docs/readthedocs/models/input/grid/line.md | 4 ++-- docs/readthedocs/models/input/grid/transformer2w.md | 2 +- docs/readthedocs/models/input/participant/evcs.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/readthedocs/models/input/grid/line.md b/docs/readthedocs/models/input/grid/line.md index fab04d266..4916b4da6 100644 --- a/docs/readthedocs/models/input/grid/line.md +++ b/docs/readthedocs/models/input/grid/line.md @@ -128,7 +128,7 @@ Some standard overhead lines. ```{list-table} :widths: auto - :class: wrapping11 11 11 11 11 11 11 11 11 + :class: wrapping :header-rows: 1 @@ -311,7 +311,7 @@ Some standard cables. ```{list-table} :widths: auto - :class: wrapping11 11 11 11 11 11 11 11 11 + :class: wrapping :header-rows: 1 diff --git a/docs/readthedocs/models/input/grid/transformer2w.md b/docs/readthedocs/models/input/grid/transformer2w.md index 2b874fce3..948d245c5 100644 --- a/docs/readthedocs/models/input/grid/transformer2w.md +++ b/docs/readthedocs/models/input/grid/transformer2w.md @@ -144,7 +144,7 @@ The transformers which source is ``simBench`` are from [here](https://simbench.d ```{list-table} :widths: auto - :class: wrapping6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 + :class: wrapping :header-rows: 1 * - uuid diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 71138c13b..fee7dbb8c 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -118,7 +118,7 @@ synonymous ids. All standard types can be found in {code}`edu.ie3.datamodel.mode ```{list-table} :widths: auto - :class: wrapping25 25 25 25 + :class: wrapping :header-rows: 1 From 544a05a1526ea9677c072d160f470cfdc5438a15 Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Mon, 26 Aug 2024 15:39:04 +0200 Subject: [PATCH 102/310] Fixed missing line. Codacy check failed --- docs/readthedocs/_static/css/theme_override.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/readthedocs/_static/css/theme_override.css b/docs/readthedocs/_static/css/theme_override.css index 12a13c535..47be427c3 100644 --- a/docs/readthedocs/_static/css/theme_override.css +++ b/docs/readthedocs/_static/css/theme_override.css @@ -11,6 +11,7 @@ .wy-table-responsive table th p { margin-bottom: 0; } + table.wrapping td { white-space: normal; } From 8157bc2a8f8d85f8e95ea8f73a6c49721b0b07c6 Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Mon, 26 Aug 2024 16:48:35 +0200 Subject: [PATCH 103/310] Deleted | --- docs/readthedocs/io/csvfiles.md | 28 +++++++++---------- docs/readthedocs/models/input/grid/line.md | 12 ++++---- .../models/input/grid/linegraphic.md | 4 +-- docs/readthedocs/models/input/grid/node.md | 4 +-- .../models/input/grid/nodegraphic.md | 4 +-- .../models/input/grid/transformer2w.md | 6 ++-- .../models/input/grid/transformer3w.md | 6 ++-- .../models/input/participant/bm.md | 18 ++++++------ .../models/input/participant/chp.md | 14 +++++----- .../models/input/participant/ev.md | 10 +++---- .../models/input/participant/evcs.md | 6 ++-- .../models/input/participant/fixedfeedin.md | 6 ++-- .../models/input/participant/hp.md | 10 +++---- .../models/input/participant/load.md | 6 ++-- .../models/input/participant/pv.md | 14 +++++----- .../models/input/participant/storage.md | 18 ++++++------ .../models/input/participant/wec.md | 14 +++++----- 17 files changed, 90 insertions(+), 90 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 4729fc7aa..afeb737d8 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -127,26 +127,26 @@ The following keys are supported until now: * - Key - Information and supported head line * - c - - | An energy price (e.g. in €/MWh; c stands for charge). - | Permissible head line: ``time,price`` + - An energy price (e.g. in €/MWh; c stands for charge). + Permissible head line: ``time,price`` * - p - - | Active power - | Permissible head line: ``time,p`` + - Active power + Permissible head line: ``time,p`` * - pq - - | Active and reactive power - | Permissible head line: ``time,p,q`` + - Active and reactive power + Permissible head line: ``time,p,q`` * - h - - | Heat power demand - | Permissible head line: ``time,h`` + - Heat power demand + Permissible head line: ``time,h`` * - ph - - | Active and heat power - | Permissible head line: ``time,p,h`` + - Active and heat power + Permissible head line: ``time,p,h`` * - pqh - - | Active, reactive and heat power - | Permissible head line: ``time,p,q,h`` + - Active, reactive and heat power + Permissible head line: ``time,p,q,h`` * - weather - - | Weather information - | Permissible head line: ``time,coordinate,direct_irradiation,diffuse_irradiation,temperature,wind_velocity,wind_direction`` + - Weather information + Permissible head line: ``time,coordinate,direct_irradiation,diffuse_irradiation,temperature,wind_velocity,wind_direction`` ``` diff --git a/docs/readthedocs/models/input/grid/line.md b/docs/readthedocs/models/input/grid/line.md index 4916b4da6..814427d0d 100644 --- a/docs/readthedocs/models/input/grid/line.md +++ b/docs/readthedocs/models/input/grid/line.md @@ -89,9 +89,9 @@ A list with some standard line types can be found here: [Standard Line Types](#s * - parallelDevices - – - - | overall amount of parallel lines to automatically construct - | (e.g. parallelDevices = 2 will build a total of two lines - | using the specified parameters) + - overall amount of parallel lines to automatically construct + (e.g. parallelDevices = 2 will build a total of two lines + using the specified parameters) * - type - – @@ -108,9 +108,9 @@ A list with some standard line types can be found here: [Standard Line Types](#s * - olmCharacteristic - – - - | Characteristic of possible overhead line monitoring Can be - | given in the form of ``olm:{}``. The pairs - | are wind velocity in x and permissible loading in y. + - Characteristic of possible overhead line monitoring Can be + given in the form of ``olm:{}``. The pairs + are wind velocity in x and permissible loading in y. ``` diff --git a/docs/readthedocs/models/input/grid/linegraphic.md b/docs/readthedocs/models/input/grid/linegraphic.md index fdd885fc9..e8f30c102 100644 --- a/docs/readthedocs/models/input/grid/linegraphic.md +++ b/docs/readthedocs/models/input/grid/linegraphic.md @@ -22,8 +22,8 @@ Schematic drawing information for a line model. * - graphicLayer - - - | Human readable identifier of the graphic layer to draw - | this element on + - Human readable identifier of the graphic layer to draw + this element on * - path - diff --git a/docs/readthedocs/models/input/grid/node.md b/docs/readthedocs/models/input/grid/node.md index 3b994a652..a70cd3363 100644 --- a/docs/readthedocs/models/input/grid/node.md +++ b/docs/readthedocs/models/input/grid/node.md @@ -38,8 +38,8 @@ Representation of an electrical node, with no further distinction into bus bar, * - slack - - - | Boolean indicator, if this nodes serves as a slack node in power - | flow calculation + - Boolean indicator, if this nodes serves as a slack node in power + flow calculation * - geoPosition - diff --git a/docs/readthedocs/models/input/grid/nodegraphic.md b/docs/readthedocs/models/input/grid/nodegraphic.md index 31aec04e9..4420c198c 100644 --- a/docs/readthedocs/models/input/grid/nodegraphic.md +++ b/docs/readthedocs/models/input/grid/nodegraphic.md @@ -22,8 +22,8 @@ Schematic drawing information for a node model. * - graphicLayer - - - | Human readable identifier of the graphic layer to draw - | this element on + - Human readable identifier of the graphic layer to draw + this element on * - path - diff --git a/docs/readthedocs/models/input/grid/transformer2w.md b/docs/readthedocs/models/input/grid/transformer2w.md index 948d245c5..056969933 100644 --- a/docs/readthedocs/models/input/grid/transformer2w.md +++ b/docs/readthedocs/models/input/grid/transformer2w.md @@ -117,9 +117,9 @@ A list with some standard transformer types can be found here: [Standard Two Win * - parallelDevices - – - - | overall amount of parallel transformers to automatically - | construct (e.g. parallelDevices = 2 will build a total of - | two transformers using the specified parameters) + - overall amount of parallel transformers to automatically + construct (e.g. parallelDevices = 2 will build a total of + two transformers using the specified parameters) * - type - – diff --git a/docs/readthedocs/models/input/grid/transformer3w.md b/docs/readthedocs/models/input/grid/transformer3w.md index 4e6111f9b..652706df5 100644 --- a/docs/readthedocs/models/input/grid/transformer3w.md +++ b/docs/readthedocs/models/input/grid/transformer3w.md @@ -160,9 +160,9 @@ All impedances and admittances are given with respect to the higher voltage side * - parallelDevices - - - | overall amount of parallel transformers to automatically - | construct (e.g. parallelDevices = 2 will build a - | total of two transformers using the specified parameters) + - overall amount of parallel transformers to automatically + construct (e.g. parallelDevices = 2 will build a + total of two transformers using the specified parameters) * - type - diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index 82a2fdf79..9d98d1a26 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -32,8 +32,8 @@ Model of a biomass power plant. * - opex - € / MWh - - | Operational expenditure to operate one entity of - | this type + - Operational expenditure to operate one entity of + this type * - activePowerGradient - % / h @@ -95,13 +95,13 @@ Model of a biomass power plant. * - marketReaction - - - | Whether to adapt output based on (volatile) - | market price or not + - Whether to adapt output based on (volatile) + market price or not * - costControlled - - - | Whether to adapt output based on the difference - | between production costs and fixed feed in tariff or not + - Whether to adapt output based on the difference + between production costs and fixed feed in tariff or not * - feedInTariff - € / MWh @@ -109,9 +109,9 @@ Model of a biomass power plant. * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index 2f41785a0..a949469c2 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -32,8 +32,8 @@ Combined heat and power plant. * - opex - € / MWh - - | Operational expenditure to operate one entity of - | this type + - Operational expenditure to operate one entity of + this type * - etaEl - % @@ -111,14 +111,14 @@ Combined heat and power plant. * - marketReaction - - - | Whether to adapt output based on (volatile) - | market price or not + - Whether to adapt output based on (volatile) + market price or not * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index 38ad16fcf..22b027262 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -32,8 +32,8 @@ Model of an electric vehicle, that is occasionally connected to the grid via an * - opex - € / MWh - - | Operational expenditure to operate one entity of - | this type + - Operational expenditure to operate one entity of + this type * - eStorage - kWh @@ -99,9 +99,9 @@ Model of an electric vehicle, that is occasionally connected to the grid via an * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index fee7dbb8c..86ab2e60a 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -61,9 +61,9 @@ station and has some limitations outlined below. * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index 2ff1efd3e..c7aa407f9 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -51,9 +51,9 @@ model can be derived. * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index e087607bc..b90071651 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -32,8 +32,8 @@ Model of a heat pump. * - opex - € / MWh - - | Operational expenditure to operate one entity of - | this type + - Operational expenditure to operate one entity of + this type * - sRated - kVA @@ -95,9 +95,9 @@ Model of a heat pump. * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 1a57d9a7d..29b9f9213 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -62,9 +62,9 @@ Model of (mainly) domestic loads. * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 6309af655..18b21093e 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -44,8 +44,8 @@ Detailed model of a photovoltaic power plant. * - azimuth - ° - - | Inclination in a compass direction - | South = 0°, West = 90°, East = -90° + - Inclination in a compass direction + South = 0°, West = 90°, East = -90° * - etaConv - % @@ -65,8 +65,8 @@ Detailed model of a photovoltaic power plant. * - marketReaction - - - | Whether to adapt output based on (volatile) - | market price or not + - Whether to adapt output based on (volatile) + market price or not * - sRated - kVA @@ -78,9 +78,9 @@ Detailed model of a photovoltaic power plant. * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index 45b118688..5e8ccf57d 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -32,8 +32,8 @@ Model of an ideal electrical battery energy storage. * - opex - € / MWh - - | Operational expenditure to operate one entity of - | this type + - Operational expenditure to operate one entity of + this type * - eStorage - kWh @@ -49,8 +49,8 @@ Model of an ideal electrical battery energy storage. * - pMax - kW - - | Maximum permissible active power - | infeed or consumption + - Maximum permissible active power + infeed or consumption * - activePowerGradient - % / h @@ -104,14 +104,14 @@ Model of an ideal electrical battery energy storage. * - behaviour - - - | Foreseen operation strategy of the storage. - | Eligible input: *"market"*, *"grid"*, *"self"* + - Foreseen operation strategy of the storage. + Eligible input: *"market"*, *"grid"*, *"self"* * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index ebf89129f..632611133 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -32,8 +32,8 @@ Model of a wind energy converter. * - opex - € / MWh - - | Operational expenditure to operate one entity of - | this type + - Operational expenditure to operate one entity of + this type * - sRated - kVA @@ -103,14 +103,14 @@ Model of a wind energy converter. * - marketReaction - - - | Whether to adapt output based on (volatile) - | market price or not + - Whether to adapt output based on (volatile) + market price or not * - em - - - | UUID reference to an :ref:`Energy Management Unit` that is controlling - | this system participant. Field can be empty or missing, if this participant - | is not controlled. + - UUID reference to an :ref:`Energy Management Unit` that is controlling + this system participant. Field can be empty or missing, if this participant + is not controlled. ``` From 529f5bd88e35fd10f6a03aaeb148a09aaf9a7ce6 Mon Sep 17 00:00:00 2001 From: Philipp Schmelter Date: Mon, 26 Aug 2024 17:55:03 +0200 Subject: [PATCH 104/310] Repaired all links which were still in rst syntax --- docs/readthedocs/models/input/participant/bm.md | 4 ++-- docs/readthedocs/models/input/participant/chp.md | 4 ++-- docs/readthedocs/models/input/participant/ev.md | 4 ++-- docs/readthedocs/models/input/participant/evcs.md | 8 ++++---- docs/readthedocs/models/input/participant/fixedfeedin.md | 4 ++-- docs/readthedocs/models/input/participant/hp.md | 4 ++-- docs/readthedocs/models/input/participant/load.md | 6 +++--- docs/readthedocs/models/input/participant/pv.md | 4 ++-- docs/readthedocs/models/input/participant/storage.md | 4 ++-- docs/readthedocs/models/input/participant/wec.md | 6 +++--- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/readthedocs/models/input/participant/bm.md b/docs/readthedocs/models/input/participant/bm.md index 9d98d1a26..f75407f12 100644 --- a/docs/readthedocs/models/input/participant/bm.md +++ b/docs/readthedocs/models/input/participant/bm.md @@ -87,7 +87,7 @@ Model of a biomass power plant. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - @@ -109,7 +109,7 @@ Model of a biomass power plant. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/chp.md b/docs/readthedocs/models/input/participant/chp.md index a949469c2..9be96519d 100644 --- a/docs/readthedocs/models/input/participant/chp.md +++ b/docs/readthedocs/models/input/participant/chp.md @@ -99,7 +99,7 @@ Combined heat and power plant. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - @@ -116,7 +116,7 @@ Combined heat and power plant. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/ev.md b/docs/readthedocs/models/input/participant/ev.md index 22b027262..b9669eed6 100644 --- a/docs/readthedocs/models/input/participant/ev.md +++ b/docs/readthedocs/models/input/participant/ev.md @@ -91,7 +91,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - @@ -99,7 +99,7 @@ Model of an electric vehicle, that is occasionally connected to the grid via an * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/evcs.md b/docs/readthedocs/models/input/participant/evcs.md index 86ab2e60a..f3f8585b7 100644 --- a/docs/readthedocs/models/input/participant/evcs.md +++ b/docs/readthedocs/models/input/participant/evcs.md @@ -41,11 +41,11 @@ station and has some limitations outlined below. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - - - :ref:`Charging point type` (valid for all installed points) + - [Charging point type](#evcs-point-types) (valid for all installed points) * - chargingPoints - @@ -57,11 +57,11 @@ station and has some limitations outlined below. * - locationType - - - :ref:`Charging station location types` + - [Charging station location types](#location-types) * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/fixedfeedin.md b/docs/readthedocs/models/input/participant/fixedfeedin.md index c7aa407f9..c83570a04 100644 --- a/docs/readthedocs/models/input/participant/fixedfeedin.md +++ b/docs/readthedocs/models/input/participant/fixedfeedin.md @@ -39,7 +39,7 @@ model can be derived. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - sRated - kVA @@ -51,7 +51,7 @@ model can be derived. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/hp.md b/docs/readthedocs/models/input/participant/hp.md index b90071651..2559c79c5 100644 --- a/docs/readthedocs/models/input/participant/hp.md +++ b/docs/readthedocs/models/input/participant/hp.md @@ -87,7 +87,7 @@ Model of a heat pump. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - @@ -95,7 +95,7 @@ Model of a heat pump. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 29b9f9213..782e3c495 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -38,11 +38,11 @@ Model of (mainly) domestic loads. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - loadProfile - - - :ref:`Load profile` as model behaviour + - [Load profile](#load-lp) as model behaviour * - dsm - @@ -62,7 +62,7 @@ Model of (mainly) domestic loads. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 18b21093e..8b44140a1 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -36,7 +36,7 @@ Detailed model of a photovoltaic power plant. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - albedo - @@ -78,7 +78,7 @@ Detailed model of a photovoltaic power plant. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/storage.md b/docs/readthedocs/models/input/participant/storage.md index 5e8ccf57d..51c25f359 100644 --- a/docs/readthedocs/models/input/participant/storage.md +++ b/docs/readthedocs/models/input/participant/storage.md @@ -96,7 +96,7 @@ Model of an ideal electrical battery energy storage. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - @@ -109,7 +109,7 @@ Model of an ideal electrical battery energy storage. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. diff --git a/docs/readthedocs/models/input/participant/wec.md b/docs/readthedocs/models/input/participant/wec.md index 632611133..b7d62498c 100644 --- a/docs/readthedocs/models/input/participant/wec.md +++ b/docs/readthedocs/models/input/participant/wec.md @@ -45,7 +45,7 @@ Model of a wind energy converter. * - cpCharacteristic - - - Wind velocity dependent :ref:`Betz factors`. + - Wind velocity dependent [Betz factors](#wec-cp-characteristic). * - etaConv - % @@ -95,7 +95,7 @@ Model of a wind energy converter. * - qCharacteristics - - - :ref:`Reactive power characteristic` to follow + - [Reactive power characteristic](#participant-general-q-characteristic) to follow * - type - @@ -108,7 +108,7 @@ Model of a wind energy converter. * - em - - - UUID reference to an :ref:`Energy Management Unit` that is controlling + - UUID reference to an [Energy Management Unit](#em_model) that is controlling this system participant. Field can be empty or missing, if this participant is not controlled. From 8ecea735efff3ff7f7409a699f11bd0d888b1e3d Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 26 Aug 2024 20:19:31 +0200 Subject: [PATCH 105/310] Adding random load profile. Adapting some tests. --- build.gradle | 3 + docs/uml/main/TimeSeriesDatamodelConcept.puml | 46 ++++- .../uml/main/input/InputDatamodelConcept.puml | 14 -- .../timeseries/BDEWLoadProfileFactory.java | 60 +++--- .../timeseries/LoadProfileFactory.java | 10 +- .../timeseries/RandomLoadProfileFactory.java | 94 ++++++++++ .../io/naming/DefaultDirectoryHierarchy.java | 5 +- .../EntityPersistenceNamingStrategy.java | 23 +-- .../ie3/datamodel/io/processor/Processor.java | 4 +- .../processor/input/InputEntityProcessor.java | 1 - .../timeseries/TimeSeriesProcessor.java | 8 +- .../ie3/datamodel/io/source/EntitySource.java | 16 ++ .../io/source/LoadProfileSource.java | 74 ++++---- .../io/source/csv/CsvDataSource.java | 4 +- .../io/source/csv/CsvLoadProfileSource.java | 17 +- .../java/edu/ie3/datamodel/models/Season.java | 2 +- .../models/input/RandomLoadParameters.java | 177 ------------------ .../datamodel/models/profile/LoadProfile.java | 22 ++- .../repetitive/BDEWLoadProfileTimeSeries.java | 54 +++++- .../repetitive/LoadProfileInput.java | 56 ------ .../repetitive/LoadProfileTimeSeries.java | 27 ++- .../repetitive/RandomLoadProfileEntry.java | 35 ++++ .../RandomLoadProfileTimeSeries.java | 42 +++++ .../repetitive/RepetitiveTimeSeries.java | 2 +- ...m_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv | 97 ++++++++++ .../DBEWLoadProfileFactoryTest.groovy | 160 ++++++++++++++++ .../RandomLoadProfileFactoryTest.groovy | 153 +++++++++++++++ ...EntityPersistenceNamingStrategyTest.groovy | 57 +----- .../io/naming/FileNamingStrategyTest.groovy | 60 ++---- .../io/processor/ProcessorProviderTest.groovy | 10 +- .../input/InputEntityProcessorTest.groovy | 38 ---- .../timeseries/TimeSeriesProcessorTest.groovy | 12 +- .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../io/source/LoadProfileSourceTest.groovy | 33 ++++ .../io/source/csv/CsvDataSourceTest.groovy | 49 ++++- .../models/profile/LoadProfileTest.groovy | 147 ++++++++------- .../ie3/test/common/TimeSeriesTestData.groovy | 29 ++- 37 files changed, 1024 insertions(+), 619 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java create mode 100644 src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy diff --git a/build.gradle b/build.gradle index c3105ef23..7751064f1 100644 --- a/build.gradle +++ b/build.gradle @@ -67,6 +67,9 @@ dependencies { // Graphs implementation 'org.jgrapht:jgrapht-core:1.5.2' + // Statistics (for random load model) + implementation 'de.lmu.ifi.dbs.elki:elki:0.7.5' + // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" diff --git a/docs/uml/main/TimeSeriesDatamodelConcept.puml b/docs/uml/main/TimeSeriesDatamodelConcept.puml index 370f3b2e8..0acc0cf5f 100644 --- a/docs/uml/main/TimeSeriesDatamodelConcept.puml +++ b/docs/uml/main/TimeSeriesDatamodelConcept.puml @@ -22,11 +22,22 @@ package models { childNote .. input childNote .. voltagelevels - interface StandardLoadProfile { + interface LoadProfile { + getKey: String + + {static} parse(String): LoadProfile + + {static} getAllProfiles: LoadProfile[] + + {static} getProfile(T[], String): T + enum DefaultLoadProfiles + + enum RandomLoadProfile + } + + DefaultLoadProfiles --|> LoadProfile + RandomLoadProfile --|> LoadProfile + + interface StandardLoadProfile { + {static} parse(String): StandardLoadProfile } + StandardLoadProfile ..|> LoadProfile enum BdewLoadProfile { - key: String @@ -120,12 +131,22 @@ package models { } RepetitiveTimeSeries --|> TimeSeries - class LoadProfileInput { - - type: StandardLoadProfile - - dayOfWeekToHourlyValues: Map> + abstract class LoadProfileTimeSeries { + - loadProfile: StandardLoadProfile + - valueMapping: Map> + + getLoadProfile(): LoadProfile + # fromTime(ZonedDateTime): Key } - LoadProfileInput --|> RepetitiveTimeSeries - LoadProfileInput *-- StandardLoadProfile + LoadProfileTimeSeries --|> RepetitiveTimeSeries + LoadProfileTimeSeries *-- LoadProfile + + class BDEWLoadProfileTimeSeries {} + BDEWLoadProfileTimeSeries --|> LoadProfileTimeSeries + BDEWLoadProfileTimeSeries *-- BdewLoadProfileEntry + + class RandomLoadProfileTimeSeries {} + RandomLoadProfileTimeSeries --|> LoadProfileTimeSeries + RandomLoadProfileTimeSeries *-- RandomLoadProfileEntry abstract class TimeSeriesEntry { # value: V @@ -142,8 +163,21 @@ package models { class LoadProfileEntry { - dayOfWeek: DayOfWeek - quarterHourOfDay: int + + getDayOfWeek(): DayOfWeek + + getQuarterHourOfDay(): Integer } LoadProfileEntry --|> TimeSeriesEntry: <>:PValue + + class BdewLoadProfileEntry { + - season: Season + + getSeason(): Season + } + BdewLoadProfileEntry --|> LoadProfileEntry + + class RandomLoadProfileEntry { + - gev: GeneralizedExtremeValueDistribution + } + RandomLoadProfileEntry --|> LoadProfileEntry } } diff --git a/docs/uml/main/input/InputDatamodelConcept.puml b/docs/uml/main/input/InputDatamodelConcept.puml index 91f11c107..15badfeb0 100644 --- a/docs/uml/main/input/InputDatamodelConcept.puml +++ b/docs/uml/main/input/InputDatamodelConcept.puml @@ -142,20 +142,6 @@ package models { MeasurementUnitInput --|> AssetInput MeasurementUnitInput ..|> HasNodes - class RandomLoadParameter { - - quarterHour: int - - kWd: Double - - kSa: Double - - kSu: Double - - myWd: Double - - mySa: Double - - mySu: Double - - sigmaWd: Double - - sigmaSa: Double - - sigmaSu: Double - } - RandomLoadParameter --|> InputEntity - abstract class AssetTypeInput { - id: String } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java index 8d767c8c3..661046b5c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java @@ -8,16 +8,17 @@ import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; import static java.time.DayOfWeek.*; +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.Season; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.PValue; -import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.UUID; public class BDEWLoadProfileFactory extends LoadProfileFactory { @@ -31,82 +32,71 @@ public class BDEWLoadProfileFactory public static final String TRANSITION_SATURDAY = "TrSa"; public static final String TRANSITION_SUNDAY = "TrSu"; + public BDEWLoadProfileFactory() { + this(BDEWLoadProfileEntry.class); + } + public BDEWLoadProfileFactory(Class valueClass) { super(valueClass); } @Override - protected List buildModel(LoadProfileData data) { - List entries = new ArrayList<>(); + protected Set buildModel(LoadProfileData data) { int quarterHour = data.getInt(QUARTER_HOUR); - /* summer */ - entries.add( + return Set.of( new BDEWLoadProfileEntry( new PValue(data.getQuantity(SUMMER_WEEKDAY, KILOWATT)), Season.SUMMER, MONDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(SUMMER_SATURDAY, KILOWATT)), Season.SUMMER, SATURDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(SUMMER_SUNDAY, KILOWATT)), Season.SUMMER, SUNDAY, - quarterHour)); - - /* winter */ - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(WINTER_WEEKDAY, KILOWATT)), Season.WINTER, MONDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(WINTER_SATURDAY, KILOWATT)), Season.WINTER, SATURDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(WINTER_SUNDAY, KILOWATT)), Season.WINTER, SUNDAY, - quarterHour)); - - /* transition */ - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(TRANSITION_WEEKDAY, KILOWATT)), Season.TRANSITION, MONDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(TRANSITION_SATURDAY, KILOWATT)), Season.TRANSITION, SATURDAY, - quarterHour)); - entries.add( + quarterHour), new BDEWLoadProfileEntry( new PValue(data.getQuantity(TRANSITION_SUNDAY, KILOWATT)), Season.TRANSITION, SUNDAY, quarterHour)); - - return entries; } @Override protected List> getFields(Class entityClass) { return List.of( newSet( + QUARTER_HOUR, SUMMER_WEEKDAY, SUMMER_SATURDAY, SUMMER_SUNDAY, @@ -120,7 +110,17 @@ protected List> getFields(Class entityClass) { @Override public LoadProfileTimeSeries build( - UUID uuid, BdewStandardLoadProfile loadProfile, Set entries) { - return new BDEWLoadProfileTimeSeries(uuid, loadProfile, entries); + LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { + return new BDEWLoadProfileTimeSeries( + metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); + } + + @Override + public BdewStandardLoadProfile parseProfile(String profile) { + try { + return BdewStandardLoadProfile.get(profile); + } catch (ParsingException e) { + throw new FactoryException("An error occurred while parsing the profile: " + profile, e); + } } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 5b2a5e1ce..98856dd6c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -6,20 +6,22 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.io.factory.Factory; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; -import java.util.List; import java.util.Set; -import java.util.UUID; public abstract class LoadProfileFactory

    - extends Factory, List> { + extends Factory, Set> { public static final String QUARTER_HOUR = "quarterHour"; public LoadProfileFactory(Class valueClass) { super(valueClass); } - public abstract LoadProfileTimeSeries build(UUID uuid, P loadProfile, Set entries); + public abstract LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, Set data); + + public abstract P parseProfile(String profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java new file mode 100644 index 000000000..abb1d839e --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -0,0 +1,94 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; +import static java.time.DayOfWeek.*; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; +import java.util.List; +import java.util.Random; +import java.util.Set; + +public class RandomLoadProfileFactory + extends LoadProfileFactory { + public static final String K_WEEKDAY = "kWd"; + public static final String K_SATURDAY = "kSa"; + public static final String K_SUNDAY = "kSu"; + public static final String MY_WEEKDAY = "myWd"; + public static final String MY_SATURDAY = "mySa"; + public static final String MY_SUNDAY = "mySu"; + public static final String SIGMA_WEEKDAY = "sigmaWd"; + public static final String SIGMA_SATURDAY = "sigmaSa"; + public static final String SIGMA_SUNDAY = "sigmaSu"; + + public RandomLoadProfileFactory() { + super(RandomLoadProfileEntry.class); + } + + @Override + protected Set buildModel(LoadProfileData data) { + int quarterHour = data.getInt(QUARTER_HOUR); + return Set.of( + new RandomLoadProfileEntry( + new GeneralizedExtremeValueDistribution( + data.getDouble(MY_WEEKDAY), + data.getDouble(SIGMA_WEEKDAY), + data.getDouble(K_WEEKDAY), + RandomFactory.get(new Random().nextLong())), + MONDAY, + quarterHour), + new RandomLoadProfileEntry( + new GeneralizedExtremeValueDistribution( + data.getDouble(MY_SATURDAY), + data.getDouble(SIGMA_SATURDAY), + data.getDouble(K_SATURDAY), + RandomFactory.get(new Random().nextLong())), + SATURDAY, + quarterHour), + new RandomLoadProfileEntry( + new GeneralizedExtremeValueDistribution( + data.getDouble(MY_SUNDAY), + data.getDouble(SIGMA_SUNDAY), + data.getDouble(K_SUNDAY), + RandomFactory.get(new Random().nextLong())), + SUNDAY, + quarterHour)); + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + QUARTER_HOUR, + K_WEEKDAY, + K_SATURDAY, + K_SUNDAY, + MY_WEEKDAY, + MY_SATURDAY, + MY_SUNDAY, + SIGMA_WEEKDAY, + SIGMA_SATURDAY, + SIGMA_SUNDAY)); + } + + @Override + public LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { + return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); + } + + @Override + public LoadProfile parseProfile(String profile) { + return RANDOM_LOAD_PROFILE; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java b/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java index 5964b2433..fff633bbe 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java @@ -30,7 +30,6 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult; import edu.ie3.datamodel.models.timeseries.TimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -250,9 +249,7 @@ private enum SubDirectories { StorageTypeInput.class, WecTypeInput.class, OperatorInput.class, - WecCharacteristicInput.class, - RandomLoadParameters.class, - LoadProfileInput.class) + WecCharacteristicInput.class) .collect(Collectors.toSet())), PARTICIPANTS_INPUT( Constants.INPUT_SUB_TREE.resolve("participants"), diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index a13ffdc03..715052d5e 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy { * profile is accessible via the named capturing group "profile", the uuid by the group "uuid" */ private static final String LOAD_PROFILE_TIME_SERIES = - "lpts_(?[a-zA-Z][0-9])_(?" + UUID_STRING + ")"; + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?" + UUID_STRING + ")"; /** * Pattern to identify load profile time series in this instance of the naming strategy (takes @@ -215,8 +215,6 @@ public Optional getInputEntityName(Class cls) { return getTypeEntityName(cls.asSubclass(AssetTypeInput.class)); if (AssetInput.class.isAssignableFrom(cls)) return getAssetInputEntityName(cls.asSubclass(AssetInput.class)); - if (RandomLoadParameters.class.isAssignableFrom(cls)) - return getRandomLoadParametersEntityName(cls.asSubclass(RandomLoadParameters.class)); if (GraphicInput.class.isAssignableFrom(cls)) return getGraphicsInputEntityName(cls.asSubclass(GraphicInput.class)); if (OperatorInput.class.isAssignableFrom(cls)) @@ -274,19 +272,6 @@ public Optional getAssetCharacteristicsEntityName( return Optional.of(addPrefixAndSuffix(assetCharString)); } - /** - * Get the entity name for all {@link RandomLoadParameters} - * - * @param randomLoadParamClass the random load parameters class an entity name string should be - * generated from - * @return the entity name string - */ - public Optional getRandomLoadParametersEntityName( - Class randomLoadParamClass) { - String loadParamString = camelCaseToSnakeCase(randomLoadParamClass.getSimpleName()); - return Optional.of(addPrefixAndSuffix(loadParamString.concat("_input"))); - } - /** * Converts a given camel case string to its snake case representation * @@ -383,14 +368,14 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileInput) { + } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileTimeSeries) { return Optional.of( prefix .concat("lpts") .concat("_") - .concat(loadProfileInput.getLoadProfile().getKey()) + .concat(loadProfileTimeSeries.getLoadProfile().getKey()) .concat("_") - .concat(loadProfileInput.getUuid().toString()) + .concat(loadProfileTimeSeries.getUuid().toString()) .concat(suffix)); } else { logger.error("There is no naming strategy defined for {}", timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 253ac89da..8859babcc 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -224,6 +224,7 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "double", "String", "DayOfWeek", + "Season", "ChargingPointType", "EvcsLocationType" -> resultStringBuilder.append(methodReturnObject.toString()); case "Quantity", "ComparableQuantity" -> resultStringBuilder.append( @@ -260,7 +261,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S processVoltageLevel((VoltageLevel) methodReturnObject, fieldName)); case "Point", "LineString" -> resultStringBuilder.append( geoJsonWriter.write((Geometry) methodReturnObject)); - case "LoadProfile" -> resultStringBuilder.append(((LoadProfile) methodReturnObject).getKey()); + case "LoadProfile", "BdewStandardLoadProfile", "RandomLoadProfile" -> resultStringBuilder + .append(((LoadProfile) methodReturnObject).getKey()); case "AssetTypeInput", "BmTypeInput", "ChpTypeInput", diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index d21212531..18c6a723f 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -35,7 +35,6 @@ public class InputEntityProcessor extends EntityProcessor { List.of( /* InputEntity */ OperatorInput.class, - RandomLoadParameters.class, TimeSeriesMappingSource.MappingEntry.class, IdCoordinateInput.class, /* - AssetInput */ diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 52f1a602a..adb2783a5 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -13,8 +13,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; import java.lang.reflect.Method; import java.util.*; @@ -50,7 +49,10 @@ public class TimeSeriesProcessor< IndividualTimeSeries.class, TimeBasedValue.class, SValue.class), new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), - new TimeSeriesProcessorKey(LoadProfileInput.class, LoadProfileEntry.class, PValue.class)); + new TimeSeriesProcessorKey( + BDEWLoadProfileTimeSeries.class, BDEWLoadProfileEntry.class, PValue.class), + new TimeSeriesProcessorKey( + RandomLoadProfileTimeSeries.class, RandomLoadProfileEntry.class, PValue.class)); /** * Specific combination of time series class, entry class and value class, this processor is diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 95dd1e0dc..ba5e0a11f 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -11,12 +11,15 @@ import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.source.csv.CsvDataSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.utils.QuadFunction; import edu.ie3.datamodel.utils.TriFunction; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; +import java.nio.file.Path; import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; @@ -34,6 +37,9 @@ public abstract class EntitySource { protected static final Logger log = LoggerFactory.getLogger(EntitySource.class); + // path for build-in entities + private static final Path BUILD_INS = Path.of("src", "main", "resources"); + // convenience collectors protected static Collector> toMap() { @@ -94,6 +100,16 @@ protected static Try validate( .orElse(Try.Success.empty())); } + /** + * Method to get a source for the build in entities. + * + * @param subdirectory from the resource folder + * @return a new {@link CsvDataSource} + */ + protected static CsvDataSource getBuildInSource(Path subdirectory) { + return new CsvDataSource(",", BUILD_INS.resolve(subdirectory), new FileNamingStrategy()); + } + /** * Universal method to get a map: uuid to {@link UniqueEntity}. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index c4c0b5312..eeac6c210 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -5,32 +5,32 @@ */ package edu.ie3.datamodel.io.source; +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; + import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.BDEWLoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; -import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.factory.timeseries.RandomLoadProfileFactory; import edu.ie3.datamodel.io.source.csv.CsvDataSource; import edu.ie3.datamodel.io.source.csv.CsvLoadProfileSource; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfile; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.time.ZonedDateTime; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; public abstract class LoadProfileSource

    extends EntitySource { + private static final CsvDataSource buildInSource = getBuildInSource(Path.of("load")); protected final Class entryClass; protected final LoadProfileFactory entryFactory; @@ -47,7 +47,7 @@ protected LoadProfileSource(Class entryClass, LoadProfileFactory entryF * @param fieldToValues Mapping from field id to values * @return {@link Try} of simple time based value */ - protected Try, FactoryException> createEntries(Map fieldToValues) { + protected Try, FactoryException> createEntries(Map fieldToValues) { LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); return entryFactory.get(factoryData); } @@ -66,38 +66,36 @@ protected Try, FactoryException> createEntries(Map field * Method to read in the build-in {@link BdewStandardLoadProfile}s. * * @return a map: load profile to time series - * @throws SourceException if an exception occurred */ - public static Map - readBDEWStandardLoadProfiles() throws SourceException { - Path bdewLoadProfilePath = Path.of("src", "main", "resources", "load"); - CsvDataSource dataSource = - new CsvDataSource(",", bdewLoadProfilePath, new FileNamingStrategy()); - - BdewStandardLoadProfile[] implemented = BdewStandardLoadProfile.values(); - Map loadProfileInputs = new HashMap<>(); - - try { - for (CsvLoadProfileMetaInformation metaInformation : - dataSource.getCsvLoadProfileMetaInformation(implemented).values()) { - BdewStandardLoadProfile profile = BdewStandardLoadProfile.get(metaInformation.getProfile()); + public static Map getBDEWLoadProfiles() { + BDEWLoadProfileFactory factory = new BDEWLoadProfileFactory(); - Class entryClass = BDEWLoadProfileEntry.class; + return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() + .map( + metaInformation -> + (BDEWLoadProfileTimeSeries) + new CsvLoadProfileSource<>( + buildInSource, metaInformation, BDEWLoadProfileEntry.class, factory) + .getTimeSeries()) + .collect(Collectors.toMap(BDEWLoadProfileTimeSeries::getLoadProfile, Function.identity())); + } - CsvLoadProfileSource source = - new CsvLoadProfileSource<>( - dataSource, + /** + * Method to read in the build-in {@link RandomLoadProfileTimeSeries}. + * + * @return the random load profile time series + */ + public static RandomLoadProfileTimeSeries getRandomLoadProfile() { + CsvLoadProfileMetaInformation metaInformation = + buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).stream() + .findAny() + .orElseThrow(); + return (RandomLoadProfileTimeSeries) + new CsvLoadProfileSource<>( + buildInSource, metaInformation, - entryClass, - profile, - new BDEWLoadProfileFactory(entryClass)); - - loadProfileInputs.put(profile, (BDEWLoadProfileTimeSeries) source.getTimeSeries()); - } - - return loadProfileInputs; - } catch (ParsingException e) { - throw new SourceException("Unable to read standard load profiles due to: ", e); - } + RandomLoadProfileEntry.class, + new RandomLoadProfileFactory()) + .getTimeSeries(); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index ef77cbf69..322a1c9e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -131,7 +131,7 @@ public FileNamingStrategy getNamingStrategy() { * * @return A mapping from uuid to the load profile time series meta information */ - public Map getCsvLoadProfileMetaInformation( + public Set getCsvLoadProfileMetaInformation( LoadProfile... profiles) { return getTimeSeriesFilePaths(fileNamingStrategy.getLoadProfileTimeSeriesPattern()) .parallelStream() @@ -149,7 +149,7 @@ public Map getCsvLoadProfileMetaInformation || profiles.length == 0 || Stream.of(profiles) .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) - .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, Function.identity())); + .collect(Collectors.toSet()); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 9ef9ff656..e0d4e0e86 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -34,7 +34,6 @@ public CsvLoadProfileSource( CsvDataSource source, CsvLoadProfileMetaInformation metaInformation, Class entryClass, - P loadProfile, LoadProfileFactory entryFactory) { super(entryClass, entryFactory); this.dataSource = source; @@ -42,9 +41,7 @@ public CsvLoadProfileSource( /* Read in the full time series */ try { - this.loadProfileTimeSeries = - buildLoadProfileTimeSeries( - metaInformation.getUuid(), filePath, loadProfile, this::createEntries); + this.loadProfileTimeSeries = buildLoadProfileTimeSeries(metaInformation, this::createEntries); } catch (SourceException e) { throw new IllegalArgumentException( "Unable to obtain time series with UUID '" @@ -76,18 +73,16 @@ public List getTimeKeysAfter(ZonedDateTime time) { * entries are obtained entries with the help of {@code fieldToValueFunction}. If the file does * not exist, an empty Stream is returned. * - * @param timeSeriesUuid unique identifier of the time series - * @param filePath path to the file to read + * @param metaInformation containing an unique identifier of the time series, a path to the file + * to read as well as the profile * @param fieldToValueFunction function, that is able to transfer a mapping (from field to value) * onto a specific instance of the targeted entry class * @throws SourceException If the file cannot be read properly * @return an individual time series */ protected LoadProfileTimeSeries buildLoadProfileTimeSeries( - UUID timeSeriesUuid, - Path filePath, - P loadProfile, - Function, Try, FactoryException>> fieldToValueFunction) + CsvLoadProfileMetaInformation metaInformation, + Function, Try, FactoryException>> fieldToValueFunction) throws SourceException { Set entries = dataSource @@ -100,6 +95,6 @@ protected LoadProfileTimeSeries buildLoadProfileTimeSeries( .flatMap(Collection::stream) .collect(Collectors.toSet()); - return entryFactory.build(timeSeriesUuid, loadProfile, entries); + return entryFactory.build(metaInformation, entries); } } diff --git a/src/main/java/edu/ie3/datamodel/models/Season.java b/src/main/java/edu/ie3/datamodel/models/Season.java index 286dcf6af..5ba70fcb5 100644 --- a/src/main/java/edu/ie3/datamodel/models/Season.java +++ b/src/main/java/edu/ie3/datamodel/models/Season.java @@ -77,6 +77,6 @@ public String getKey() { @Override public String toString() { - return "Season{" + "key='" + key + '\'' + '}'; + return key; } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java b/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java deleted file mode 100644 index 2233cb144..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.input; - -import java.util.Objects; -import java.util.UUID; - -/** - * Data model to describe the parameters of a probability density function to draw random power - * consumptions. This model represents a generalized extreme value distribution (GEV), that has been - * sampled for each quarter hour of a day, subdivided into workdays, Saturdays and Sundays. In - * general the GEV is described by the three parameters "location", "scale" and "shape" - */ -public class RandomLoadParameters extends UniqueInputEntity { - - /** The respective quarter hour of the day */ - private final int quarterHour; - - /** Shape parameter for a working day */ - private final double kWd; - - /** Shape parameter for a Saturday */ - private final double kSa; - - /** Shape parameter for a Sunday */ - private final double kSu; - - /** Location parameter for a working day */ - private final double myWd; - - /** Location parameter for a Saturday */ - private final double mySa; - - /** Location parameter for a Sunday */ - private final double mySu; - - /** Scale parameter for a working day */ - private final double sigmaWd; - - /** Scale parameter for a Saturday */ - private final double sigmaSa; - - /** Scale parameter for a Sunday */ - private final double sigmaSu; - - /** - * @param uuid of the input entity - * @param quarterHour The respective quarter hour of the day - * @param kWd Shape parameter for a working day - * @param kSa Shape parameter for a Saturday - * @param kSu Shape parameter for a Sunday - * @param myWd Location parameter for a working day - * @param mySa Location parameter for a Saturday - * @param mySu Location parameter for a Sunday - * @param sigmaWd Scale parameter for a working day - * @param sigmaSa Scale parameter for a Saturday - * @param sigmaSu Scale parameter for a Sunday - */ - public RandomLoadParameters( - UUID uuid, - int quarterHour, - double kWd, - double kSa, - double kSu, - double myWd, - double mySa, - double mySu, - double sigmaWd, - double sigmaSa, - double sigmaSu) { - super(uuid); - this.quarterHour = quarterHour; - this.kWd = kWd; - this.kSa = kSa; - this.kSu = kSu; - this.myWd = myWd; - this.mySa = mySa; - this.mySu = mySu; - this.sigmaWd = sigmaWd; - this.sigmaSa = sigmaSa; - this.sigmaSu = sigmaSu; - } - - public int getQuarterHour() { - return quarterHour; - } - - public double getMyWd() { - return myWd; - } - - public double getMySa() { - return mySa; - } - - public double getMySu() { - return mySu; - } - - public double getSigmaWd() { - return sigmaWd; - } - - public double getSigmaSa() { - return sigmaSa; - } - - public double getSigmaSu() { - return sigmaSu; - } - - public double getkWd() { - return kWd; - } - - public double getkSa() { - return kSa; - } - - public double getkSu() { - return kSu; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof RandomLoadParameters that)) return false; - if (!super.equals(o)) return false; - return Objects.equals(quarterHour, that.quarterHour) - && Objects.equals(kWd, that.kWd) - && Objects.equals(kSa, that.kSa) - && Objects.equals(kSu, that.kSu) - && Objects.equals(myWd, that.myWd) - && Objects.equals(mySa, that.mySa) - && Objects.equals(mySu, that.mySu) - && Objects.equals(sigmaWd, that.sigmaWd) - && Objects.equals(sigmaSa, that.sigmaSa) - && Objects.equals(sigmaSu, that.sigmaSu); - } - - @Override - public int hashCode() { - return Objects.hash( - super.hashCode(), quarterHour, kWd, kSa, kSu, myWd, mySa, mySu, sigmaWd, sigmaSa, sigmaSu); - } - - @Override - public String toString() { - return "RandomLoadParameters{" - + "uuid=" - + getUuid() - + ", quarterHour=" - + quarterHour - + ", kWd=" - + kWd - + ", kSa=" - + kSa - + ", kSu=" - + kSu - + ", myWd=" - + myWd - + ", mySa=" - + mySa - + ", mySu=" - + mySu - + ", sigmaWd=" - + sigmaWd - + ", sigmaSa=" - + sigmaSa - + ", sigmaSu=" - + sigmaSu - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java index 5159c9940..c68ba3435 100644 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.util.Arrays; import java.util.stream.Collectors; +import java.util.stream.Stream; public interface LoadProfile extends Serializable { /** @return The identifying String */ @@ -28,12 +29,12 @@ static LoadProfile parse(String key) throws ParsingException { } static LoadProfile[] getAllProfiles() { - final LoadProfile[][] all = - new LoadProfile[][] { - BdewStandardLoadProfile.values(), NbwTemperatureDependantLoadProfile.values() - }; - - return Arrays.stream(all).flatMap(Arrays::stream).toArray(LoadProfile[]::new); + return Stream.of( + BdewStandardLoadProfile.values(), + NbwTemperatureDependantLoadProfile.values(), + (LoadProfile[]) RandomLoadProfile.values()) + .flatMap(Arrays::stream) + .toArray(LoadProfile[]::new); } /** @@ -70,4 +71,13 @@ public String getKey() { return "No load profile assigned"; } } + + enum RandomLoadProfile implements LoadProfile { + RANDOM_LOAD_PROFILE; + + @Override + public String getKey() { + return "random"; + } + } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java index 6df6a92f0..104a8182d 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java @@ -5,6 +5,10 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static java.lang.Math.pow; +import static java.lang.Math.round; + import edu.ie3.datamodel.models.Season; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.value.PValue; @@ -13,6 +17,10 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.function.Function; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a @@ -22,22 +30,50 @@ public class BDEWLoadProfileTimeSeries extends LoadProfileTimeSeries values) { - super(uuid, values, loadProfile, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); + super(uuid, loadProfile, values, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); + } + + @Override + public BdewStandardLoadProfile getLoadProfile() { + return (BdewStandardLoadProfile) super.getLoadProfile(); } @Override public PValue calc(ZonedDateTime time) { if (getLoadProfile() == BdewStandardLoadProfile.H0) { - PValue value = super.calc(time); - - // TODO: Add factor calculation - - return value; + /* For the residential average profile, a dynamization has to be taken into account */ + return dynamization(super.calc(time), time.getDayOfYear()); // leap years are ignored } else { return super.calc(time); } } + /** + * Calculates the dynamization factor for given day of year. Cf. + * Anwendung der repräsentativen Lastprofile - Step by step page 19 + * + * @param load load value + * @param t day of year (1-366) + * @return dynamization factor + */ + private PValue dynamization(PValue load, int t) { + double factor = + (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); + double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places + Function round = + l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place + + ComparableQuantity value = + load.getP() + .map(v -> v.getValue().doubleValue()) + .map(round) + .map(v -> Quantities.getQuantity(v, KILOWATT)) + .orElse(null); + + return new PValue(value); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -52,7 +88,7 @@ public int hashCode() { @Override public String toString() { - return "BDEWLoadProfileInput{" + return "BDEWLoadProfileTimeSeries{" + "uuid=" + getUuid() + "loadProfile=" @@ -63,7 +99,7 @@ public String toString() { } @Override - protected LoadProfileKey fromTime(ZonedDateTime time) { + protected Key fromTime(ZonedDateTime time) { Season season = Season.get(time); DayOfWeek day = @@ -76,5 +112,5 @@ protected LoadProfileKey fromTime(ZonedDateTime time) { return new BdewKey(season, day); } - private record BdewKey(Season season, DayOfWeek dayOfWeek) implements LoadProfileKey {} + private record BdewKey(Season season, DayOfWeek dayOfWeek) implements Key {} } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java deleted file mode 100644 index e08f69195..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.profile.StandardLoadProfile; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; - -// TODO This is a sample implementation, please implement a real scenario -@Deprecated -public class LoadProfileInput extends LoadProfileTimeSeries { - public LoadProfileInput(UUID uuid, StandardLoadProfile type, Set values) { - super(uuid, values, type, e -> new Key(e.getDayOfWeek())); - } - - public LoadProfileInput(StandardLoadProfile type, Set values) { - this(UUID.randomUUID(), type, values); - } - - @Override - protected LoadProfileKey fromTime(ZonedDateTime time) { - return new Key(time.getDayOfWeek()); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - return super.equals(o); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode()); - } - - @Override - public String toString() { - return "LoadProfileInput{" - + "uuid=" - + getUuid() - + "type=" - + getLoadProfile() - + ", dayOfWeekToHourlyValues=" - + getValueMapping() - + '}'; - } - - private record Key(DayOfWeek dayOfWeek) implements LoadProfileKey {} -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index d6344fd0b..ffeeb52f5 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -5,8 +5,11 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import static java.util.function.Function.identity; + import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; import java.time.ZonedDateTime; import java.util.Map; import java.util.Objects; @@ -21,10 +24,14 @@ public abstract class LoadProfileTimeSeries extends RepetitiveTimeSeries { private final LoadProfile loadProfile; - private final Map> valueMapping; + private final Map> valueMapping; + + public LoadProfileTimeSeries(UUID uuid, LoadProfile loadProfile, Set entries) { + this(uuid, loadProfile, entries, e -> new WeekDayKey(e.getDayOfWeek())); + } public LoadProfileTimeSeries( - UUID uuid, Set entries, LoadProfile loadProfile, Function extractor) { + UUID uuid, LoadProfile loadProfile, Set entries, Function extractor) { super(uuid, entries); this.loadProfile = loadProfile; @@ -33,8 +40,7 @@ public LoadProfileTimeSeries( .collect( Collectors.groupingBy( extractor, - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); + Collectors.toMap(LoadProfileEntry::getQuarterHourOfDay, identity()))); } /** Returns the {@link LoadProfile}. */ @@ -43,21 +49,24 @@ public LoadProfile getLoadProfile() { } /** Returns the value mapping. */ - protected Map> getValueMapping() { + protected Map> getValueMapping() { return valueMapping; } @Override protected PValue calc(ZonedDateTime time) { - LoadProfileKey key = fromTime(time); + Key key = fromTime(time); int quarterHour = time.getHour() * 4 + time.getMinute() / 15; + return valueMapping.get(key).get(quarterHour).getValue(); + } - return valueMapping.get(key).get(quarterHour); + protected Key fromTime(ZonedDateTime time) { + return new WeekDayKey(time.getDayOfWeek()); } - protected abstract LoadProfileKey fromTime(ZonedDateTime time); + public interface Key {} - public interface LoadProfileKey {} + private record WeekDayKey(DayOfWeek dayOfWeek) implements Key {} @Override @SuppressWarnings("unchecked") diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java new file mode 100644 index 000000000..aa63a413b --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java @@ -0,0 +1,35 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import tech.units.indriya.quantity.Quantities; + +/** Unique entry for a {@link RandomLoadProfileTimeSeries}. */ +public class RandomLoadProfileEntry extends LoadProfileEntry { + // distribution for random values + private final GeneralizedExtremeValueDistribution gev; + + public RandomLoadProfileEntry( + GeneralizedExtremeValueDistribution gev, DayOfWeek dayOfWeek, int quarterHourOfDay) { + super(new PValue(null), dayOfWeek, quarterHourOfDay); + this.gev = gev; + } + + @Override + public PValue getValue() { + double randomValue = gev.nextRandom(); + + while (randomValue < 0) { + randomValue = gev.nextRandom(); + } + return new PValue(Quantities.getQuantity(randomValue, KILOWATT)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java new file mode 100644 index 000000000..da340869c --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -0,0 +1,42 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { + public RandomLoadProfileTimeSeries( + UUID uuid, LoadProfile loadProfile, Set entries) { + super(uuid, loadProfile, entries); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "RandomLoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index 3a5c01209..e1f4e9f10 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -29,7 +29,7 @@ protected RepetitiveTimeSeries(UUID uuid, Set entries) { @Override public Optional getValue(ZonedDateTime time) { - return Optional.of(calc(time)); + return Optional.ofNullable(calc(time)); } @Override diff --git a/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv b/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv new file mode 100644 index 000000000..5a90edd42 --- /dev/null +++ b/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv @@ -0,0 +1,97 @@ +kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour +0.266806721687317,0.295997023582459,0.279087692499161,0.0610353946685791,0.0630703344941139,0.053140863776207,0.0357091873884201,0.0370676517486572,0.0293692331761122,0 +0.281179457902908,0.299608528614044,0.275292456150055,0.0560021996498108,0.058424074202776,0.0498424917459488,0.0319067053496838,0.0334825366735458,0.0265011098235846,1 +0.275563269853592,0.29670587182045,0.252942383289337,0.0528385005891323,0.0547995530068874,0.0472154095768929,0.0286294519901276,0.0310499873012304,0.0245211906731129,2 +0.268669873476028,0.278122246265411,0.222294941544533,0.0497889705002308,0.0522574931383133,0.0455464050173759,0.0267868731170893,0.0290201343595982,0.0230409931391478,3 +0.254242599010468,0.261944204568863,0.198370113968849,0.0480474047362804,0.0499211102724075,0.0444160588085651,0.025010583922267,0.0268981643021107,0.0216859001666307,4 +0.253653794527054,0.259219467639923,0.183828011155128,0.0465105324983597,0.0482752695679665,0.0433471724390984,0.0237453784793615,0.0254230201244354,0.0208296440541744,5 +0.232547923922539,0.22350800037384,0.151045009493828,0.0453270114958286,0.047629676759243,0.042874664068222,0.0228410512208939,0.0238813851028681,0.0201559588313103,6 +0.203599318861961,0.210258424282074,0.134497836232185,0.0445506721735001,0.0461143814027309,0.0425662696361542,0.0219020489603281,0.0230216048657894,0.0196861978620291,7 +0.161462053656578,0.199696600437164,0.119271591305733,0.0445012860000134,0.0455127842724323,0.0422079116106033,0.0207479763776064,0.0222345236688852,0.019109807908535,8 +0.132398754358292,0.181738555431366,0.0919454470276833,0.0439879409968853,0.0447122938930988,0.0418674796819687,0.0208074823021889,0.0220435112714767,0.0189618747681379,9 +0.141700059175491,0.172467365860939,0.089320495724678,0.0432550236582756,0.044278547167778,0.04146458953619,0.0204773582518101,0.0210072007030249,0.0188128501176834,10 +0.13490092754364,0.168581023812294,0.0863394215703011,0.0434850119054317,0.0437624379992485,0.0414730608463287,0.0204034727066755,0.0206510350108147,0.0187746584415436,11 +0.12891773879528,0.141391009092331,0.0815763771533966,0.0438057892024517,0.0438031405210495,0.0417981892824173,0.0202947575598955,0.020810017362237,0.0187485739588737,12 +0.0865642353892326,0.133543252944946,0.0992388054728508,0.0434134155511856,0.0436179116368294,0.0411902405321598,0.0195998474955559,0.0202769655734301,0.0186050590127707,13 +0.107326254248619,0.131506875157356,0.092495284974575,0.0422008074820042,0.0430818535387516,0.0411793626844883,0.0194479618221521,0.0201587229967117,0.0184435490518808,14 +0.12365210801363,0.138605788350105,0.0902709886431694,0.0423581749200821,0.0430288463830948,0.0415664203464985,0.0197580717504025,0.0195529088377953,0.018659807741642,15 +0.133885741233826,0.116305366158485,0.0866493508219719,0.0421508848667145,0.0430956780910492,0.0417333245277405,0.0191863905638456,0.0196987725794315,0.018691623583436,16 +0.114493139088154,0.109669730067253,0.11562417447567,0.0423808842897415,0.0430857576429844,0.0414095669984818,0.0193791724741459,0.0192934311926365,0.0187153313308954,17 +0.106474287807941,0.107617124915123,0.141828700900078,0.041958749294281,0.0426791086792946,0.0417547412216663,0.0191276986151934,0.0195350497961044,0.0195536445826292,18 +0.111373528838158,0.0949468687176705,0.143573239445686,0.0423438511788845,0.0426821634173393,0.0423176772892475,0.0193268302828074,0.0194729138165712,0.0196764413267374,19 +0.129695281386375,0.111747220158577,0.146539300680161,0.042476549744606,0.0431345589458942,0.0430354326963425,0.0200043357908726,0.0198324266821146,0.0201929099857807,20 +0.124765977263451,0.126777052879333,0.181237012147903,0.0424391217529774,0.0431524105370045,0.0431922376155853,0.0196738373488188,0.0196389146149158,0.0208003968000412,21 +0.166463151574135,0.128424167633057,0.222479611635208,0.0426704697310925,0.0434540957212448,0.0447872504591942,0.020222594961524,0.0205539185553789,0.0225220061838627,22 +0.15489549934864,0.121535487473011,0.279077500104904,0.0428037717938423,0.0438099093735218,0.0461413823068142,0.0201477259397507,0.0211283396929502,0.0241765789687634,23 +0.149270266294479,0.145163252949715,0.314658939838409,0.0454631112515926,0.0458601377904415,0.0499203614890575,0.0224028695374727,0.0220234617590904,0.0277903340756893,24 +0.190895333886147,0.153644308447838,0.411636203527451,0.0459029302000999,0.0457030460238457,0.0538441687822342,0.0229767691344023,0.0218722112476826,0.0328027196228504,25 +0.191453665494919,0.150224968791008,0.423471629619598,0.0472969971597195,0.047640148550272,0.0605787634849548,0.0232080388814211,0.0226516369730234,0.0382906869053841,26 +0.224633768200874,0.169333130121231,0.409934967756271,0.0484098829329014,0.0481277145445347,0.0650452002882957,0.0246889032423496,0.0234444178640842,0.0414291992783546,27 +0.23322768509388,0.195868730545044,0.387721389532089,0.0501904785633087,0.0495214238762856,0.0688034743070602,0.0260085947811604,0.0247648935765028,0.0444995686411858,28 +0.280531793832779,0.242264837026596,0.378016442060471,0.0515176840126514,0.0500866919755936,0.0698312446475029,0.0280240289866924,0.0263900514692068,0.044551245868206,29 +0.332535684108734,0.286791861057281,0.414923667907715,0.0538357272744179,0.0514319129288197,0.0683940351009369,0.0305218864232302,0.0274843797087669,0.0439568608999252,30 +0.356295973062515,0.335564076900482,0.428863227367401,0.055597260594368,0.0545664429664612,0.0673834607005119,0.0327046699821949,0.0305836349725723,0.0435638092458248,31 +0.381627827882767,0.356647431850433,0.41985896229744,0.0583727583289146,0.0575905330479145,0.066506527364254,0.0358871892094612,0.0332306325435638,0.042742770165205,32 +0.427426189184189,0.375110238790512,0.42010372877121,0.0632952600717545,0.0606768690049648,0.0665018707513809,0.0411307103931904,0.0364755131304264,0.0432239063084126,33 +0.418004125356674,0.411366045475006,0.413253307342529,0.0678070187568665,0.0630642250180244,0.0660132020711899,0.0440355911850929,0.0392848961055279,0.0416399873793125,34 +0.480116784572601,0.443256080150604,0.430845767259598,0.0709096193313599,0.0660979822278023,0.0664969906210899,0.0474613010883331,0.0422324053943157,0.0427436977624893,35 +0.492366999387741,0.433596074581146,0.438405454158783,0.0713961571455002,0.0694489479064941,0.0661367774009705,0.0493352487683296,0.0453926883637905,0.0428525730967522,36 +0.488669961690903,0.450059473514557,0.43893027305603,0.0731654316186905,0.0709325894713402,0.0653173625469208,0.050234030932188,0.0470801331102848,0.0422966778278351,37 +0.476427853107452,0.453100442886353,0.445331513881683,0.0735458433628082,0.0721306875348091,0.0635278075933456,0.0500484444200993,0.048948809504509,0.0411276556551456,38 +0.447788894176483,0.462226986885071,0.42346379160881,0.0715678483247757,0.0739922747015953,0.0632445514202118,0.0481005422770977,0.0500194020569324,0.0407665930688381,39 +0.448646247386932,0.481568813323975,0.437915831804276,0.0719510018825531,0.0743175819516182,0.0634156614542007,0.0479790642857552,0.0502395480871201,0.0411010235548019,40 +0.45268851518631,0.463462620973587,0.44245383143425,0.0715559348464012,0.0745281055569649,0.0629907771945,0.0486291088163853,0.0509366057813168,0.0407464392483234,41 +0.472129553556442,0.458590388298035,0.438809961080551,0.0714246481657028,0.0753235965967178,0.0624452345073223,0.0488574244081974,0.0513948574662209,0.0403173267841339,42 +0.465200632810593,0.482033789157867,0.437554955482483,0.07085170596838,0.0747058689594269,0.0618916675448418,0.0474738143384457,0.0496549904346466,0.0399090498685837,43 +0.463072091341019,0.485370546579361,0.430398672819138,0.070897750556469,0.0753868967294693,0.061828400939703,0.0477456152439117,0.0515857115387917,0.039817675948143,44 +0.504301607608795,0.495000720024109,0.421750038862228,0.071284644305706,0.0756229311227798,0.0619377642869949,0.0486843213438988,0.0521590225398541,0.0400484018027782,45 +0.494013756513596,0.502004504203796,0.431962072849274,0.0704603344202042,0.075153686106205,0.0622560419142246,0.04722835496068,0.0514012612402439,0.039880596101284,46 +0.480952113866806,0.475219011306763,0.427944034337997,0.0712133646011353,0.0757130458950996,0.0625443011522293,0.0476561672985554,0.0518420785665512,0.0402946658432484,47 +0.4861159324646,0.516651332378387,0.448401153087616,0.0710133090615273,0.0765742212533951,0.0628931447863579,0.0490181632339954,0.0527153052389622,0.0413180962204933,48 +0.505605041980743,0.523734390735626,0.470708280801773,0.0711066871881485,0.0766011476516724,0.0636289045214653,0.0492411740124226,0.0540735982358456,0.0423084460198879,49 +0.513229548931122,0.550731658935547,0.487264752388,0.0714162662625313,0.0776983126997948,0.0654886662960052,0.0496645383536816,0.0559630356729031,0.0443988926708698,50 +0.523128151893616,0.541519641876221,0.508733510971069,0.0719589814543724,0.0785757303237915,0.0667508617043495,0.0495718084275723,0.0566712841391563,0.0457895845174789,51 +0.505810618400574,0.511520206928253,0.512334108352661,0.0727487280964851,0.078390434384346,0.0674923211336136,0.0494792275130749,0.0563753582537174,0.0470927283167839,52 +0.523990094661713,0.521157741546631,0.502269566059113,0.0725650414824486,0.0767486467957497,0.0678139925003052,0.0510885566473007,0.0540808290243149,0.047186266630888,53 +0.505142688751221,0.510516762733459,0.473371058702469,0.0712223723530769,0.0750300288200378,0.067938931286335,0.0487538911402225,0.0511478036642075,0.0453384555876255,54 +0.49169534444809,0.497860074043274,0.440884381532669,0.0709625855088234,0.0743403211236,0.0676973983645439,0.0484340563416481,0.0499401353299618,0.0442236810922623,55 +0.449224293231964,0.49097341299057,0.43197637796402,0.0712493658065796,0.0736074447631836,0.0669783055782318,0.0481879562139511,0.0487863756716251,0.0432323180139065,56 +0.462083280086517,0.458611458539963,0.420163929462433,0.0710224434733391,0.0725374296307564,0.0672811642289162,0.0468299798667431,0.0484821572899818,0.0426194556057453,57 +0.466422975063324,0.431519895792007,0.411749631166458,0.0716194584965706,0.0718199908733368,0.0670692101120949,0.0491987094283104,0.0477711223065853,0.0421844013035297,58 +0.470720857381821,0.452195525169373,0.402273863554001,0.0716342553496361,0.0719970166683197,0.0668240934610367,0.0485116802155972,0.0467447564005852,0.0414865128695965,59 +0.464846402406693,0.438703387975693,0.404926747083664,0.0720167830586433,0.0727354884147644,0.0666147843003273,0.0477447547018528,0.0472656972706318,0.0414320714771748,60 +0.466590017080307,0.44343689084053,0.405802458524704,0.0720655098557472,0.072361558675766,0.0671483352780342,0.0480720065534115,0.0469786375761032,0.0417016632854939,61 +0.461378246545792,0.444682002067566,0.396851778030396,0.0718182176351547,0.0714400708675385,0.0669265314936638,0.047651831060648,0.0463756546378136,0.0415653325617313,62 +0.461525678634644,0.406780183315277,0.386990875005722,0.0716791599988937,0.0715874135494232,0.0669709593057632,0.0474572516977787,0.0466903038322926,0.0415439382195473,63 +0.447014361619949,0.414845287799835,0.384565651416779,0.0707539543509483,0.071328230202198,0.0670299381017685,0.0461493171751499,0.045212522149086,0.0411532782018185,64 +0.425164729356766,0.408224016427994,0.378880858421326,0.0712318941950798,0.0714204683899879,0.0676426440477371,0.0461742058396339,0.0446786060929298,0.0415577478706837,65 +0.406535506248474,0.39065757393837,0.390029609203339,0.0721957013010979,0.0714574679732323,0.0679289177060127,0.0468821786344051,0.0455186292529106,0.0415354371070862,66 +0.429334431886673,0.421460598707199,0.386443197727203,0.0720773190259933,0.0723162442445755,0.068557009100914,0.0471111163496971,0.0465410239994526,0.0424121767282486,67 +0.408385515213013,0.423402607440948,0.384852766990662,0.0731761381030083,0.0739946663379669,0.0693683549761772,0.0479194596409798,0.0479996241629124,0.043307401239872,68 +0.450928092002869,0.433510303497314,0.387267470359802,0.0732240453362465,0.0757285431027412,0.070844329893589,0.0488691031932831,0.0505488254129887,0.0446740724146366,69 +0.42838642001152,0.458660960197449,0.397508889436722,0.0737349465489388,0.076910100877285,0.0725433081388473,0.0485723651945591,0.0513449050486088,0.0462205372750759,70 +0.457528233528137,0.455272883176804,0.401177316904068,0.0746021792292595,0.0782865285873413,0.0737910494208336,0.0504703745245934,0.0534177497029305,0.0476498752832413,71 +0.477989226579666,0.449814409017563,0.415226876735687,0.0757969841361046,0.0819070339202881,0.0762551799416542,0.0521196164190769,0.0565894842147827,0.0500268675386906,72 +0.471660286188126,0.483049720525742,0.41699144244194,0.0772641450166702,0.0833683088421822,0.0779938697814941,0.0538835860788822,0.0582899935543537,0.0516200289130211,73 +0.462039291858673,0.484837472438812,0.417837411165237,0.0793179050087929,0.0855541229248047,0.0807979106903076,0.0558264814317226,0.0610172972083092,0.0537474788725376,74 +0.494239538908005,0.474657744169235,0.410433322191238,0.080167755484581,0.0883776918053627,0.0834952890872955,0.0563570857048035,0.0627634450793266,0.0555526539683342,75 +0.481115281581879,0.4631627202034,0.405094832181931,0.0810613483190537,0.0898661091923714,0.085809163749218,0.0574533082544804,0.063525564968586,0.0566239841282368,76 +0.481957763433456,0.444837510585785,0.392141699790955,0.0815427601337433,0.0908975899219513,0.0876085460186005,0.0575459823012352,0.0625557452440262,0.0570836253464222,77 +0.46474814414978,0.416785925626755,0.384859055280685,0.0834897756576538,0.0924627110362053,0.0896750018000603,0.0571116954088211,0.0623503513634205,0.0581204779446125,78 +0.446739017963409,0.395158112049103,0.372885912656784,0.0857851952314377,0.0973858460783958,0.0923485606908798,0.0588888488709927,0.0653925687074661,0.0595557168126106,79 +0.425965458154678,0.364043891429901,0.341714292764664,0.0874398797750473,0.102611370384693,0.0957552641630173,0.0598357506096363,0.0677491873502731,0.0603233315050602,80 +0.401139229536056,0.364588558673859,0.329459756612778,0.0885151326656342,0.102042146027088,0.097852848470211,0.0583052486181259,0.0661919564008713,0.0615657567977905,81 +0.386102288961411,0.331744521856308,0.310481607913971,0.088083989918232,0.102688789367676,0.0995604023337364,0.056625984609127,0.064409427344799,0.0617730244994164,82 +0.352426558732986,0.287841856479645,0.287958323955536,0.0899283438920975,0.103480368852615,0.100912734866142,0.0579833500087261,0.0627572685480118,0.0609871000051498,83 +0.356676459312439,0.279404014348984,0.266594916582108,0.0904190465807915,0.104584082961082,0.10176607966423,0.0583710223436356,0.0623739063739777,0.0608399920165539,84 +0.353478521108627,0.253417283296585,0.25350296497345,0.0909158438444138,0.105099938809872,0.103342562913895,0.0577074661850929,0.0616596378386021,0.0614556968212128,85 +0.299452573060989,0.232542738318443,0.223194167017937,0.0930669605731964,0.105844244360924,0.104641474783421,0.0584431923925877,0.0609173066914082,0.0607141107320786,86 +0.257176458835602,0.220698863267899,0.218866571784019,0.0945220738649368,0.107813261449337,0.104784607887268,0.0576106905937195,0.0613766200840473,0.0604684762656689,87 +0.257824391126633,0.227517262101173,0.207409575581551,0.092997707426548,0.104204557836056,0.102655082941055,0.0560135245323181,0.0604200474917889,0.058957364410162,88 +0.238055855035782,0.211737111210823,0.201141089200974,0.0910771638154984,0.0975786820054054,0.0979374051094055,0.0540145039558411,0.0561005882918835,0.0565716363489628,89 +0.238567247986794,0.227371960878372,0.204761475324631,0.0879477933049202,0.0902053341269493,0.0918598845601082,0.0529557727277279,0.0529294200241566,0.0533599480986595,90 +0.216722473502159,0.234640255570412,0.217169404029846,0.0868481546640396,0.0833379998803139,0.0849183723330498,0.0509745627641678,0.0489254035055637,0.0499787591397762,91 +0.231909289956093,0.24814073741436,0.230379953980446,0.0836911797523499,0.0766035988926888,0.0774712786078453,0.0496042557060719,0.0455812141299248,0.0460172258317471,92 +0.223331198096275,0.256241410970688,0.256796300411224,0.0792895033955574,0.070108599960804,0.0709625855088234,0.0472096875309944,0.0411984920501709,0.0422120206058025,93 +0.246469661593437,0.287815362215042,0.283796429634094,0.0738609507679939,0.0632559433579445,0.0643703117966652,0.043757751584053,0.0369679853320122,0.0378340892493725,94 +0.270621925592422,0.283220708370209,0.280689835548401,0.068959467113018,0.0578584857285023,0.0592832416296005,0.0411073453724384,0.032867755740881,0.0339051820337772,95 \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy new file mode 100644 index 000000000..834ca992d --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy @@ -0,0 +1,160 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.timeseries + +import static java.time.DayOfWeek.* + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.models.Season +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import spock.lang.Shared +import spock.lang.Specification + +class DBEWLoadProfileFactoryTest extends Specification { + @Shared + BDEWLoadProfileFactory factory + + @Shared + private Set allEntries + + def setupSpec() { + factory = new BDEWLoadProfileFactory() + + def data0 = new LoadProfileData([ + "SuSa": "74.6", + "SuSu": "68.8", + "SuWd": "71.5", + "TrSa": "75.8", + "TrSu": "68.3", + "TrWd": "73.0", + "WiSa": "70.0", + "WiSu": "63.2", + "WiWd": "65.5", + "quarterHour": "0" + ] as Map, BDEWLoadProfileEntry) + + def data1 = new LoadProfileData([ + "SuSa": "76.2", + "SuSu": "67.4", + "SuWd": "69.0", + "TrSa": "76.7", + "TrSu": "66.5", + "TrWd": "70.1", + "WiSa": "73.0", + "WiSu": "61.0", + "WiWd": "62.6", + "quarterHour": "1" + ] as Map, BDEWLoadProfileEntry) + + def data2 = new LoadProfileData([ + "SuSa": "77.7", + "SuSu": "65.7", + "SuWd": "66.3", + "TrSa": "77.7", + "TrSu": "64.6", + "TrWd": "67.1", + "WiSa": "75.9", + "WiSu": "58.9", + "WiWd": "59.6", + "quarterHour": "2" + ] as Map, BDEWLoadProfileEntry) + + allEntries = [ + factory.buildModel(data0), + factory.buildModel(data1), + factory.buildModel(data2) + ].flatten() as Set + } + + def "A BDEWLoadProfileFactory returns the correct fields"() { + given: + def expectedFields = [ + "SuSa", + "SuSu", + "SuWd", + "TrSa", + "TrSu", + "TrWd", + "WiSa", + "WiSu", + "WiWd", + "quarterHour" + ] as Set + + when: + def actual = factory.getFields(BDEWLoadProfileEntry) + + then: + actual.size() == 1 + actual.head() == expectedFields + } + + def "A BDEWLoadProfileFactory refuses to build from invalid data"() { + given: + def actualFields = factory.newSet("Wd", "Sa", "Su") + + when: + def actual = factory.validate(actualFields, BDEWLoadProfileEntry) + + then: + actual.failure + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BDEWLoadProfileEntry'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BDEWLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + "0: [quarterHour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd] or [quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd]\n" + } + + def "A BDEWLoadProfileFactory builds model from valid data"() { + given: + def data = [ + "SuSa": "74.6", + "SuSu": "68.8", + "SuWd": "71.5", + "TrSa": "75.8", + "TrSu": "68.3", + "TrWd": "73.0", + "WiSa": "70.0", + "WiSu": "63.2", + "WiWd": "65.5", + "quarterHour": "0" + ] as Map + + when: + def entries = factory.buildModel(new LoadProfileData<>(data, BDEWLoadProfileEntry)) + + then: + entries.size() == 9 + } + + def "A BDEWLoadProfileFactory builds time series from entries"() { + given: + UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") + LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "g0") + + + when: + def lpts = factory.build(metaInformation, allEntries) + + then: + lpts.loadProfile == BdewStandardLoadProfile.G0 + lpts.entries.size() == 27 + + lpts.valueMapping.keySet() == [ + new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SATURDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SUNDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, MONDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SATURDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SUNDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, MONDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SATURDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SUNDAY), + new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, MONDAY), + ] as Set + + lpts.valueMapping.values().every { it.size() == 3} + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy new file mode 100644 index 000000000..7ab6f8247 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -0,0 +1,153 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.timeseries + +import static java.time.DayOfWeek.* + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.models.profile.LoadProfile +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry +import spock.lang.Shared +import spock.lang.Specification + +class RandomLoadProfileFactoryTest extends Specification { + @Shared + RandomLoadProfileFactory factory + + @Shared + private Set allEntries + + def setupSpec() { + factory = new RandomLoadProfileFactory() + + def data0 = new LoadProfileData([ + "kSa": "0.266806721687317", + "kSu": "0.295997023582459", + "kWd": "0.279087692499161", + "mySa": "0.0610353946685791", + "mySu": "0.0630703344941139", + "myWd": "0.053140863776207", + "sigmaSa": "0.0357091873884201", + "sigmaSu": "0.0370676517486572", + "sigmaWd": "0.0293692331761122", + "quarterHour": "0" + ] as Map, RandomLoadProfileEntry) + + def data1 = new LoadProfileData([ + "kSa": "0.281179457902908", + "kSu": "0.299608528614044", + "kWd": "0.275292456150055", + "mySa": "0.0560021996498108", + "mySu": "0.058424074202776", + "myWd": "0.0498424917459488", + "sigmaSa": "0.0319067053496838", + "sigmaSu": "0.0334825366735458", + "sigmaWd": "0.0265011098235846", + "quarterHour": "1" + ] as Map, RandomLoadProfileEntry) + + def data2 = new LoadProfileData([ + "kSa": "0.275563269853592", + "kSu": "0.29670587182045", + "kWd": "0.252942383289337", + "mySa": "0.0528385005891323", + "mySu": "0.0547995530068874", + "myWd": "0.0472154095768929", + "sigmaSa": "0.0286294519901276", + "sigmaSu": "0.0310499873012304", + "sigmaWd": "0.0245211906731129", + "quarterHour": "2" + ] as Map, RandomLoadProfileEntry) + + allEntries = [ + factory.buildModel(data0), + factory.buildModel(data1), + factory.buildModel(data2) + ].flatten() as Set + } + + def "A RandomLoadProfileFactory returns the correct fields"() { + given: + def expectedFields = [ + "kSa", + "kSu", + "kWd", + "mySa", + "mySu", + "myWd", + "sigmaSa", + "sigmaSu", + "sigmaWd", + "quarterHour" + ] as Set + + when: + def actual = factory.getFields(RandomLoadProfileEntry) + + then: + actual.size() == 1 + actual.head() == expectedFields + } + + def "A RandomLoadProfileFactory refuses to build from invalid data"() { + given: + def actualFields = factory.newSet("Wd", "Sa", "Su") + + when: + def actual = factory.validate(actualFields, RandomLoadProfileEntry) + + then: + actual.failure + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadProfileEntry'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + "0: [kSa, kSu, kWd, mySa, mySu, myWd, quarterHour, sigmaSa, sigmaSu, sigmaWd] or [k_sa, k_su, k_wd, my_sa, my_su, my_wd, quarter_hour, sigma_sa, sigma_su, sigma_wd]\n" + } + + def "A RandomLoadProfileFactory builds model from valid data"() { + given: + def data = [ + "kSa": "0.266806721687317", + "kSu": "0.295997023582459", + "kWd": "0.279087692499161", + "mySa": "0.0610353946685791", + "mySu": "0.0630703344941139", + "myWd": "0.053140863776207", + "sigmaSa": "0.0357091873884201", + "sigmaSu": "0.0370676517486572", + "sigmaWd": "0.0293692331761122", + "quarterHour": "0" + ] as Map + + when: + def entries = factory.buildModel(new LoadProfileData<>(data, RandomLoadProfileEntry)) + + then: + entries.size() == 3 + } + + def "A RandomLoadProfileFactory builds time series from entries"() { + given: + UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") + LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "random") + + + when: + def lpts = factory.build(metaInformation, allEntries) + + then: + lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + lpts.entries.size() == 9 + + lpts.valueMapping.keySet() == [ + new LoadProfileTimeSeries.WeekDayKey(SATURDAY), + new LoadProfileTimeSeries.WeekDayKey(SUNDAY), + new LoadProfileTimeSeries.WeekDayKey(MONDAY), + ] as Set + + lpts.valueMapping.values().every { it.size() == 3} + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index f34873c24..434e3b70a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -9,7 +9,6 @@ import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -19,22 +18,8 @@ import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.BmInput -import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.EvInput -import edu.ie3.datamodel.models.input.system.EvcsInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import edu.ie3.datamodel.models.input.system.HpInput -import edu.ie3.datamodel.models.input.system.LoadInput -import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.datamodel.models.input.system.WecInput -import edu.ie3.datamodel.models.input.system.type.BmTypeInput -import edu.ie3.datamodel.models.input.system.type.ChpTypeInput -import edu.ie3.datamodel.models.input.system.type.EvTypeInput -import edu.ie3.datamodel.models.input.system.type.HpTypeInput -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput -import edu.ie3.datamodel.models.input.system.type.WecTypeInput +import edu.ie3.datamodel.models.input.system.* +import edu.ie3.datamodel.models.input.system.type.* import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile @@ -43,23 +28,13 @@ import edu.ie3.datamodel.models.result.connector.LineResult import edu.ie3.datamodel.models.result.connector.SwitchResult import edu.ie3.datamodel.models.result.connector.Transformer2WResult import edu.ie3.datamodel.models.result.connector.Transformer3WResult -import edu.ie3.datamodel.models.result.system.BmResult -import edu.ie3.datamodel.models.result.system.ChpResult -import edu.ie3.datamodel.models.result.system.EmResult -import edu.ie3.datamodel.models.result.system.EvResult -import edu.ie3.datamodel.models.result.system.EvcsResult -import edu.ie3.datamodel.models.result.system.FixedFeedInResult -import edu.ie3.datamodel.models.result.system.FlexOptionsResult -import edu.ie3.datamodel.models.result.system.LoadResult -import edu.ie3.datamodel.models.result.system.PvResult -import edu.ie3.datamodel.models.result.system.StorageResult -import edu.ie3.datamodel.models.result.system.WecResult +import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.RepetitiveTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits @@ -344,22 +319,6 @@ class EntityPersistenceNamingStrategyTest extends Specification { WecTypeInput || "wec_type_input" } - def "A EntityPersistenceNamingStrategy without pre- or suffixes should return valid strings for a Load Parameter Model"() { - given: "a naming strategy without pre- or suffixes" - EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - - when: - Optional res = strategy.getEntityName(modelClass) - - then: - res.present - res.get() == expectedString - - where: - modelClass || expectedString - RandomLoadParameters || "random_load_parameters_input" - } - def "A EntityPersistenceNamingStrategy without pre- or suffixes should return valid strings for a graphic input Model"() { given: "a naming strategy without pre- or suffixes" EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() @@ -452,12 +411,12 @@ class EntityPersistenceNamingStrategyTest extends Specification { IndividualTimeSeries | UUID.fromString("4881fda2-bcee-4f4f-a5bb-6a09bf785276") || "aa_its_c_4881fda2-bcee-4f4f-a5bb-6a09bf785276_zz" } - def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile input" () { + def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile time series" () { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - LoadProfileInput timeSeries = Mock(LoadProfileInput) + BDEWLoadProfileTimeSeries timeSeries = Mock(BDEWLoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: Optional actual = strategy.getEntityName(timeSeries) @@ -468,7 +427,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { where: clazz | uuid | type || expectedFileName - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" + BDEWLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index fceb34480..4902b03e5 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -12,7 +12,6 @@ import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -61,7 +60,7 @@ import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared @@ -199,7 +198,7 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffix should return valid directory path for load profile time series"() { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) when: def actual = strategy.getDirectoryPath(timeSeries) @@ -210,7 +209,7 @@ class FileNamingStrategyTest extends Specification { where: clazz || expected - LoadProfileInput || Path.of("test_grid", "input", "global") + LoadProfileTimeSeries || Path.of("test_grid", "input", "participants", "time_series") } def "A FileNamingStrategy with DefaultHierarchy and should return valid directory path for individual time series"() { @@ -335,38 +334,6 @@ class FileNamingStrategyTest extends Specification { WecTypeInput || Path.of("test_grid", "input", "global", "wec_type_input") } - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for a Load Parameter Model"() { - given: "a file naming strategy without pre- or suffixes" - def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - - when: - def res = strategy.getDirectoryPath(modelClass) - - then: - res.present - res.get() == expectedPath - - where: - modelClass || expectedPath - RandomLoadParameters || Path.of("test_grid", "input", "global") - } - - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid file path for a Load Parameter Model"() { - given: "a file naming strategy without pre- or suffixes" - def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - - when: - def res = strategy.getFilePath(modelClass) - - then: - res.present - res.get() == expectedPath - - where: - modelClass || expectedPath - RandomLoadParameters || Path.of("test_grid", "input", "global", "random_load_parameters_input") - } - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid file paths for a graphic input Model"() { given: "a file naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) @@ -431,9 +398,9 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffix should return valid file path for load profile time series"() { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: def actual = strategy.getFilePath(timeSeries) @@ -443,8 +410,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "global", "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304") + clazz | uuid | type || expectedFileName + LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") } def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for time series mapping"() { @@ -601,14 +568,13 @@ class FileNamingStrategyTest extends Specification { where: modelClass || expected - RandomLoadParameters || Optional.empty() TimeSeriesMappingSource.MappingEntry || Optional.empty() } def "A FileNamingStrategy with FlatHierarchy does return empty sub directory path for load profile time series"() { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) when: def actual = strategy.getDirectoryPath(timeSeries) @@ -739,9 +705,9 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with FlatHierarchy does return valid file path for load profile time series"() { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: def actual = strategy.getFilePath(timeSeries) @@ -752,7 +718,7 @@ class FileNamingStrategyTest extends Specification { where: clazz | uuid | type || expectedFilePath - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304") + LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") } def "A FileNamingStrategy with FlatHierarchy does return valid file path for individual time series"() { @@ -798,7 +764,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "global" + escapedFileSeparator + "lpts_(?[a-zA-Z][0-9])_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" } def "A FileNamingStrategy with FlatHierarchy returns correct individual time series file name pattern"() { @@ -820,7 +786,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "lpts_(?[a-zA-Z][0-9])_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" } def "Trying to extract time series meta information throws an Exception, if it is provided a malformed string"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index b5e145799..2362ebae8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -40,8 +40,12 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData @@ -60,7 +64,6 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData List knownEntityProcessors = [ /* InputEntity */ OperatorInput, - RandomLoadParameters, TimeSeriesMappingSource.MappingEntry, IdCoordinateInput, /* - AssetInput */ @@ -142,7 +145,8 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndPValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), - new TimeSeriesProcessorKey(LoadProfileInput, LoadProfileEntry, PValue) + new TimeSeriesProcessorKey(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue), + new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, RandomLoadProfileEntry, PValue) ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index 24b1a8198..051f48036 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -13,7 +13,6 @@ import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -363,43 +362,6 @@ class InputEntityProcessorTest extends Specification { actual == expected } - def "The InputEntityProcessor should serialize a provided RandomLoadParameters correctly"() { - given: - InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) - RandomLoadParameters parameters = new RandomLoadParameters( - UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), - 4, - 1.2, - 2.3, - 3.4, - 4.5, - 5.6, - 6.7, - 7.8, - 8.9, - 9.10 - ) - Map expected = [ - "uuid" : "a5b0f432-27b5-4b3e-b87a-61867b9edd79", - "quarterHour": "4", - "kWd" : "1.2", - "kSa" : "2.3", - "kSu" : "3.4", - "myWd" : "4.5", - "mySa" : "5.6", - "mySu" : "6.7", - "sigmaWd" : "7.8", - "sigmaSa" : "8.9", - "sigmaSu" : "9.1" - ] - - when: - Map actual = processor.handleEntity(parameters) - - then: - actual == expected - } - def "The InputEntityProcessor should serialize a provided WecTypeInput correctly"() { given: InputEntityProcessor processor = new InputEntityProcessor(WecTypeInput) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 671482420..4633b1e58 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -10,8 +10,10 @@ import edu.ie3.datamodel.io.processor.Processor import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification @@ -210,14 +212,14 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat actual == individualHeatAndSTimeSeriesProcessed } - def "A TimeSeriesProcessors handles a complete LoadProfileInput correctly"() { + def "A TimeSeriesProcessors handles a complete LoadProfileTimeSeries correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(LoadProfileInput, LoadProfileEntry, PValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue) when: - Set> actual = processor.handleTimeSeries(loadProfileInput) + Set> actual = processor.handleTimeSeries(loadProfileTimeSeries) then: - actual == loadProfileInputProcessed + actual == loadProfileTimeSeriesProcessed } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 2914504c4..43c7f65ab 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -236,7 +236,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("its_ph_56c20b88-c001-4225-8dac-cd13a75c6b48.csv").toFile().exists() testBaseFolderPath.resolve("its_pqh_83b577cc-06b1-47a1-bfff-ad648a00784b.csv").toFile().exists() testBaseFolderPath.resolve("its_c_a4bbcb77-b9d0-4b88-92be-b9a14a3e332b.csv").toFile().exists() - testBaseFolderPath.resolve("lpts_g2_b56853fe-b800-4c18-b324-db1878b22a28.csv").toFile().exists() + testBaseFolderPath.resolve("lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv").toFile().exists() testBaseFolderPath.resolve("its_weather_4fcbdfcd-4ff0-46dd-b0df-f3af7ae3ed98.csv").toFile().exists() } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy new file mode 100644 index 000000000..3f1b5b517 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -0,0 +1,33 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import spock.lang.Specification + +class LoadProfileSourceTest extends Specification { + + def "A LoadProfileSourceTest should read in all build-in BDEWStandardLoadProfiles"() { + when: + def profiles = LoadProfileSource.getBDEWLoadProfiles() + + then: + profiles.size() == 11 + BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } + profiles.values().every { it.entries.size() == 864} + } + + def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { + when: + def random = LoadProfileSource.randomLoadProfile + + then: + random.loadProfile == RANDOM_LOAD_PROFILE + random.entries.size() == 288 + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index 4979f8b77..f0721a805 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -6,9 +6,11 @@ package edu.ie3.datamodel.io.source.csv import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.models.input.system.LoadInput +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import spock.lang.Shared import spock.lang.Specification @@ -47,6 +49,8 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { FileNamingStrategy fileNamingStrategy @Shared Set timeSeriesPaths + @Shared + Set loadProfileTimeSeriesPaths @Shared DummyCsvSource dummyCsvSource @@ -66,6 +70,13 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { "its_c_c7b0d9d6-5044-4f51-80b4-f221d8b1f14b.csv" ].stream().map { file -> Path.of(file) }.collect(Collectors.toSet()) timeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } + + loadProfileTimeSeriesPaths = [ + "lpts_r1_aac618d5-f707-4000-8871-ea080c24df82.csv", + "lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448.csv", + "lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv" + ].stream().map { file -> Path.of(file) }.collect(Collectors.toSet()) + loadProfileTimeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } } def "A DataSource should contain a valid connector after initialization"() { @@ -300,13 +311,17 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { def "The CsvDataSource is able to provide correct paths to time series files"() { when: - def actual = dummyCsvSource.getIndividualTimeSeriesFilePaths() + def actualIndividual = dummyCsvSource.getTimeSeriesFilePaths(fileNamingStrategy.individualTimeSeriesPattern) + def actualLoad = dummyCsvSource.getTimeSeriesFilePaths(fileNamingStrategy.loadProfileTimeSeriesPattern) then: noExceptionThrown() - actual.size() == timeSeriesPaths.size() - actual.containsAll(timeSeriesPaths) + actualIndividual.size() == timeSeriesPaths.size() + actualIndividual.containsAll(timeSeriesPaths) + + actualLoad.size() == loadProfileTimeSeriesPaths.size() + actualLoad.containsAll(loadProfileTimeSeriesPaths) } def "The CsvDataSource is able to build correct uuid to meta information mapping"() { @@ -343,4 +358,32 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { then: actual == expected } + + def "The CsvDataSource is able to build correct load profile meta information"() { + given: + def expected = [ + new CsvLoadProfileMetaInformation(UUID.fromString("aac618d5-f707-4000-8871-ea080c24df82"), "r1", Path.of("lpts_r1_aac618d5-f707-4000-8871-ea080c24df82")), + new CsvLoadProfileMetaInformation(UUID.fromString("0b5059d9-dbf5-4047-85f7-522a43608448"), "r2", Path.of("lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448")), + new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) + ] as Set + + when: + def actual = dummyCsvSource.getCsvLoadProfileMetaInformation() + + then: + actual == expected + } + + def "The CsvDataSource is able to build correct load profile meta information when restricting load profile"() { + given: + def expected = [ + new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) + ] as Set + + when: + def actual = dummyCsvSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.G0) + + then: + actual == expected + } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy index 47b5e6fdf..d7fb77e5c 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.models.profile +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + import edu.ie3.datamodel.exceptions.ParsingException import spock.lang.Specification @@ -17,77 +19,78 @@ class LoadProfileTest extends Specification { actual == expected where: - key || expected - "h0" || BdewStandardLoadProfile.H0 - "h-0" || BdewStandardLoadProfile.H0 - "h_0" || BdewStandardLoadProfile.H0 - "H0" || BdewStandardLoadProfile.H0 - "H-0" || BdewStandardLoadProfile.H0 - "H_0" || BdewStandardLoadProfile.H0 - "l0" || BdewStandardLoadProfile.L0 - "l-0" || BdewStandardLoadProfile.L0 - "l_0" || BdewStandardLoadProfile.L0 - "L0" || BdewStandardLoadProfile.L0 - "L-0" || BdewStandardLoadProfile.L0 - "L_0" || BdewStandardLoadProfile.L0 - "l1" || BdewStandardLoadProfile.L1 - "l-1" || BdewStandardLoadProfile.L1 - "l_1" || BdewStandardLoadProfile.L1 - "L1" || BdewStandardLoadProfile.L1 - "L-1" || BdewStandardLoadProfile.L1 - "L_1" || BdewStandardLoadProfile.L1 - "l2" || BdewStandardLoadProfile.L2 - "l-2" || BdewStandardLoadProfile.L2 - "l_2" || BdewStandardLoadProfile.L2 - "L2" || BdewStandardLoadProfile.L2 - "L-2" || BdewStandardLoadProfile.L2 - "L_2" || BdewStandardLoadProfile.L2 - "g0" || BdewStandardLoadProfile.G0 - "g-0" || BdewStandardLoadProfile.G0 - "g_0" || BdewStandardLoadProfile.G0 - "G0" || BdewStandardLoadProfile.G0 - "G-0" || BdewStandardLoadProfile.G0 - "G_0" || BdewStandardLoadProfile.G0 - "g1" || BdewStandardLoadProfile.G1 - "g-1" || BdewStandardLoadProfile.G1 - "g_1" || BdewStandardLoadProfile.G1 - "G1" || BdewStandardLoadProfile.G1 - "G-1" || BdewStandardLoadProfile.G1 - "G_1" || BdewStandardLoadProfile.G1 - "g2" || BdewStandardLoadProfile.G2 - "g-2" || BdewStandardLoadProfile.G2 - "g_2" || BdewStandardLoadProfile.G2 - "G2" || BdewStandardLoadProfile.G2 - "G-2" || BdewStandardLoadProfile.G2 - "G_2" || BdewStandardLoadProfile.G2 - "g3" || BdewStandardLoadProfile.G3 - "g-3" || BdewStandardLoadProfile.G3 - "g_3" || BdewStandardLoadProfile.G3 - "G3" || BdewStandardLoadProfile.G3 - "G-3" || BdewStandardLoadProfile.G3 - "G_3" || BdewStandardLoadProfile.G3 - "g4" || BdewStandardLoadProfile.G4 - "g-4" || BdewStandardLoadProfile.G4 - "g_4" || BdewStandardLoadProfile.G4 - "G4" || BdewStandardLoadProfile.G4 - "G-4" || BdewStandardLoadProfile.G4 - "G_4" || BdewStandardLoadProfile.G4 - "g5" || BdewStandardLoadProfile.G5 - "g-5" || BdewStandardLoadProfile.G5 - "g_5" || BdewStandardLoadProfile.G5 - "G5" || BdewStandardLoadProfile.G5 - "G-5" || BdewStandardLoadProfile.G5 - "G_5" || BdewStandardLoadProfile.G5 - "g6" || BdewStandardLoadProfile.G6 - "g-6" || BdewStandardLoadProfile.G6 - "g_6" || BdewStandardLoadProfile.G6 - "G6" || BdewStandardLoadProfile.G6 - "G-6" || BdewStandardLoadProfile.G6 - "G_6" || BdewStandardLoadProfile.G6 - "ep1" || NbwTemperatureDependantLoadProfile.EP1 - "ez2" || NbwTemperatureDependantLoadProfile.EZ2 - "" || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE - null || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE + key || expected + "h0" || BdewStandardLoadProfile.H0 + "h-0" || BdewStandardLoadProfile.H0 + "h_0" || BdewStandardLoadProfile.H0 + "H0" || BdewStandardLoadProfile.H0 + "H-0" || BdewStandardLoadProfile.H0 + "H_0" || BdewStandardLoadProfile.H0 + "l0" || BdewStandardLoadProfile.L0 + "l-0" || BdewStandardLoadProfile.L0 + "l_0" || BdewStandardLoadProfile.L0 + "L0" || BdewStandardLoadProfile.L0 + "L-0" || BdewStandardLoadProfile.L0 + "L_0" || BdewStandardLoadProfile.L0 + "l1" || BdewStandardLoadProfile.L1 + "l-1" || BdewStandardLoadProfile.L1 + "l_1" || BdewStandardLoadProfile.L1 + "L1" || BdewStandardLoadProfile.L1 + "L-1" || BdewStandardLoadProfile.L1 + "L_1" || BdewStandardLoadProfile.L1 + "l2" || BdewStandardLoadProfile.L2 + "l-2" || BdewStandardLoadProfile.L2 + "l_2" || BdewStandardLoadProfile.L2 + "L2" || BdewStandardLoadProfile.L2 + "L-2" || BdewStandardLoadProfile.L2 + "L_2" || BdewStandardLoadProfile.L2 + "g0" || BdewStandardLoadProfile.G0 + "g-0" || BdewStandardLoadProfile.G0 + "g_0" || BdewStandardLoadProfile.G0 + "G0" || BdewStandardLoadProfile.G0 + "G-0" || BdewStandardLoadProfile.G0 + "G_0" || BdewStandardLoadProfile.G0 + "g1" || BdewStandardLoadProfile.G1 + "g-1" || BdewStandardLoadProfile.G1 + "g_1" || BdewStandardLoadProfile.G1 + "G1" || BdewStandardLoadProfile.G1 + "G-1" || BdewStandardLoadProfile.G1 + "G_1" || BdewStandardLoadProfile.G1 + "g2" || BdewStandardLoadProfile.G2 + "g-2" || BdewStandardLoadProfile.G2 + "g_2" || BdewStandardLoadProfile.G2 + "G2" || BdewStandardLoadProfile.G2 + "G-2" || BdewStandardLoadProfile.G2 + "G_2" || BdewStandardLoadProfile.G2 + "g3" || BdewStandardLoadProfile.G3 + "g-3" || BdewStandardLoadProfile.G3 + "g_3" || BdewStandardLoadProfile.G3 + "G3" || BdewStandardLoadProfile.G3 + "G-3" || BdewStandardLoadProfile.G3 + "G_3" || BdewStandardLoadProfile.G3 + "g4" || BdewStandardLoadProfile.G4 + "g-4" || BdewStandardLoadProfile.G4 + "g_4" || BdewStandardLoadProfile.G4 + "G4" || BdewStandardLoadProfile.G4 + "G-4" || BdewStandardLoadProfile.G4 + "G_4" || BdewStandardLoadProfile.G4 + "g5" || BdewStandardLoadProfile.G5 + "g-5" || BdewStandardLoadProfile.G5 + "g_5" || BdewStandardLoadProfile.G5 + "G5" || BdewStandardLoadProfile.G5 + "G-5" || BdewStandardLoadProfile.G5 + "G_5" || BdewStandardLoadProfile.G5 + "g6" || BdewStandardLoadProfile.G6 + "g-6" || BdewStandardLoadProfile.G6 + "g_6" || BdewStandardLoadProfile.G6 + "G6" || BdewStandardLoadProfile.G6 + "G-6" || BdewStandardLoadProfile.G6 + "G_6" || BdewStandardLoadProfile.G6 + "ep1" || NbwTemperatureDependantLoadProfile.EP1 + "ez2" || NbwTemperatureDependantLoadProfile.EZ2 + "random" || RANDOM_LOAD_PROFILE + "" || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE + null || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE } def "Standard load profiles can be parsed correctly"() { @@ -184,6 +187,6 @@ class LoadProfileTest extends Specification { then: def e = thrown(ParsingException) - e.message == "No predefined load profile with key 'not_a_key' found. Please provide one of the following keys: h0, l0, l1, l2, g0, g1, g2, g3, g4, g5, g6, ep1, ez2" + e.message == "No predefined load profile with key 'not_a_key' found. Please provide one of the following keys: h0, l0, l1, l2, g0, g1, g2, g3, g4, g5, g6, ep1, ez2, random" } } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 9a27b149c..a0a641cab 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -9,14 +9,16 @@ import static edu.ie3.util.quantities.PowerSystemUnits.* import static tech.units.indriya.unit.Units.CELSIUS import static tech.units.indriya.unit.Units.METRE_PER_SECOND +import edu.ie3.datamodel.models.Season import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory @@ -394,41 +396,50 @@ trait TimeSeriesTestData { ] as LinkedHashMap ] as Set - LoadProfileInput loadProfileInput = new LoadProfileInput( - UUID.fromString("b56853fe-b800-4c18-b324-db1878b22a28"), + BDEWLoadProfileTimeSeries loadProfileTimeSeries = new BDEWLoadProfileTimeSeries( + UUID.fromString("b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc"), BdewStandardLoadProfile.G2, [ - new LoadProfileEntry( + new BDEWLoadProfileEntry( new PValue(Quantities.getQuantity(5d, KILOWATT)), + Season.SUMMER, DayOfWeek.MONDAY, 0 ), - new LoadProfileEntry( + new BDEWLoadProfileEntry( new PValue(Quantities.getQuantity(15d, KILOWATT)), + Season.SUMMER, DayOfWeek.MONDAY, 1 ), - new LoadProfileEntry( + new BDEWLoadProfileEntry( new PValue(Quantities.getQuantity(10d, KILOWATT)), + Season.SUMMER, DayOfWeek.MONDAY, 2 ) ] as Set ) - Set> loadProfileInputProcessed = [ + Set> loadProfileTimeSeriesProcessed = [ [ "dayOfWeek" : "MONDAY", + "loadProfile": "g2", + "season": "su", "p" : "5.0", "quarterHourOfDay" : "0" ] as LinkedHashMap, [ "dayOfWeek" : "MONDAY", + "loadProfile": "g2", + "season": "su", "p" : "15.0", "quarterHourOfDay" : "1" ] as LinkedHashMap, [ "dayOfWeek" : "MONDAY", + "loadProfile": "g2", + "season": "su", "p" : "10.0", "quarterHourOfDay" : "2" ] as LinkedHashMap @@ -443,6 +454,6 @@ trait TimeSeriesTestData { individualPTimeSeries, individualSTimeSeries, individualWeatherTimeSeries, - loadProfileInput + loadProfileTimeSeries ] } \ No newline at end of file From 240da4b4542a9562831caac325075415fc5bad1a Mon Sep 17 00:00:00 2001 From: PhilippSchmelter Date: Tue, 27 Aug 2024 14:35:57 +0200 Subject: [PATCH 106/310] Final --- docs/readthedocs/models/input/participant/pv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/models/input/participant/pv.md b/docs/readthedocs/models/input/participant/pv.md index 8b44140a1..f91f1801b 100644 --- a/docs/readthedocs/models/input/participant/pv.md +++ b/docs/readthedocs/models/input/participant/pv.md @@ -40,7 +40,7 @@ Detailed model of a photovoltaic power plant. * - albedo - - - `Albedo `_ of the plant's surrounding + - [Albedo](https://en.wikipedia.org/wiki/Albedo) of the plant's surrounding * - azimuth - ° From 62564e25035498e5555caac9fd757952c8c4c6dd Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Fri, 30 Aug 2024 09:06:35 +0200 Subject: [PATCH 107/310] changes after review --- .../edu/ie3/datamodel/io/DbGridMetadata.java | 8 +++---- .../java/edu/ie3/datamodel/io/SqlUtils.java | 2 +- .../edu/ie3/datamodel/io/sink/SqlSink.java | 12 ++++------ .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 23 +------------------ .../datamodel/io/sink/_sql/input_entities.sql | 19 ++++++++------- .../datamodel/io/sink/_sql/sql_test_data.sql | 16 ------------- 6 files changed, 19 insertions(+), 61 deletions(-) delete mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql diff --git a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java index 2a2d0d72c..b613f0894 100644 --- a/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java +++ b/src/main/java/edu/ie3/datamodel/io/DbGridMetadata.java @@ -13,12 +13,12 @@ /** Class for identification of entities and results from grids in SQL databases. */ public record DbGridMetadata(String gridName, UUID uuid) { - public static final String GRID_TABLE = "grids"; - public static final String GRID_NAME = "grid_name"; - public static final String GRID_UUID = "grid_uuid"; + public static final String GRID_TABLE_COLUMN = "grids"; + public static final String GRID_NAME_COLUMN = "grid_name"; + public static final String GRID_UUID_COLUMN = "grid_uuid"; public String toString() { - return GRID_NAME + "=" + gridName + ", " + GRID_UUID + "=" + uuid.toString(); + return GRID_NAME_COLUMN + "=" + gridName + ", " + GRID_UUID_COLUMN + "=" + uuid.toString(); } /** @return Stream with grid uuid */ diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index 880a459ae..0fd51d529 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -25,7 +25,7 @@ private static String beginQueryCreateTable(String schemaName, String tableName) /** @return query to create a SQL table for a grid */ public static String queryCreateGridTable(String schemaName) { - return beginQueryCreateTable(schemaName, DbGridMetadata.GRID_TABLE) + return beginQueryCreateTable(schemaName, DbGridMetadata.GRID_TABLE_COLUMN) + "\tuuid uuid PRIMARY KEY,\n\tname TEXT NOT NULL\n" + endQueryCreateTable; } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index f150e0065..3345f8509 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -106,17 +106,13 @@ public void persistAll(Collection entities, DbGridMetadata persistMixedList( entitiesToAdd.stream().filter(ent -> cls.isAssignableFrom(ent.getClass())).toList(), identifier); - entitiesToAdd.removeIf( - ent -> - cls.isAssignableFrom( - ent.getClass())); // maybe it's not necessary, but I'm not sure if there are - // entities who aren't in the hierarchic structure + entitiesToAdd.removeIf(ent -> cls.isAssignableFrom(ent.getClass())); } persistMixedList(new ArrayList<>(entitiesToAdd), identifier); // persist left entities } /** - * Persist an entity. By default this method take care about the extraction process of nested + * Persist an entity. By default this method takes care of the extraction process of nested * entities (if any) * * @param entity the entity that should be persisted @@ -456,7 +452,7 @@ private static String basicInsertQuery(String schemaName, String tableName) { /** Provides the insert, column names, grid identifier and the VALUES statement for a query. */ private String basicInsertQueryValuesGrid( String schemaName, String tableName, String[] headerElements) { - String[] addParams = {DbGridMetadata.GRID_UUID}; + String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN}; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) @@ -469,7 +465,7 @@ private String basicInsertQueryValuesGrid( */ private String basicInsertQueryValuesITS( String schemaName, String tableName, String[] headerElements) { - String[] addParams = {DbGridMetadata.GRID_UUID, TIME_SERIES}; + String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN, TIME_SERIES}; return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 13be399c5..9e45cf059 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -130,28 +130,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) SqlSink sink = new SqlSink(schemaName, - new ProcessorProvider([ - new ResultEntityProcessor(PvResult), - new ResultEntityProcessor(WecResult), - new ResultEntityProcessor(EvResult), - new ResultEntityProcessor(EvcsResult), - new ResultEntityProcessor(EmResult), - new ResultEntityProcessor(FlexOptionsResult), - new InputEntityProcessor(Transformer2WInput), - new InputEntityProcessor(NodeInput), - new InputEntityProcessor(EvcsInput), - new InputEntityProcessor(Transformer2WTypeInput), - new InputEntityProcessor(LineGraphicInput), - new InputEntityProcessor(NodeGraphicInput), - new InputEntityProcessor(CylindricalStorageInput), - new InputEntityProcessor(ThermalHouseInput), - new InputEntityProcessor(OperatorInput), - new InputEntityProcessor(LineInput), - new InputEntityProcessor(ThermalBusInput), - new InputEntityProcessor(LineTypeInput), - new InputEntityProcessor(LoadInput), - new InputEntityProcessor(EmInput) - ], timeSeriesProcessorMap), + new ProcessorProvider(), namingStrategy, connector) UUID inputModel = UUID.fromString("22bea5fc-2cb2-4c61-beb9-b476e0107f52") diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index f53c01c27..9b63f3fba 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -79,18 +79,17 @@ CREATE TABLE public.node_graphic_input CREATE TABLE public.cylindrical_storage_input ( - uuid UUID PRIMARY KEY, + uuid uuid PRIMARY KEY, c DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, - inlet_temp DOUBLE PRECISION NOT NULL, - operates_from TIMESTAMP WITH TIME ZONE, - operates_until TIMESTAMP WITH TIME ZONE, - operator UUID, - return_temp DOUBLE PRECISION NOT NULL, - storage_volume_lvl DOUBLE PRECISION NOT NULL, - storage_volume_lvl_min DOUBLE PRECISION NOT NULL, - thermal_bus UUID NOT NULL, - grid_uuid UUID NOT NULL REFERENCES grids(uuid) + inlet_temp double precision NOT NULL, + operates_from timestamp with time zone, + operates_until timestamp with time zone, + operator uuid, + return_temp double precision NOT NULL, + storage_volume_lvl double precision NOT NULL, + thermal_bus uuid NOT NULL, + grid_uuid uuid NOT NULL ) WITHOUT OIDS TABLESPACE pg_default; diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql deleted file mode 100644 index 5a329811c..000000000 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/sql_test_data.sql +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE public.test_data_sql -( - uuid UUID PRIMARY KEY, - time_series UUID NOT NULL, - time TIMESTAMP WITH TIME ZONE NOT NULL, - p DOUBLE PRECISION NOT NULL -) - WITHOUT OIDS - TABLESPACE pg_default; - -CREATE INDEX test_data_sql_series_id ON test_data_sql USING hash (time_series); - --- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html --- Column time_series needs to placed as the first argument since we at most use an equality constraint on --- time_series and a range query on time. -CREATE UNIQUE INDEX test_data_sql_series_time ON test_data_sql USING btree (time_series, time); \ No newline at end of file From 802d4d242cdb5665638ea24a7cb9dcf95fec69ac Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Fri, 30 Aug 2024 09:42:58 +0200 Subject: [PATCH 108/310] fixing Sonarqube --- .../java/edu/ie3/datamodel/io/SqlUtils.java | 4 +-- .../datamodel/io/connectors/SqlConnector.java | 24 -------------- .../edu/ie3/datamodel/io/sink/SqlSink.java | 31 ++++++++++--------- .../io/source/sql/SqlDataSource.java | 4 --- 4 files changed, 18 insertions(+), 45 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java index 0fd51d529..501c8c6aa 100644 --- a/src/main/java/edu/ie3/datamodel/io/SqlUtils.java +++ b/src/main/java/edu/ie3/datamodel/io/SqlUtils.java @@ -12,7 +12,7 @@ public class SqlUtils { protected static final Logger log = LoggerFactory.getLogger(SqlUtils.class); - private static final String endQueryCreateTable = + private static final String END_QUERY_CREATE_TABLE = ")\n \t WITHOUT OIDS\n \t TABLESPACE pg_default;"; private SqlUtils() { @@ -27,7 +27,7 @@ private static String beginQueryCreateTable(String schemaName, String tableName) public static String queryCreateGridTable(String schemaName) { return beginQueryCreateTable(schemaName, DbGridMetadata.GRID_TABLE_COLUMN) + "\tuuid uuid PRIMARY KEY,\n\tname TEXT NOT NULL\n" - + endQueryCreateTable; + + END_QUERY_CREATE_TABLE; } /** diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index e16d69a6b..b1e463180 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -160,28 +160,4 @@ public Map extractFieldMap(ResultSet rs) { } return insensitiveFieldsToAttributes; } - - /** - * Executes a query to check if a table exists - * - * @param tableName Name of the table, that should be checked - * @return True, if the table exists - */ - public boolean tableExistsSQL(String tableName) { - String query = - "SELECT count(*) " - + "FROM information_schema.tables " - + "WHERE table_name = ?" - + "LIMIT 1;"; - try (PreparedStatement ps = getConnection().prepareStatement(query)) { - ps.setString(1, tableName); - - ResultSet resultSet = ps.executeQuery(); - resultSet.next(); - return resultSet.getInt(1) != 0; - } catch (SQLException e) { - log.error("Error during execution of query {}", query, e); - } - return false; - } } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 3345f8509..06e4c646c 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -193,10 +193,7 @@ private , V extends Value> void p } else if (ResultEntity.class.isAssignableFrom(cls)) { insertListIgnoreNested(entities, cls, identifier, false); } else if (TimeSeries.class.isAssignableFrom(cls)) { - entities.forEach( - ts -> { - persistTimeSeries((TimeSeries) ts, identifier); - }); + entities.forEach(ts -> persistTimeSeries((TimeSeries) ts, identifier)); } else { log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); } @@ -262,20 +259,24 @@ private , V extends Value> void persistTimeSeries( identifier, timeSeries.getUuid().toString())) .collect(Collectors.joining(",\n", "", ";")); - try { - connector.executeUpdate(query); - } catch (SQLException e) { - throw new RuntimeException( - String.format( - "An error occurred during extraction of the time series, SQLReason: '%s'", - e.getMessage()), - e); - } + executeQueryToPersist(query); } catch (ProcessorProviderException e) { throw new ProcessorProviderException("Exception occurred during processor request: ", e); } } + private void executeQueryToPersist(String query) { + try { + connector.executeUpdate(query); + } catch (SQLException e) { + throw new RuntimeException( + String.format( + "An error occurred during extraction of the time series, SQLReason: '%s'", + e.getMessage()), + e); + } + } + /** Persists a whole {@link JointGridContainer}. */ public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) { DbGridMetadata identifier = new DbGridMetadata(jointGridContainer.getGridName(), gridUUID); @@ -427,13 +428,13 @@ private String queryTimeSeriesValueLine( Map entityFieldData, String[] headerElements, DbGridMetadata identifier, - String TSuuid) { + String tsUuid) { return writeOneLine( Stream.concat( Stream.concat( Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), - Stream.of(quote(TSuuid, "'")))); + Stream.of(quote(tsUuid, "'")))); } private LinkedHashMap sqlEntityFieldData( diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java index 6db92daa0..7fafca42a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java @@ -190,8 +190,4 @@ protected Stream> executeQuery(String query, AddParams addPa protected Stream> executeQuery(String query) { return executeQuery(query, x -> {}); } - - public boolean checkExistingTable(String tableName) throws SQLException { - return connector.tableExistsSQL(tableName); - } } From a3734faee5c548ef0b5362f73e936a62487c0aca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 11:36:30 +0000 Subject: [PATCH 109/310] Bump net.bytebuddy:byte-buddy from 1.15.0 to 1.15.1 (#1146) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c188005c6..69e8a2c08 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.0' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.1' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From ec463e0ccd5331dcfb73b8c88a7dac2c43d69988 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 07:41:25 +0000 Subject: [PATCH 110/310] Bump org.locationtech.jts:jts-core from 1.19.0 to 1.20.0 (#1149) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 69e8a2c08..604323887 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ dependencies { implementation 'tech.units:indriya:2.2' // JTS Topology Suite for GeoPositions, License: EPL 1.0 / EDL 1.0 - implementation ('org.locationtech.jts:jts-core:1.19.0'){ + implementation ('org.locationtech.jts:jts-core:1.20.0'){ exclude group: 'junit', module: 'junit' } From f059052e03ac73b414a2d717a7c2e2523da322f0 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 4 Sep 2024 14:44:39 +0200 Subject: [PATCH 111/310] Improving load profile time series. --- .../io/connectors/CsvFileConnector.java | 3 +- .../datamodel/io/csv/CsvFileDefinition.java | 2 +- .../timeseries/BDEWLoadProfileFactory.java | 126 ----------- .../timeseries/BdewLoadProfileFactory.java | 89 ++++++++ .../factory/timeseries/LoadProfileData.java | 6 +- .../timeseries/LoadProfileFactory.java | 11 +- .../timeseries/RandomLoadProfileFactory.java | 57 ++--- .../EntityPersistenceNamingStrategy.java | 2 +- .../io/naming/FileNamingStrategy.java | 4 +- .../io/processor/ProcessorProvider.java | 4 +- .../timeseries/TimeSeriesProcessor.java | 11 +- .../ie3/datamodel/io/sink/CsvFileSink.java | 4 +- .../edu/ie3/datamodel/io/sink/DataSink.java | 2 +- .../ie3/datamodel/io/sink/InfluxDbSink.java | 11 +- .../io/source/LoadProfileSource.java | 33 +-- .../io/source/csv/CsvLoadProfileSource.java | 21 +- .../models/{Season.java => BdewSeason.java} | 8 +- .../models/timeseries/TimeSeries.java | 2 +- .../repetitive/BDEWLoadProfileEntry.java | 56 ----- .../repetitive/BDEWLoadProfileTimeSeries.java | 116 ---------- .../repetitive/BdewLoadProfileTimeSeries.java | 55 +++++ .../repetitive/LoadProfileEntry.java | 38 ++-- .../repetitive/LoadProfileTimeSeries.java | 52 ++--- .../repetitive/RandomLoadProfileEntry.java | 35 --- .../RandomLoadProfileTimeSeries.java | 10 +- .../repetitive/RepetitiveTimeSeries.java | 3 +- .../models/value/load/BdewLoadValues.java | 192 +++++++++++++++++ .../models/value/load/LoadValues.java | 23 ++ .../models/value/load/RandomLoadValues.java | 204 ++++++++++++++++++ ...1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv | 192 ++++++++--------- ...2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv | 192 ++++++++--------- ...3_9b880468-309c-43c1-a3f4-26dd26266216.csv | 192 ++++++++--------- ...4_b7682f84-d317-4f7d-a888-0a9502abd763.csv | 192 ++++++++--------- ...5_ec51ae43-3849-4f14-8330-b2eea9414101.csv | 192 ++++++++--------- ...6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv | 192 ++++++++--------- ...1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv | 192 ++++++++--------- ...2_9029deec-5f70-4647-96db-086f463d0e0d.csv | 192 ++++++++--------- ...oovy => BdewLoadProfileFactoryTest.groovy} | 53 ++--- .../RandomLoadProfileFactoryTest.groovy | 38 ++-- ...EntityPersistenceNamingStrategyTest.groovy | 6 +- .../io/processor/ProcessorProviderTest.groovy | 11 +- .../timeseries/TimeSeriesProcessorTest.groovy | 7 +- .../io/source/LoadProfileSourceTest.groovy | 4 +- .../ie3/test/common/TimeSeriesTestData.groovy | 77 +++---- 44 files changed, 1545 insertions(+), 1367 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java rename src/main/java/edu/ie3/datamodel/models/{Season.java => BdewSeason.java} (90%) delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java rename src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/{DBEWLoadProfileFactoryTest.groovy => BdewLoadProfileFactoryTest.groovy} (61%) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 7628bf3b2..358b60739 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -63,7 +63,8 @@ public synchronized BufferedCsvWriter getOrInitWriter( } } - public synchronized , E extends TimeSeriesEntry, V extends Value> + public synchronized < + T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> BufferedCsvWriter getOrInitWriter(T timeSeries, CsvFileDefinition fileDefinition) throws ConnectorException { /* Try to the right writer */ diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java index 6afe95a39..f220f537a 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java @@ -68,7 +68,7 @@ public CsvFileDefinition( * @param fileNamingStrategy that should be used * @throws FileException If the definition cannot be determined */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> CsvFileDefinition( T timeSeries, String[] headLineElements, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java deleted file mode 100644 index 661046b5c..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BDEWLoadProfileFactory.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.timeseries; - -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; -import static java.time.DayOfWeek.*; - -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; -import edu.ie3.datamodel.models.Season; -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; -import edu.ie3.datamodel.models.value.PValue; -import java.util.List; -import java.util.Set; - -public class BDEWLoadProfileFactory - extends LoadProfileFactory { - public static final String SUMMER_WEEKDAY = "SuWd"; - public static final String SUMMER_SATURDAY = "SuSa"; - public static final String SUMMER_SUNDAY = "SuSu"; - public static final String WINTER_WEEKDAY = "WiWd"; - public static final String WINTER_SATURDAY = "WiSa"; - public static final String WINTER_SUNDAY = "WiSu"; - public static final String TRANSITION_WEEKDAY = "TrWd"; - public static final String TRANSITION_SATURDAY = "TrSa"; - public static final String TRANSITION_SUNDAY = "TrSu"; - - public BDEWLoadProfileFactory() { - this(BDEWLoadProfileEntry.class); - } - - public BDEWLoadProfileFactory(Class valueClass) { - super(valueClass); - } - - @Override - protected Set buildModel(LoadProfileData data) { - int quarterHour = data.getInt(QUARTER_HOUR); - - return Set.of( - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(SUMMER_WEEKDAY, KILOWATT)), - Season.SUMMER, - MONDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(SUMMER_SATURDAY, KILOWATT)), - Season.SUMMER, - SATURDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(SUMMER_SUNDAY, KILOWATT)), - Season.SUMMER, - SUNDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(WINTER_WEEKDAY, KILOWATT)), - Season.WINTER, - MONDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(WINTER_SATURDAY, KILOWATT)), - Season.WINTER, - SATURDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(WINTER_SUNDAY, KILOWATT)), - Season.WINTER, - SUNDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(TRANSITION_WEEKDAY, KILOWATT)), - Season.TRANSITION, - MONDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(TRANSITION_SATURDAY, KILOWATT)), - Season.TRANSITION, - SATURDAY, - quarterHour), - new BDEWLoadProfileEntry( - new PValue(data.getQuantity(TRANSITION_SUNDAY, KILOWATT)), - Season.TRANSITION, - SUNDAY, - quarterHour)); - } - - @Override - protected List> getFields(Class entityClass) { - return List.of( - newSet( - QUARTER_HOUR, - SUMMER_WEEKDAY, - SUMMER_SATURDAY, - SUMMER_SUNDAY, - WINTER_WEEKDAY, - WINTER_SATURDAY, - WINTER_SUNDAY, - TRANSITION_WEEKDAY, - TRANSITION_SATURDAY, - TRANSITION_SUNDAY)); - } - - @Override - public LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { - return new BDEWLoadProfileTimeSeries( - metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); - } - - @Override - public BdewStandardLoadProfile parseProfile(String profile) { - try { - return BdewStandardLoadProfile.get(profile); - } catch (ParsingException e) { - throw new FactoryException("An error occurred while parsing the profile: " + profile, e); - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java new file mode 100644 index 000000000..9c90e1818 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -0,0 +1,89 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import java.util.List; +import java.util.Set; + +public class BdewLoadProfileFactory + extends LoadProfileFactory { + public static final String SUMMER_SATURDAY = "SuSa"; + public static final String SUMMER_SUNDAY = "SuSu"; + public static final String SUMMER_WEEKDAY = "SuWd"; + public static final String TRANSITION_SATURDAY = "TrSa"; + public static final String TRANSITION_SUNDAY = "TrSu"; + public static final String TRANSITION_WEEKDAY = "TrWd"; + public static final String WINTER_SATURDAY = "WiSa"; + public static final String WINTER_SUNDAY = "WiSu"; + public static final String WINTER_WEEKDAY = "WiWd"; + + public BdewLoadProfileFactory() { + this(BdewLoadValues.class); + } + + public BdewLoadProfileFactory(Class valueClass) { + super(valueClass); + } + + @Override + protected LoadProfileEntry buildModel(LoadProfileData data) { + int quarterHour = data.getInt(QUARTER_HOUR); + + return new LoadProfileEntry<>( + new BdewLoadValues( + data.getDouble(SUMMER_SATURDAY), + data.getDouble(SUMMER_SUNDAY), + data.getDouble(SUMMER_WEEKDAY), + data.getDouble(TRANSITION_SATURDAY), + data.getDouble(TRANSITION_SUNDAY), + data.getDouble(TRANSITION_WEEKDAY), + data.getDouble(WINTER_SATURDAY), + data.getDouble(WINTER_SUNDAY), + data.getDouble(WINTER_WEEKDAY)), + quarterHour); + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + QUARTER_HOUR, + SUMMER_SATURDAY, + SUMMER_SUNDAY, + SUMMER_WEEKDAY, + TRANSITION_SATURDAY, + TRANSITION_SUNDAY, + TRANSITION_WEEKDAY, + WINTER_SATURDAY, + WINTER_SUNDAY, + WINTER_WEEKDAY)); + } + + @Override + public LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, + Set> entries) { + return new BdewLoadProfileTimeSeries( + metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); + } + + @Override + public BdewStandardLoadProfile parseProfile(String profile) { + try { + return BdewStandardLoadProfile.get(profile); + } catch (ParsingException e) { + throw new FactoryException("An error occurred while parsing the profile: " + profile, e); + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java index 5e6c0c904..8d432d26a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java @@ -6,11 +6,11 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.io.factory.FactoryData; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Map; -public class LoadProfileData extends FactoryData { - public LoadProfileData(Map fieldsToAttributes, Class targetClass) { +public class LoadProfileData extends FactoryData { + public LoadProfileData(Map fieldsToAttributes, Class targetClass) { super(fieldsToAttributes, targetClass); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 98856dd6c..a7cb16b13 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -10,18 +10,19 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Set; -public abstract class LoadProfileFactory

    - extends Factory, Set> { +public abstract class LoadProfileFactory

    + extends Factory, LoadProfileEntry> { public static final String QUARTER_HOUR = "quarterHour"; - public LoadProfileFactory(Class valueClass) { + public LoadProfileFactory(Class valueClass) { super(valueClass); } - public abstract LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set data); + public abstract LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, Set> data); public abstract P parseProfile(String profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index abb1d839e..8d741bb2a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -6,21 +6,17 @@ package edu.ie3.datamodel.io.factory.timeseries; import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; -import static java.time.DayOfWeek.*; -import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; -import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.List; -import java.util.Random; import java.util.Set; -public class RandomLoadProfileFactory - extends LoadProfileFactory { +public class RandomLoadProfileFactory extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; public static final String K_SATURDAY = "kSa"; public static final String K_SUNDAY = "kSu"; @@ -32,37 +28,25 @@ public class RandomLoadProfileFactory public static final String SIGMA_SUNDAY = "sigmaSu"; public RandomLoadProfileFactory() { - super(RandomLoadProfileEntry.class); + super(RandomLoadValues.class); } @Override - protected Set buildModel(LoadProfileData data) { + protected LoadProfileEntry buildModel(LoadProfileData data) { int quarterHour = data.getInt(QUARTER_HOUR); - return Set.of( - new RandomLoadProfileEntry( - new GeneralizedExtremeValueDistribution( - data.getDouble(MY_WEEKDAY), - data.getDouble(SIGMA_WEEKDAY), - data.getDouble(K_WEEKDAY), - RandomFactory.get(new Random().nextLong())), - MONDAY, - quarterHour), - new RandomLoadProfileEntry( - new GeneralizedExtremeValueDistribution( - data.getDouble(MY_SATURDAY), - data.getDouble(SIGMA_SATURDAY), - data.getDouble(K_SATURDAY), - RandomFactory.get(new Random().nextLong())), - SATURDAY, - quarterHour), - new RandomLoadProfileEntry( - new GeneralizedExtremeValueDistribution( - data.getDouble(MY_SUNDAY), - data.getDouble(SIGMA_SUNDAY), - data.getDouble(K_SUNDAY), - RandomFactory.get(new Random().nextLong())), - SUNDAY, - quarterHour)); + + return new LoadProfileEntry<>( + new RandomLoadValues( + data.getDouble(K_SATURDAY), + data.getDouble(K_SUNDAY), + data.getDouble(K_WEEKDAY), + data.getDouble(MY_SATURDAY), + data.getDouble(MY_SUNDAY), + data.getDouble(MY_WEEKDAY), + data.getDouble(SIGMA_SATURDAY), + data.getDouble(SIGMA_SUNDAY), + data.getDouble(SIGMA_WEEKDAY)), + quarterHour); } @Override @@ -82,8 +66,9 @@ protected List> getFields(Class entityClass) { } @Override - public LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set entries) { + public LoadProfileTimeSeries build( + LoadProfileTimeSeriesMetaInformation metaInformation, + Set> entries) { return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 715052d5e..e328041b3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -344,7 +344,7 @@ public Optional getTimeSeriesMappingEntityName() { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries) { Optional maybeFirstElement = timeSeries.getEntries().stream().findFirst(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 84a18283e..c81520bc3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -137,7 +137,7 @@ public Optional getDirectoryPath(Class cls) { * @param timeSeries Time series to derive naming information from * @return An optional sub directory path */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getDirectoryPath(T timeSeries) { Optional maybeDirectoryName = fileHierarchy.getSubDirectory(timeSeries.getClass()); if (maybeDirectoryName.isEmpty()) { @@ -281,7 +281,7 @@ public Optional getEntityName(Class cls) { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { return entityPersistenceNamingStrategy.getEntityName(timeSeries); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 7db4f0463..cd6850b6c 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -109,7 +109,7 @@ private EntityProcessor getEntityProcessor(Class Type of the value inside the time series entries * @return A set of mappings from field name to value */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Set> handleTimeSeries(T timeSeries) throws ProcessorProviderException { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -132,7 +132,7 @@ Set> handleTimeSeries(T timeSeries) * @throws ProcessorProviderException If no fitting processor can be found */ @SuppressWarnings("unchecked cast") - private , E extends TimeSeriesEntry, V extends Value> + private , E extends TimeSeriesEntry, V extends Value> TimeSeriesProcessor getTimeSeriesProcessor(TimeSeriesProcessorKey processorKey) throws ProcessorProviderException { TimeSeriesProcessor processor = diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index adb2783a5..84a597eb8 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -15,13 +15,15 @@ import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class TimeSeriesProcessor< - T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> + T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> extends EntityProcessor { /** * List of all combinations of time series class, entry class and value class, this processor is @@ -50,9 +52,9 @@ public class TimeSeriesProcessor< new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), new TimeSeriesProcessorKey( - BDEWLoadProfileTimeSeries.class, BDEWLoadProfileEntry.class, PValue.class), + BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class), new TimeSeriesProcessorKey( - RandomLoadProfileTimeSeries.class, RandomLoadProfileEntry.class, PValue.class)); + RandomLoadProfileTimeSeries.class, LoadProfileEntry.class, RandomLoadValues.class)); /** * Specific combination of time series class, entry class and value class, this processor is @@ -112,7 +114,8 @@ private SortedMap buildFieldToSource( throws EntityProcessorException { /* Get the mapping from field name to getter method ignoring the getter for returning all entries */ Map timeSeriesMapping = - mapFieldNameToGetter(timeSeriesClass, Arrays.asList("entries", "uuid", "type")) + mapFieldNameToGetter( + timeSeriesClass, Arrays.asList("entries", "uuid", "type", "loadProfile")) .entrySet() .stream() .collect( diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 8635534a7..26f0801ac 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -243,7 +243,7 @@ public void shutdown() { } @Override - public , V extends Value> void persistTimeSeries( + public , V extends Value> void persistTimeSeries( TimeSeries timeSeries) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -264,7 +264,7 @@ public , V extends Value> void persistTimeSeries( } } - private , V extends Value> void persistTimeSeries( + private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, BufferedCsvWriter writer) throws ProcessorProviderException { try { Set> entityFieldData = diff --git a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java index 1d45320dc..d4dca754e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java @@ -62,6 +62,6 @@ public interface DataSink { * @param Type of entry in the time series * @param Type of actual value, that is inside the entry */ - , V extends Value> void persistTimeSeries( + , V extends Value> void persistTimeSeries( TimeSeries timeSeries) throws ProcessorProviderException; } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 5730a1585..85255f916 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -85,7 +85,7 @@ public void persistAll(Collection entities) } @Override - public , V extends Value> void persistTimeSeries( + public , V extends Value> void persistTimeSeries( TimeSeries timeSeries) throws ProcessorProviderException { Set points = transformToPoints(timeSeries); writeAll(points); @@ -146,8 +146,8 @@ private Point transformToPoint(ResultEntity entity, String measurementName) * * @param timeSeries the time series to transform */ - private , V extends Value> Set transformToPoints( - TimeSeries timeSeries) throws ProcessorProviderException { + private , V extends Value> + Set transformToPoints(TimeSeries timeSeries) throws ProcessorProviderException { if (timeSeries.getEntries().isEmpty()) return Collections.emptySet(); Optional measurementName = entityPersistenceNamingStrategy.getEntityName(timeSeries); @@ -169,8 +169,9 @@ private , V extends Value> Set transformToPo * @param timeSeries the time series to transform * @param measurementName equivalent to the name of a relational table */ - private , V extends Value> Set transformToPoints( - TimeSeries timeSeries, String measurementName) throws ProcessorProviderException { + private , V extends Value> + Set transformToPoints(TimeSeries timeSeries, String measurementName) + throws ProcessorProviderException { Set points = new HashSet<>(); Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index eeac6c210..57f4dddb8 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -9,7 +9,7 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; -import edu.ie3.datamodel.io.factory.timeseries.BDEWLoadProfileFactory; +import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.RandomLoadProfileFactory; @@ -19,23 +19,25 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.LoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.time.ZonedDateTime; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -public abstract class LoadProfileSource

    +public abstract class LoadProfileSource

    extends EntitySource { private static final CsvDataSource buildInSource = getBuildInSource(Path.of("load")); - protected final Class entryClass; - protected final LoadProfileFactory entryFactory; + protected final Class entryClass; + protected final LoadProfileFactory entryFactory; - protected LoadProfileSource(Class entryClass, LoadProfileFactory entryFactory) { + protected LoadProfileSource(Class entryClass, LoadProfileFactory entryFactory) { this.entryClass = entryClass; this.entryFactory = entryFactory; } @@ -47,12 +49,13 @@ protected LoadProfileSource(Class entryClass, LoadProfileFactory entryF * @param fieldToValues Mapping from field id to values * @return {@link Try} of simple time based value */ - protected Try, FactoryException> createEntries(Map fieldToValues) { - LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); + protected Try, FactoryException> createEntries( + Map fieldToValues) { + LoadProfileData factoryData = new LoadProfileData<>(fieldToValues, entryClass); return entryFactory.get(factoryData); } - public abstract LoadProfileTimeSeries getTimeSeries(); + public abstract LoadProfileTimeSeries getTimeSeries(); /** * Method to return all time keys after a given timestamp. @@ -67,17 +70,17 @@ protected Try, FactoryException> createEntries(Map fieldT * * @return a map: load profile to time series */ - public static Map getBDEWLoadProfiles() { - BDEWLoadProfileFactory factory = new BDEWLoadProfileFactory(); + public static Map getBDEWLoadProfiles() { + BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() .map( metaInformation -> - (BDEWLoadProfileTimeSeries) + (BdewLoadProfileTimeSeries) new CsvLoadProfileSource<>( - buildInSource, metaInformation, BDEWLoadProfileEntry.class, factory) + buildInSource, metaInformation, BdewLoadValues.class, factory) .getTimeSeries()) - .collect(Collectors.toMap(BDEWLoadProfileTimeSeries::getLoadProfile, Function.identity())); + .collect(Collectors.toMap(BdewLoadProfileTimeSeries::getLoadProfile, Function.identity())); } /** @@ -94,7 +97,7 @@ public static RandomLoadProfileTimeSeries getRandomLoadProfile() { new CsvLoadProfileSource<>( buildInSource, metaInformation, - RandomLoadProfileEntry.class, + RandomLoadValues.class, new RandomLoadProfileFactory()) .getTimeSeries(); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index e0d4e0e86..aa742557d 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -14,6 +14,7 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.LoadValues; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.time.ZonedDateTime; @@ -24,17 +25,17 @@ /** * Source that is capable of providing information around load profile time series from csv files. */ -public class CsvLoadProfileSource

    - extends LoadProfileSource { - private final LoadProfileTimeSeries loadProfileTimeSeries; +public class CsvLoadProfileSource

    + extends LoadProfileSource { + private final LoadProfileTimeSeries loadProfileTimeSeries; private final CsvDataSource dataSource; private final Path filePath; public CsvLoadProfileSource( CsvDataSource source, CsvLoadProfileMetaInformation metaInformation, - Class entryClass, - LoadProfileFactory entryFactory) { + Class entryClass, + LoadProfileFactory entryFactory) { super(entryClass, entryFactory); this.dataSource = source; this.filePath = metaInformation.getFullFilePath(); @@ -57,7 +58,7 @@ public void validate() throws ValidationException { } @Override - public LoadProfileTimeSeries getTimeSeries() { + public LoadProfileTimeSeries getTimeSeries() { return loadProfileTimeSeries; } @@ -80,11 +81,12 @@ public List getTimeKeysAfter(ZonedDateTime time) { * @throws SourceException If the file cannot be read properly * @return an individual time series */ - protected LoadProfileTimeSeries buildLoadProfileTimeSeries( + protected LoadProfileTimeSeries buildLoadProfileTimeSeries( CsvLoadProfileMetaInformation metaInformation, - Function, Try, FactoryException>> fieldToValueFunction) + Function, Try, FactoryException>> + fieldToValueFunction) throws SourceException { - Set entries = + Set> entries = dataSource .buildStreamWithFieldsToAttributesMap(filePath, false) .flatMap( @@ -92,7 +94,6 @@ protected LoadProfileTimeSeries buildLoadProfileTimeSeries( Try.scanStream(stream.map(fieldToValueFunction), "LoadProfileEntry") .transformF(SourceException::new)) .getOrThrow() - .flatMap(Collection::stream) .collect(Collectors.toSet()); return entryFactory.build(metaInformation, entries); diff --git a/src/main/java/edu/ie3/datamodel/models/Season.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java similarity index 90% rename from src/main/java/edu/ie3/datamodel/models/Season.java rename to src/main/java/edu/ie3/datamodel/models/BdewSeason.java index 5ba70fcb5..a10acb260 100644 --- a/src/main/java/edu/ie3/datamodel/models/Season.java +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -8,18 +8,18 @@ import edu.ie3.datamodel.exceptions.ParsingException; import java.time.ZonedDateTime; -public enum Season { +public enum BdewSeason { WINTER("Wi"), SUMMER("Su"), TRANSITION("Tr"); private final String key; - Season(String key) { + BdewSeason(String key) { this.key = key.toLowerCase(); } - public static Season parse(String key) throws ParsingException { + public static BdewSeason parse(String key) throws ParsingException { return switch (key) { case "Wi" -> WINTER; case "Su" -> SUMMER; @@ -34,7 +34,7 @@ public static Season parse(String key) throws ParsingException { * @param time the time * @return a season */ - public static Season get(ZonedDateTime time) { + public static BdewSeason get(ZonedDateTime time) { int day = time.getDayOfMonth(); // winter: 1.11.-20.03. diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java index 279c100d9..62593b0ae 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java @@ -17,7 +17,7 @@ * @param Type of the entries, the time series is foreseen to contain * @param Type of the values, the entries will have */ -public abstract class TimeSeries, V extends Value> +public abstract class TimeSeries, V extends Value> extends UniqueEntity { private final Set entries; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java deleted file mode 100644 index 049c30e97..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileEntry.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.Season; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.util.Objects; - -/** Unique entry to a {@link BDEWLoadProfileTimeSeries} */ -public class BDEWLoadProfileEntry extends LoadProfileEntry { - private final Season season; - - public BDEWLoadProfileEntry( - PValue value, Season season, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(value, dayOfWeek, quarterHourOfDay); - this.season = season; - } - - public Season getSeason() { - return season; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - BDEWLoadProfileEntry that = (BDEWLoadProfileEntry) o; - return getQuarterHourOfDay() == that.getQuarterHourOfDay() - && season == that.season - && getDayOfWeek() == that.getDayOfWeek(); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), season); - } - - @Override - public String toString() { - return "BDEWLoadProfileEntry{" - + "dayOfWeek=" - + getDayOfWeek() - + "season=" - + season - + ", quarterHourOfDay=" - + getQuarterHourOfDay() - + ", value=" - + value - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java deleted file mode 100644 index 104a8182d..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BDEWLoadProfileTimeSeries.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; -import static java.lang.Math.pow; -import static java.lang.Math.round; - -import edu.ie3.datamodel.models.Season; -import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; -import tech.units.indriya.quantity.Quantities; - -/** - * Describes a bdew load profile time series with repetitive values that can be calculated from a - * pattern - */ -public class BDEWLoadProfileTimeSeries extends LoadProfileTimeSeries { - - public BDEWLoadProfileTimeSeries( - UUID uuid, BdewStandardLoadProfile loadProfile, Set values) { - super(uuid, loadProfile, values, e -> new BdewKey(e.getSeason(), e.getDayOfWeek())); - } - - @Override - public BdewStandardLoadProfile getLoadProfile() { - return (BdewStandardLoadProfile) super.getLoadProfile(); - } - - @Override - public PValue calc(ZonedDateTime time) { - if (getLoadProfile() == BdewStandardLoadProfile.H0) { - /* For the residential average profile, a dynamization has to be taken into account */ - return dynamization(super.calc(time), time.getDayOfYear()); // leap years are ignored - } else { - return super.calc(time); - } - } - - /** - * Calculates the dynamization factor for given day of year. Cf. - * Anwendung der repräsentativen Lastprofile - Step by step page 19 - * - * @param load load value - * @param t day of year (1-366) - * @return dynamization factor - */ - private PValue dynamization(PValue load, int t) { - double factor = - (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); - double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places - Function round = - l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place - - ComparableQuantity value = - load.getP() - .map(v -> v.getValue().doubleValue()) - .map(round) - .map(v -> Quantities.getQuantity(v, KILOWATT)) - .orElse(null); - - return new PValue(value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - return super.equals(o); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode()); - } - - @Override - public String toString() { - return "BDEWLoadProfileTimeSeries{" - + "uuid=" - + getUuid() - + "loadProfile=" - + getLoadProfile() - + ", valueMapping=" - + getValueMapping() - + '}'; - } - - @Override - protected Key fromTime(ZonedDateTime time) { - Season season = Season.get(time); - - DayOfWeek day = - switch (time.getDayOfWeek()) { - case SATURDAY -> DayOfWeek.SATURDAY; - case SUNDAY -> DayOfWeek.SUNDAY; - default -> DayOfWeek.MONDAY; - }; - - return new BdewKey(season, day); - } - - private record BdewKey(Season season, DayOfWeek dayOfWeek) implements Key {} -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java new file mode 100644 index 000000000..478a9f3b1 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -0,0 +1,55 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +/** + * Describes a bdew load profile time series with repetitive values that can be calculated from a + * pattern + */ +public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { + + public BdewLoadProfileTimeSeries( + UUID uuid, + BdewStandardLoadProfile loadProfile, + Set> values) { + super(uuid, loadProfile, values); + } + + @Override + public BdewStandardLoadProfile getLoadProfile() { + return (BdewStandardLoadProfile) super.getLoadProfile(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "BDEWLoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java index 29a62684c..10f90d632 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java @@ -6,27 +6,20 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Objects; /** Unique entry to a {@link LoadProfileTimeSeries} */ -public class LoadProfileEntry extends TimeSeriesEntry { - private final DayOfWeek dayOfWeek; - private final int quarterHourOfDay; +public class LoadProfileEntry extends TimeSeriesEntry { + private final int quarterHour; - public LoadProfileEntry(PValue value, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(value); - this.dayOfWeek = dayOfWeek; - this.quarterHourOfDay = quarterHourOfDay; + public LoadProfileEntry(L values, int quarterHour) { + super(values); + this.quarterHour = quarterHour; } - public DayOfWeek getDayOfWeek() { - return dayOfWeek; - } - - public int getQuarterHourOfDay() { - return quarterHourOfDay; + public int getQuarterHour() { + return quarterHour; } @Override @@ -34,24 +27,17 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - LoadProfileEntry that = (LoadProfileEntry) o; - return quarterHourOfDay == that.quarterHourOfDay && dayOfWeek == that.dayOfWeek; + LoadProfileEntry that = (LoadProfileEntry) o; + return quarterHour == that.quarterHour; } @Override public int hashCode() { - return Objects.hash(super.hashCode(), dayOfWeek, quarterHourOfDay); + return Objects.hash(super.hashCode(), quarterHour); } @Override public String toString() { - return "LoadProfileEntry{" - + "dayOfWeek=" - + dayOfWeek - + ", quarterHourOfDay=" - + quarterHourOfDay - + ", value=" - + value - + '}'; + return "LoadProfileEntry{" + "quarterHour=" + quarterHour + ", value=" + value + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index ffeeb52f5..066c65f8a 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -5,42 +5,29 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import static java.util.function.Function.identity; - import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.time.ZonedDateTime; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; -import java.util.function.Function; +import java.util.*; import java.util.stream.Collectors; /** * Describes a load profile time series with repetitive values that can be calculated from a pattern */ -public abstract class LoadProfileTimeSeries - extends RepetitiveTimeSeries { +public abstract class LoadProfileTimeSeries + extends RepetitiveTimeSeries, PValue> { private final LoadProfile loadProfile; - private final Map> valueMapping; - - public LoadProfileTimeSeries(UUID uuid, LoadProfile loadProfile, Set entries) { - this(uuid, loadProfile, entries, e -> new WeekDayKey(e.getDayOfWeek())); - } + private final Map valueMapping; public LoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set entries, Function extractor) { + UUID uuid, LoadProfile loadProfile, Set> entries) { super(uuid, entries); this.loadProfile = loadProfile; - this.valueMapping = entries.stream() .collect( - Collectors.groupingBy( - extractor, - Collectors.toMap(LoadProfileEntry::getQuarterHourOfDay, identity()))); + Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); } /** Returns the {@link LoadProfile}. */ @@ -48,33 +35,32 @@ public LoadProfile getLoadProfile() { return loadProfile; } + @Override + public Set> getEntries() { + // to ensure that the entries are ordered by their quarter-hour + TreeSet> set = + new TreeSet<>(Comparator.comparing(LoadProfileEntry::getQuarterHour)); + set.addAll(super.getEntries()); + return set; + } + /** Returns the value mapping. */ - protected Map> getValueMapping() { + protected Map getValueMapping() { return valueMapping; } @Override protected PValue calc(ZonedDateTime time) { - Key key = fromTime(time); int quarterHour = time.getHour() * 4 + time.getMinute() / 15; - return valueMapping.get(key).get(quarterHour).getValue(); - } - - protected Key fromTime(ZonedDateTime time) { - return new WeekDayKey(time.getDayOfWeek()); + return valueMapping.get(quarterHour).getValue(time, loadProfile); } - public interface Key {} - - private record WeekDayKey(DayOfWeek dayOfWeek) implements Key {} - @Override - @SuppressWarnings("unchecked") public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; + LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java deleted file mode 100644 index aa63a413b..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileEntry.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; - -import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import tech.units.indriya.quantity.Quantities; - -/** Unique entry for a {@link RandomLoadProfileTimeSeries}. */ -public class RandomLoadProfileEntry extends LoadProfileEntry { - // distribution for random values - private final GeneralizedExtremeValueDistribution gev; - - public RandomLoadProfileEntry( - GeneralizedExtremeValueDistribution gev, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(new PValue(null), dayOfWeek, quarterHourOfDay); - this.gev = gev; - } - - @Override - public PValue getValue() { - double randomValue = gev.nextRandom(); - - while (randomValue < 0) { - randomValue = gev.nextRandom(); - } - return new PValue(Quantities.getQuantity(randomValue, KILOWATT)); - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index da340869c..85e457880 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -6,16 +6,22 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.Objects; import java.util.Set; import java.util.UUID; -public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { +public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set entries) { + UUID uuid, LoadProfile loadProfile, Set> entries) { super(uuid, loadProfile, entries); } + @Override + public LoadProfile.RandomLoadProfile getLoadProfile() { + return (LoadProfile.RandomLoadProfile) super.getLoadProfile(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index e1f4e9f10..c26f951f1 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -12,7 +12,8 @@ import java.util.*; /** Describes a TimeSeries with repetitive values that can be calculated from a pattern */ -public abstract class RepetitiveTimeSeries, V extends Value> +public abstract class RepetitiveTimeSeries< + E extends TimeSeriesEntry, V extends Value> extends TimeSeries { protected RepetitiveTimeSeries(UUID uuid, Set entries) { diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java new file mode 100644 index 000000000..1364efdaf --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -0,0 +1,192 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import static edu.ie3.datamodel.models.BdewSeason.*; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static java.lang.Math.pow; +import static java.lang.Math.round; + +import edu.ie3.datamodel.models.BdewSeason; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +/** Load values for a {@link BdewStandardLoadProfile} */ +public class BdewLoadValues implements LoadValues { + private final double SuSa; + private final double SuSu; + private final double SuWd; + private final double TrSa; + private final double TrSu; + private final double TrWd; + private final double WiSa; + private final double WiSu; + private final double WiWd; + + public BdewLoadValues( + double SuSa, + double SuSu, + double SuWd, + double TrSa, + double TrSu, + double TrWd, + double WiSa, + double WiSu, + double WiWd) { + this.SuSa = SuSa; + this.SuSu = SuSu; + this.SuWd = SuWd; + this.TrSa = TrSa; + this.TrSu = TrSu; + this.TrWd = TrWd; + this.WiSa = WiSa; + this.WiSu = WiSu; + this.WiWd = WiWd; + } + + @Override + public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { + Map mapping = + switch (time.getDayOfWeek()) { + case SATURDAY -> Map.of( + SUMMER, SuSa, + WINTER, WiSa, + TRANSITION, TrSa); + case SUNDAY -> Map.of( + SUMMER, SuSu, + WINTER, WiSu, + TRANSITION, TrSu); + default -> Map.of( + SUMMER, SuWd, + WINTER, WiWd, + TRANSITION, TrWd); + }; + + PValue value = new PValue(Quantities.getQuantity(mapping.get(BdewSeason.get(time)), KILOWATT)); + + if (loadProfile == BdewStandardLoadProfile.H0) { + /* For the residential average profile, a dynamization has to be taken into account */ + return dynamization(value, time.getDayOfYear()); // leap years are ignored + } else { + return value; + } + } + + /** + * Calculates the dynamization factor for given day of year. Cf. + * Anwendung der repräsentativen Lastprofile - Step by step page 19 + * + * @param load load value + * @param t day of year (1-366) + * @return dynamization factor + */ + private PValue dynamization(PValue load, int t) { + double factor = + (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); + double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places + Function round = + l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place + + ComparableQuantity value = + load.getP() + .map(v -> v.getValue().doubleValue()) + .map(round) + .map(v -> Quantities.getQuantity(v, KILOWATT)) + .orElse(null); + + return new PValue(value); + } + + public double getSuSa() { + return SuSa; + } + + public double getSuSu() { + return SuSu; + } + + public double getSuWd() { + return SuWd; + } + + public double getTrSa() { + return TrSa; + } + + public double getTrSu() { + return TrSu; + } + + public double getTrWd() { + return TrWd; + } + + public double getWiSa() { + return WiSa; + } + + public double getWiSu() { + return WiSu; + } + + public double getWiWd() { + return WiWd; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BdewLoadValues that = (BdewLoadValues) o; + return Objects.equals(SuSa, that.SuSa) + && Objects.equals(SuSu, that.SuSu) + && Objects.equals(SuWd, that.SuWd) + && Objects.equals(TrSa, that.TrSa) + && Objects.equals(TrSu, that.TrSu) + && Objects.equals(TrWd, that.TrWd) + && Objects.equals(WiSa, that.WiSa) + && Objects.equals(WiSu, that.WiSu) + && Objects.equals(WiWd, that.WiWd); + } + + @Override + public int hashCode() { + return Objects.hash(SuWd, SuSa, SuSu, WiWd, WiSa, WiSu, TrWd, TrSa, TrSu); + } + + @Override + public String toString() { + return "BDEWLoadValues{" + + "SuWd=" + + SuWd + + ", SuSa=" + + SuSa + + ", SuSu=" + + SuSu + + ", WiWd=" + + WiWd + + ", WiSa=" + + WiSa + + ", WiSu=" + + WiSu + + ", TrWd=" + + TrWd + + ", TrSa=" + + TrSa + + ", TrSu=" + + TrSu + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java new file mode 100644 index 000000000..ae7fc4e26 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java @@ -0,0 +1,23 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.value.Value; +import java.time.ZonedDateTime; + +/** Interface for load values. */ +public interface LoadValues extends Value { + + /** + * Method to calculate an actual load power value for the given time. + * + * @param time given time + * @return a new {@link PValue} + */ + PValue getValue(ZonedDateTime time, LoadProfile loadProfile); +} diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java new file mode 100644 index 000000000..072ca763f --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -0,0 +1,204 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; +import java.util.Objects; +import java.util.Random; +import tech.units.indriya.quantity.Quantities; + +/** + * Data model to describe the parameters of a probability density function to draw random power + * consumptions. This model represents a generalized extreme value distribution (GEV), that has been + * sampled for each quarter hour of a day, subdivided into workdays, Saturdays and Sundays. In + * general the GEV is described by the three parameters "location", "scale" and "shape" + */ +public class RandomLoadValues implements LoadValues { + /** Shape parameter for a Saturday */ + private final double kSa; + + /** Shape parameter for a Sunday */ + private final double kSu; + + /** Shape parameter for a working day */ + private final double kWd; + + /** Location parameter for a Saturday */ + private final double mySa; + + /** Location parameter for a Sunday */ + private final double mySu; + + /** Location parameter for a working day */ + private final double myWd; + + /** Scale parameter for a Saturday */ + private final double sigmaSa; + + /** Scale parameter for a Sunday */ + private final double sigmaSu; + + /** Scale parameter for a working day */ + private final double sigmaWd; + + private final GeneralizedExtremeValueDistribution gevWd; + private final GeneralizedExtremeValueDistribution gevSa; + private final GeneralizedExtremeValueDistribution gevSu; + + /** + * @param kSa Shape parameter for a Saturday + * @param kSu Shape parameter for a Sunday + * @param kWd Shape parameter for a working day + * @param mySa Location parameter for a Saturday + * @param mySu Location parameter for a Sunday + * @param myWd Location parameter for a working day + * @param sigmaSa Scale parameter for a Saturday + * @param sigmaSu Scale parameter for a Sunday + * @param sigmaWd Scale parameter for a working day + */ + public RandomLoadValues( + double kSa, + double kSu, + double kWd, + double mySa, + double mySu, + double myWd, + double sigmaSa, + double sigmaSu, + double sigmaWd) { + this.kWd = kWd; + this.kSa = kSa; + this.kSu = kSu; + this.myWd = myWd; + this.mySa = mySa; + this.mySu = mySu; + this.sigmaWd = sigmaWd; + this.sigmaSa = sigmaSa; + this.sigmaSu = sigmaSu; + + Random random = new Random(); + RandomFactory factory = RandomFactory.get(random.nextLong()); + + this.gevWd = new GeneralizedExtremeValueDistribution(myWd, sigmaWd, kWd, factory.getRandom()); + + this.gevSa = new GeneralizedExtremeValueDistribution(mySa, sigmaSa, kSa, factory.getRandom()); + this.gevSu = new GeneralizedExtremeValueDistribution(mySu, sigmaSu, kSu, factory.getRandom()); + } + + @Override + public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { + return new PValue(Quantities.getQuantity(getValue(time.getDayOfWeek()), KILOWATT)); + } + + /** + * Method to get the next random double value. + * + * @param day of the week + * @return a suitable random double + */ + private double getValue(DayOfWeek day) { + double randomValue = + switch (day) { + case SATURDAY -> gevSa.nextRandom(); + case SUNDAY -> gevSu.nextRandom(); + default -> gevWd.nextRandom(); + }; + + while (randomValue < 0) { + randomValue = getValue(day); + } + return randomValue; + } + + public double getMyWd() { + return myWd; + } + + public double getMySa() { + return mySa; + } + + public double getMySu() { + return mySu; + } + + public double getSigmaWd() { + return sigmaWd; + } + + public double getSigmaSa() { + return sigmaSa; + } + + public double getSigmaSu() { + return sigmaSu; + } + + public double getkWd() { + return kWd; + } + + public double getkSa() { + return kSa; + } + + public double getkSu() { + return kSu; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof RandomLoadValues that)) return false; + if (!super.equals(o)) return false; + return Objects.equals(kSa, that.kSa) + && Objects.equals(kSu, that.kSu) + && Objects.equals(kWd, that.kWd) + && Objects.equals(mySa, that.mySa) + && Objects.equals(mySu, that.mySu) + && Objects.equals(myWd, that.myWd) + && Objects.equals(sigmaSa, that.sigmaSa) + && Objects.equals(sigmaSu, that.sigmaSu) + && Objects.equals(sigmaWd, that.sigmaWd); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), kSa, kSu, kWd, mySa, mySu, myWd, sigmaSa, sigmaSu, sigmaWd); + } + + @Override + public String toString() { + return "RandomLoadValues{" + + "kSa=" + + kSa + + ", kSu=" + + kSu + + ", kWd=" + + kWd + + ", mySa=" + + mySa + + ", mySu=" + + mySu + + ", myWd=" + + myWd + + ", sigmaSa=" + + sigmaSa + + ", sigmaSu=" + + sigmaSu + + ", sigmaWd=" + + sigmaWd + + '}'; + } +} diff --git a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv index 4348e6322..a2889f2e5 100644 --- a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv +++ b/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,1 -22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,2 -21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,3 -20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,4 -20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,5 -20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,6 -20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,7 -20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,8 -20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,9 -20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,10 -20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,11 -20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,12 -20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,13 -20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,14 -20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,15 -20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,16 -20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,17 -20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,18 -20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,19 -20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,20 -21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,21 -21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,22 -22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,23 -22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,24 -23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,25 -23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,26 -24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,27 -24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,28 -24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,29 -25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,30 -25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,31 -26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,32 -27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,33 -29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,34 -31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,35 -34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,36 -37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,37 -40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,38 -43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,39 -45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,40 -47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,41 -48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,42 -49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,43 -49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,44 -49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,45 -48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,46 -47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,47 -45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,48 -42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,49 -39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,50 -36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,51 -34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,52 -31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,53 -30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,54 -29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,55 -28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,56 -27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,57 -27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,58 -27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,59 -26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,60 -25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,61 -25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,62 -24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,63 -24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,64 -24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,65 -24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,66 -24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,67 -24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,68 -24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,69 -23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,70 -22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,71 -22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,72 -23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,73 -23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,74 -24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,75 -24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,76 -24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,77 -24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,78 -23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,79 -22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,80 -22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,81 -22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,82 -22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,83 -22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,84 -23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,85 -23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,86 -24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,87 -24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,88 -24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,89 -23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,90 -23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,91 -22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,92 -22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,93 -22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,94 -22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,95 -22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,96 +23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,0 +22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,1 +21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,2 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,3 +20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,4 +20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,5 +20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,6 +20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,7 +20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,8 +20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,9 +20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,10 +20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,11 +20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,12 +20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,13 +20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,14 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,15 +20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,16 +20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,17 +20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,18 +20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,19 +21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,20 +21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,21 +22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,22 +22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,23 +23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,24 +23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,25 +24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,26 +24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,27 +24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,28 +25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,29 +25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,30 +26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,31 +27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,32 +29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,33 +31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,34 +34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,35 +37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,36 +40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,37 +43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,38 +45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,39 +47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,40 +48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,41 +49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,42 +49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,43 +49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,44 +48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,45 +47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,46 +45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,47 +42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,48 +39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,49 +36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,50 +34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,51 +31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,52 +30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,53 +29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,54 +28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,55 +27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,56 +27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,57 +27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,58 +26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,59 +25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,60 +25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,61 +24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,62 +24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,63 +24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,64 +24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,65 +24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,66 +24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,67 +24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,68 +23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,69 +22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,70 +22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,71 +23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,72 +23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,73 +24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,74 +24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,75 +24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,76 +24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,77 +23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,78 +22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,79 +22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,80 +22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,81 +22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,82 +22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,83 +23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,84 +23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,85 +24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,86 +24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,87 +24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,88 +23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,89 +23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,90 +22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,91 +22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,92 +22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,93 +22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,94 +22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,95 diff --git a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv index ef76980b7..05e1ca97a 100644 --- a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv +++ b/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,1 -58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,2 -53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,3 -48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,4 -43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,5 -38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,6 -33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,7 -29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,8 -27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,9 -26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,10 -26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,11 -26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,12 -26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,13 -25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,14 -25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,15 -24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,16 -23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,17 -23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,18 -23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,19 -24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,20 -26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,21 -29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,22 -33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,23 -38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,24 -43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,25 -48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,26 -51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,27 -52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,28 -51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,29 -48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,30 -45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,31 -45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,32 -48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,33 -54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,34 -62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,35 -72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,36 -82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,37 -93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,38 -102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,39 -111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,40 -118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,41 -124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,42 -128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,43 -131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,44 -132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,45 -133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,46 -133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,47 -133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,48 -132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,49 -131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,50 -131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,51 -131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,52 -131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,53 -131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,54 -131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,55 -132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,56 -132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,57 -132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,58 -132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,59 -133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,60 -134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,61 -135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,62 -137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,63 -139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,64 -141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,65 -144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,66 -146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,67 -149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,68 -153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,69 -157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,70 -160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,71 -163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,72 -164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,73 -163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,74 -162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,75 -160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,76 -158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,77 -156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,78 -154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,79 -153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,80 -152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,81 -152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,82 -150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,83 -148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,84 -144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,85 -139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,86 -131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,87 -122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,88 -110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,89 -98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,90 -85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,91 -75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,92 -67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,93 -61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,94 -57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,95 -53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,96 +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,0 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,1 +53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,2 +48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,3 +43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,4 +38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,5 +33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,6 +29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,7 +27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,8 +26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,9 +26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,10 +26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,11 +26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,12 +25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,13 +25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,14 +24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,15 +23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,16 +23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,17 +23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,18 +24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,19 +26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,20 +29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,21 +33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,22 +38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,23 +43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,24 +48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,25 +51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,26 +52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,27 +51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,28 +48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,29 +45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,30 +45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,31 +48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,32 +54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,33 +62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,34 +72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,35 +82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,36 +93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,37 +102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,38 +111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,39 +118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,40 +124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,41 +128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,42 +131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,43 +132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,44 +133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,45 +133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,46 +133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,47 +132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,48 +131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,49 +131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,50 +131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,51 +131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,52 +131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,53 +131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,54 +132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,55 +132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,56 +132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,57 +132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,58 +133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,59 +134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,60 +135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,61 +137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,62 +139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,63 +141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,64 +144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,65 +146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,66 +149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,67 +153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,68 +157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,69 +160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,70 +163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,71 +164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,72 +163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,73 +162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,74 +160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,75 +158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,76 +156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,77 +154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,78 +153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,79 +152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,80 +152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,81 +150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,82 +148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,83 +144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,84 +139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,85 +131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,86 +122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,87 +110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,88 +98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,89 +85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,90 +75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,91 +67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,92 +61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,93 +57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,94 +53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,95 diff --git a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv index 9d45a55a3..5a61280e8 100644 --- a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv +++ b/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,1 -100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,2 -100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,3 -101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,4 -99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,5 -97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,6 -95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,7 -94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,8 -94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,9 -94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,10 -94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,11 -95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,12 -94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,13 -93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,14 -91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,15 -90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,16 -90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,17 -90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,18 -90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,19 -89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,20 -88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,21 -87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,22 -86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,23 -88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,24 -92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,25 -97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,26 -102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,27 -105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,28 -105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,29 -104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,30 -104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,31 -107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,32 -115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,33 -125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,34 -134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,35 -142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,36 -144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,37 -144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,38 -141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,39 -139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,40 -139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,41 -140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,42 -141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,43 -142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,44 -143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,45 -143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,46 -143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,47 -143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,48 -144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,49 -145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,50 -145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,51 -143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,52 -141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,53 -137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,54 -133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,55 -128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,56 -123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,57 -118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,58 -114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,59 -111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,60 -110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,61 -110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,62 -110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,63 -111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,64 -111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,65 -111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,66 -112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,67 -112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,68 -113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,69 -113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,70 -114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,71 -113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,72 -112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,73 -110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,74 -109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,75 -109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,76 -112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,77 -116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,78 -120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,79 -122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,80 -123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,81 -121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,82 -118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,83 -114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,84 -111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,85 -108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,86 -106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,87 -104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,88 -103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,89 -102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,90 -101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,91 -99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,92 -98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,93 -96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,94 -95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,95 -94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,96 +99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,0 +100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,1 +100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,2 +101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,3 +99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,4 +97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,5 +95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,6 +94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,7 +94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,8 +94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,9 +94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,10 +95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,11 +94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,12 +93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,13 +91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,14 +90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,15 +90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,16 +90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,17 +90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,18 +89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,19 +88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,20 +87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,21 +86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,22 +88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,23 +92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,24 +97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,25 +102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,26 +105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,27 +105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,28 +104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,29 +104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,30 +107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,31 +115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,32 +125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,33 +134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,34 +142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,35 +144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,36 +144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,37 +141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,38 +139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,39 +139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,40 +140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,41 +141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,42 +142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,43 +143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,44 +143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,45 +143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,46 +143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,47 +144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,48 +145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,49 +145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,50 +143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,51 +141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,52 +137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,53 +133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,54 +128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,55 +123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,56 +118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,57 +114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,58 +111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,59 +110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,60 +110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,61 +110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,62 +111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,63 +111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,64 +111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,65 +112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,66 +112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,67 +113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,68 +113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,69 +114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,70 +113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,71 +112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,72 +110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,73 +109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,74 +109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,75 +112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,76 +116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,77 +120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,78 +122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,79 +123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,80 +121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,81 +118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,82 +114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,83 +111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,84 +108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,85 +106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,86 +104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,87 +103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,88 +102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,89 +101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,90 +99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,91 +98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,92 +96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,93 +95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,94 +94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,95 diff --git a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv index b7f7de240..665fc3dab 100644 --- a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv +++ b/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,1 -75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,2 -75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,3 -75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,4 -74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,5 -73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,6 -72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,7 -71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,8 -70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,9 -69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,10 -69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,11 -69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,12 -69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,13 -68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,14 -68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,15 -68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,16 -68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,17 -68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,18 -68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,19 -68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,20 -68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,21 -68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,22 -68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,23 -67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,24 -66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,25 -67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,26 -71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,27 -81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,28 -96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,29 -115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,30 -135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,31 -153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,32 -165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,33 -174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,34 -180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,35 -184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,36 -187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,37 -190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,38 -192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,39 -194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,40 -196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,41 -197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,42 -198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,43 -199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,44 -200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,45 -201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,46 -202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,47 -203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,48 -204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,49 -205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,50 -205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,51 -202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,52 -197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,53 -188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,54 -177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,55 -163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,56 -147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,57 -131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,58 -115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,59 -102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,60 -94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,61 -89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,62 -86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,63 -85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,64 -84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,65 -83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,66 -82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,67 -81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,68 -79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,69 -77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,70 -76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,71 -76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,72 -77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,73 -78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,74 -80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,75 -81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,76 -80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,77 -80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,78 -80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,79 -81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,80 -83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,81 -86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,82 -89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,83 -90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,84 -90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,85 -87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,86 -84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,87 -81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,88 -78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,89 -77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,90 -75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,91 -74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,92 -73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,93 -71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,94 -70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,95 -69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,96 +75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,0 +75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,1 +75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,2 +75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,3 +74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,4 +73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,5 +72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,6 +71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,7 +70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,8 +69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,9 +69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,10 +69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,11 +69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,12 +68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,13 +68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,14 +68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,15 +68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,16 +68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,17 +68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,18 +68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,19 +68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,20 +68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,21 +68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,22 +67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,23 +66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,24 +67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,25 +71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,26 +81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,27 +96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,28 +115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,29 +135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,30 +153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,31 +165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,32 +174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,33 +180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,34 +184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,35 +187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,36 +190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,37 +192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,38 +194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,39 +196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,40 +197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,41 +198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,42 +199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,43 +200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,44 +201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,45 +202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,46 +203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,47 +204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,48 +205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,49 +205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,50 +202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,51 +197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,52 +188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,53 +177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,54 +163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,55 +147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,56 +131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,57 +115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,58 +102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,59 +94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,60 +89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,61 +86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,62 +85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,63 +84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,64 +83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,65 +82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,66 +81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,67 +79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,68 +77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,69 +76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,70 +76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,71 +77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,72 +78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,73 +80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,74 +81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,75 +80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,76 +80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,77 +80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,78 +81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,79 +83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,80 +86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,81 +89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,82 +90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,83 +90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,84 +87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,85 +84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,86 +81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,87 +78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,88 +77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,89 +75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,90 +74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,91 +73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,92 +71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,93 +70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,94 +69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,95 diff --git a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv index 56ce37f83..5cdfc79bf 100644 --- a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv +++ b/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,1 -118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,2 -145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,3 -168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,4 -182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,5 -188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,6 -189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,7 -187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,8 -184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,9 -182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,10 -181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,11 -182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,12 -186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,13 -192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,14 -199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,15 -206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,16 -212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,17 -217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,18 -221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,19 -224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,20 -228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,21 -231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,22 -234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,23 -235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,24 -236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,25 -235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,26 -234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,27 -233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,28 -232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,29 -230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,30 -225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,31 -217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,32 -204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,33 -189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,34 -173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,35 -158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,36 -146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,37 -137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,38 -131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,39 -128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,40 -126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,41 -125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,42 -125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,43 -124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,44 -124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,45 -123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,46 -122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,47 -122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,48 -124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,49 -125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,50 -125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,51 -122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,52 -116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,53 -106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,54 -96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,55 -86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,56 -79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,57 -75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,58 -73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,59 -73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,60 -75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,61 -77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,62 -79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,63 -80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,64 -80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,65 -78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,66 -76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,67 -74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,68 -72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,69 -71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,70 -69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,71 -67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,72 -65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,73 -62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,74 -59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,75 -58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,76 -58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,77 -58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,78 -59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,79 -59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,80 -59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,81 -57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,82 -56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,83 -54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,84 -52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,85 -51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,86 -49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,87 -48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,88 -47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,89 -47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,90 -47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,91 -47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,92 -48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,93 -48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,94 -49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,95 -49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,96 +91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,0 +118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,1 +145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,2 +168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,3 +182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,4 +188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,5 +189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,6 +187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,7 +184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,8 +182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,9 +181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,10 +182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,11 +186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,12 +192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,13 +199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,14 +206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,15 +212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,16 +217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,17 +221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,18 +224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,19 +228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,20 +231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,21 +234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,22 +235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,23 +236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,24 +235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,25 +234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,26 +233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,27 +232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,28 +230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,29 +225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,30 +217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,31 +204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,32 +189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,33 +173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,34 +158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,35 +146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,36 +137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,37 +131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,38 +128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,39 +126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,40 +125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,41 +125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,42 +124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,43 +124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,44 +123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,45 +122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,46 +122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,47 +124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,48 +125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,49 +125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,50 +122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,51 +116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,52 +106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,53 +96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,54 +86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,55 +79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,56 +75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,57 +73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,58 +73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,59 +75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,60 +77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,61 +79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,62 +80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,63 +80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,64 +78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,65 +76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,66 +74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,67 +72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,68 +71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,69 +69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,70 +67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,71 +65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,72 +62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,73 +59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,74 +58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,75 +58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,76 +58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,77 +59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,78 +59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,79 +59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,80 +57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,81 +56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,82 +54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,83 +52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,84 +51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,85 +49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,86 +48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,87 +47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,88 +47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,89 +47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,90 +47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,91 +48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,92 +48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,93 +49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,94 +49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,95 diff --git a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv index a2d141656..769fdadf5 100644 --- a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv +++ b/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,1 -59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,2 -59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,3 -58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,4 -57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,5 -54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,6 -51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,7 -48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,8 -46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,9 -45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,10 -44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,11 -43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,12 -43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,13 -43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,14 -42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,15 -41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,16 -40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,17 -39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,18 -38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,19 -38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,20 -38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,21 -38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,22 -39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,23 -40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,24 -41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,25 -42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,26 -43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,27 -46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,28 -49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,29 -53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,30 -57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,31 -61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,32 -64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,33 -67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,34 -70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,35 -73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,36 -78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,37 -84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,38 -91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,39 -100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,40 -110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,41 -120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,42 -129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,43 -137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,44 -142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,45 -145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,46 -147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,47 -147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,48 -147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,49 -146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,50 -145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,51 -144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,52 -143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,53 -142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,54 -142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,55 -144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,56 -148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,57 -154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,58 -160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,59 -167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,60 -173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,61 -179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,62 -183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,63 -184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,64 -184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,65 -182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,66 -179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,67 -179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,68 -180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,69 -183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,70 -189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,71 -196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,72 -204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,73 -213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,74 -221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,75 -228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,76 -233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,77 -236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,78 -237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,79 -236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,80 -234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,81 -231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,82 -226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,83 -220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,84 -213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,85 -206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,86 -197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,87 -187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,88 -175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,89 -163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,90 -150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,91 -137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,92 -125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,93 -113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,94 -102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,95 -93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,96 +60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,0 +59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,1 +59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,2 +58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,3 +57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,4 +54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,5 +51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,6 +48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,7 +46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,8 +45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,9 +44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,10 +43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,11 +43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,12 +43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,13 +42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,14 +41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,15 +40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,16 +39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,17 +38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,18 +38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,19 +38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,20 +38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,21 +39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,22 +40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,23 +41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,24 +42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,25 +43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,26 +46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,27 +49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,28 +53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,29 +57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,30 +61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,31 +64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,32 +67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,33 +70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,34 +73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,35 +78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,36 +84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,37 +91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,38 +100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,39 +110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,40 +120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,41 +129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,42 +137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,43 +142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,44 +145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,45 +147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,46 +147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,47 +147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,48 +146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,49 +145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,50 +144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,51 +143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,52 +142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,53 +142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,54 +144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,55 +148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,56 +154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,57 +160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,58 +167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,59 +173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,60 +179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,61 +183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,62 +184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,63 +184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,64 +182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,65 +179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,66 +179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,67 +180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,68 +183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,69 +189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,70 +196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,71 +204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,72 +213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,73 +221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,74 +228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,75 +233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,76 +236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,77 +237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,78 +236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,79 +234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,80 +231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,81 +226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,82 +220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,83 +213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,84 +206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,85 +197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,86 +187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,87 +175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,88 +163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,89 +150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,90 +137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,91 +125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,92 +113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,93 +102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,94 +93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,95 diff --git a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv index d1a2c5f8f..61be35c0e 100644 --- a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv +++ b/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,1 -57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,2 -56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,3 -56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,4 -55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,5 -54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,6 -53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,7 -52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,8 -52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,9 -52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,10 -51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,11 -51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,12 -50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,13 -49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,14 -48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,15 -47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,16 -47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,17 -47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,18 -47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,19 -47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,20 -48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,21 -49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,22 -50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,23 -51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,24 -53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,25 -57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,26 -66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,27 -81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,28 -105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,29 -135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,30 -167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,31 -196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,32 -220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,33 -235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,34 -241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,35 -236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,36 -217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,37 -190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,38 -161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,39 -135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,40 -117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,41 -107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,42 -102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,43 -102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,44 -105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,45 -109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,46 -112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,47 -112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,48 -107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,49 -98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,50 -89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,51 -81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,52 -76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,53 -74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,54 -73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,55 -72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,56 -71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,57 -69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,58 -68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,59 -66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,60 -65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,61 -65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,62 -64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,63 -64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,64 -63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,65 -63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,66 -64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,67 -65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,68 -68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,69 -74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,70 -85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,71 -105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,72 -133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,73 -164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,74 -193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,75 -213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,76 -220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,77 -215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,78 -201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,79 -183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,80 -163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,81 -142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,82 -123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,83 -107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,84 -95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,85 -86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,86 -80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,87 -75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,88 -72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,89 -70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,90 -67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,91 -65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,92 -62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,93 -59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,94 -57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,95 -54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,96 +58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,0 +57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,1 +56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,2 +56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,3 +55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,4 +54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,5 +53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,6 +52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,7 +52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,8 +52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,9 +51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,10 +51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,11 +50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,12 +49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,13 +48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,14 +47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,15 +47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,16 +47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,17 +47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,18 +47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,19 +48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,20 +49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,21 +50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,22 +51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,23 +53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,24 +57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,25 +66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,26 +81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,27 +105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,28 +135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,29 +167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,30 +196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,31 +220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,32 +235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,33 +241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,34 +236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,35 +217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,36 +190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,37 +161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,38 +135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,39 +117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,40 +107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,41 +102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,42 +102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,43 +105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,44 +109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,45 +112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,46 +112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,47 +107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,48 +98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,49 +89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,50 +81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,51 +76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,52 +74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,53 +73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,54 +72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,55 +71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,56 +69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,57 +68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,58 +66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,59 +65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,60 +65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,61 +64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,62 +64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,63 +63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,64 +63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,65 +64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,66 +65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,67 +68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,68 +74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,69 +85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,70 +105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,71 +133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,72 +164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,73 +193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,74 +213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,75 +220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,76 +215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,77 +201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,78 +183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,79 +163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,80 +142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,81 +123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,82 +107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,83 +95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,84 +86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,85 +80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,86 +75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,87 +72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,88 +70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,89 +67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,90 +65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,91 +62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,92 +59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,93 +57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,94 +54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,95 diff --git a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv index 29346ad06..4bc665ade 100644 --- a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv +++ b/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv @@ -1,97 +1,97 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour -70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,1 -69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,2 -68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,3 -66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,4 -65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,5 -63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,6 -61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,7 -59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,8 -57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,9 -56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,10 -56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,11 -55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,12 -54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,13 -53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,14 -53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,15 -52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,16 -52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,17 -52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,18 -51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,19 -51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,20 -52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,21 -52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,22 -53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,23 -54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,24 -56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,25 -58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,26 -62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,27 -67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,28 -75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,29 -84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,30 -95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,31 -107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,32 -119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,33 -132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,34 -144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,35 -154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,36 -161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,37 -165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,38 -167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,39 -165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,40 -162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,41 -157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,42 -153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,43 -152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,44 -155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,45 -159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,46 -163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,47 -163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,48 -157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,49 -148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,50 -137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,51 -127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,52 -118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,53 -112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,54 -108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,55 -103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,56 -99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,57 -95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,58 -92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,59 -89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,60 -88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,61 -88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,62 -88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,63 -88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,64 -88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,65 -88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,66 -89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,67 -90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,68 -93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,69 -98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,70 -103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,71 -109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,72 -116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,73 -123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,74 -130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,75 -136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,76 -139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,77 -142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,78 -142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,79 -141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,80 -138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,81 -133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,82 -128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,83 -122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,84 -116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,85 -111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,86 -105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,87 -99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,88 -94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,89 -90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,90 -85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,91 -81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,92 -77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,93 -74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,94 -71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,95 -68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,96 +70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,0 +69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,1 +68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,2 +66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,3 +65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,4 +63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,5 +61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,6 +59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,7 +57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,8 +56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,9 +56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,10 +55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,11 +54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,12 +53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,13 +53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,14 +52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,15 +52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,16 +52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,17 +51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,18 +51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,19 +52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,20 +52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,21 +53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,22 +54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,23 +56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,24 +58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,25 +62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,26 +67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,27 +75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,28 +84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,29 +95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,30 +107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,31 +119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,32 +132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,33 +144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,34 +154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,35 +161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,36 +165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,37 +167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,38 +165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,39 +162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,40 +157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,41 +153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,42 +152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,43 +155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,44 +159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,45 +163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,46 +163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,47 +157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,48 +148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,49 +137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,50 +127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,51 +118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,52 +112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,53 +108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,54 +103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,55 +99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,56 +95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,57 +92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,58 +89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,59 +88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,60 +88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,61 +88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,62 +88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,63 +88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,64 +88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,65 +89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,66 +90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,67 +93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,68 +98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,69 +103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,70 +109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,71 +116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,72 +123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,73 +130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,74 +136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,75 +139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,76 +142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,77 +142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,78 +141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,79 +138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,80 +133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,81 +128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,82 +122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,83 +116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,84 +111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,85 +105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,86 +99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,87 +94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,88 +90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,89 +85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,90 +81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,91 +77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,92 +74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,93 +71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,94 +68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,95 diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy similarity index 61% rename from src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy rename to src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index 834ca992d..d13a41185 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/DBEWLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -5,25 +5,22 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import static java.time.DayOfWeek.* - import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation -import edu.ie3.datamodel.models.Season import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.value.load.BdewLoadValues import spock.lang.Shared import spock.lang.Specification -class DBEWLoadProfileFactoryTest extends Specification { +class BdewLoadProfileFactoryTest extends Specification { @Shared - BDEWLoadProfileFactory factory + BdewLoadProfileFactory factory @Shared - private Set allEntries + private Set> allEntries def setupSpec() { - factory = new BDEWLoadProfileFactory() + factory = new BdewLoadProfileFactory() def data0 = new LoadProfileData([ "SuSa": "74.6", @@ -36,7 +33,7 @@ class DBEWLoadProfileFactoryTest extends Specification { "WiSu": "63.2", "WiWd": "65.5", "quarterHour": "0" - ] as Map, BDEWLoadProfileEntry) + ] as Map, BdewLoadValues) def data1 = new LoadProfileData([ "SuSa": "76.2", @@ -49,7 +46,7 @@ class DBEWLoadProfileFactoryTest extends Specification { "WiSu": "61.0", "WiWd": "62.6", "quarterHour": "1" - ] as Map, BDEWLoadProfileEntry) + ] as Map, BdewLoadValues) def data2 = new LoadProfileData([ "SuSa": "77.7", @@ -62,13 +59,13 @@ class DBEWLoadProfileFactoryTest extends Specification { "WiSu": "58.9", "WiWd": "59.6", "quarterHour": "2" - ] as Map, BDEWLoadProfileEntry) + ] as Map, BdewLoadValues) allEntries = [ factory.buildModel(data0), factory.buildModel(data1), factory.buildModel(data2) - ].flatten() as Set + ].flatten() as Set> } def "A BDEWLoadProfileFactory returns the correct fields"() { @@ -87,7 +84,7 @@ class DBEWLoadProfileFactoryTest extends Specification { ] as Set when: - def actual = factory.getFields(BDEWLoadProfileEntry) + def actual = factory.getFields(BdewLoadValues) then: actual.size() == 1 @@ -96,15 +93,15 @@ class DBEWLoadProfileFactoryTest extends Specification { def "A BDEWLoadProfileFactory refuses to build from invalid data"() { given: - def actualFields = factory.newSet("Wd", "Sa", "Su") + def actualFields = factory.newSet("Sa", "Su", "Wd") when: - def actual = factory.validate(actualFields, BDEWLoadProfileEntry) + def actual = factory.validate(actualFields, BdewLoadValues) then: actual.failure - actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BDEWLoadProfileEntry'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BDEWLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BdewLoadValues'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BdewLoadValues' are possible (NOT case-sensitive!):\n" + "0: [quarterHour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd] or [quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd]\n" } @@ -124,10 +121,10 @@ class DBEWLoadProfileFactoryTest extends Specification { ] as Map when: - def entries = factory.buildModel(new LoadProfileData<>(data, BDEWLoadProfileEntry)) + def entry = factory.buildModel(new LoadProfileData<>(data, BdewLoadValues)) then: - entries.size() == 9 + entry.value.class == BdewLoadValues } def "A BDEWLoadProfileFactory builds time series from entries"() { @@ -141,20 +138,6 @@ class DBEWLoadProfileFactoryTest extends Specification { then: lpts.loadProfile == BdewStandardLoadProfile.G0 - lpts.entries.size() == 27 - - lpts.valueMapping.keySet() == [ - new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SATURDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, SUNDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.SUMMER, MONDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SATURDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, SUNDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.TRANSITION, MONDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SATURDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, SUNDAY), - new BDEWLoadProfileTimeSeries.BdewKey(Season.WINTER, MONDAY), - ] as Set - - lpts.valueMapping.values().every { it.size() == 3} + lpts.entries.size() == 3 } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 7ab6f8247..eaa1d3ea9 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -5,12 +5,10 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import static java.time.DayOfWeek.* - import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation import edu.ie3.datamodel.models.profile.LoadProfile -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries -import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.value.load.RandomLoadValues import spock.lang.Shared import spock.lang.Specification @@ -19,7 +17,7 @@ class RandomLoadProfileFactoryTest extends Specification { RandomLoadProfileFactory factory @Shared - private Set allEntries + private Set> allEntries def setupSpec() { factory = new RandomLoadProfileFactory() @@ -35,7 +33,7 @@ class RandomLoadProfileFactoryTest extends Specification { "sigmaSu": "0.0370676517486572", "sigmaWd": "0.0293692331761122", "quarterHour": "0" - ] as Map, RandomLoadProfileEntry) + ] as Map, RandomLoadValues) def data1 = new LoadProfileData([ "kSa": "0.281179457902908", @@ -48,7 +46,7 @@ class RandomLoadProfileFactoryTest extends Specification { "sigmaSu": "0.0334825366735458", "sigmaWd": "0.0265011098235846", "quarterHour": "1" - ] as Map, RandomLoadProfileEntry) + ] as Map, RandomLoadValues) def data2 = new LoadProfileData([ "kSa": "0.275563269853592", @@ -61,13 +59,13 @@ class RandomLoadProfileFactoryTest extends Specification { "sigmaSu": "0.0310499873012304", "sigmaWd": "0.0245211906731129", "quarterHour": "2" - ] as Map, RandomLoadProfileEntry) + ] as Map, RandomLoadValues) allEntries = [ factory.buildModel(data0), factory.buildModel(data1), factory.buildModel(data2) - ].flatten() as Set + ].flatten() as Set> } def "A RandomLoadProfileFactory returns the correct fields"() { @@ -86,7 +84,7 @@ class RandomLoadProfileFactoryTest extends Specification { ] as Set when: - def actual = factory.getFields(RandomLoadProfileEntry) + def actual = factory.getFields(RandomLoadValues) then: actual.size() == 1 @@ -98,12 +96,12 @@ class RandomLoadProfileFactoryTest extends Specification { def actualFields = factory.newSet("Wd", "Sa", "Su") when: - def actual = factory.validate(actualFields, RandomLoadProfileEntry) + def actual = factory.validate(actualFields, RandomLoadValues) then: actual.failure - actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadProfileEntry'. \n" + - "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadProfileEntry' are possible (NOT case-sensitive!):\n" + + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadValues'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadValues' are possible (NOT case-sensitive!):\n" + "0: [kSa, kSu, kWd, mySa, mySu, myWd, quarterHour, sigmaSa, sigmaSu, sigmaWd] or [k_sa, k_su, k_wd, my_sa, my_su, my_wd, quarter_hour, sigma_sa, sigma_su, sigma_wd]\n" } @@ -123,10 +121,10 @@ class RandomLoadProfileFactoryTest extends Specification { ] as Map when: - def entries = factory.buildModel(new LoadProfileData<>(data, RandomLoadProfileEntry)) + def entry = factory.buildModel(new LoadProfileData<>(data, RandomLoadValues)) then: - entries.size() == 3 + entry.value.class == RandomLoadValues } def "A RandomLoadProfileFactory builds time series from entries"() { @@ -140,14 +138,6 @@ class RandomLoadProfileFactoryTest extends Specification { then: lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE - lpts.entries.size() == 9 - - lpts.valueMapping.keySet() == [ - new LoadProfileTimeSeries.WeekDayKey(SATURDAY), - new LoadProfileTimeSeries.WeekDayKey(SUNDAY), - new LoadProfileTimeSeries.WeekDayKey(MONDAY), - ] as Set - - lpts.valueMapping.values().every { it.size() == 3} + lpts.entries.size() == 3 } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 434e3b70a..897873d76 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -34,7 +34,7 @@ import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.RepetitiveTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits @@ -414,7 +414,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile time series" () { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - BDEWLoadProfileTimeSeries timeSeries = Mock(BDEWLoadProfileTimeSeries) + BdewLoadProfileTimeSeries timeSeries = Mock(BdewLoadProfileTimeSeries) timeSeries.uuid >> uuid timeSeries.loadProfile >> type @@ -427,7 +427,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { where: clazz | uuid | type || expectedFileName - BDEWLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" + BdewLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 2362ebae8..74d46aadf 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -40,13 +40,12 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries -import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileEntry import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.datamodel.models.value.load.RandomLoadValues import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.util.TimeUtil @@ -145,8 +144,8 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndPValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), - new TimeSeriesProcessorKey(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue), - new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, RandomLoadProfileEntry, PValue) + new TimeSeriesProcessorKey(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues), + new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, LoadProfileEntry, RandomLoadValues) ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 4633b1e58..56eb58c60 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -10,11 +10,10 @@ import edu.ie3.datamodel.io.processor.Processor import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification @@ -214,7 +213,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete LoadProfileTimeSeries correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BDEWLoadProfileTimeSeries, BDEWLoadProfileEntry, PValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues) when: Set> actual = processor.handleTimeSeries(loadProfileTimeSeries) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy index 3f1b5b517..14066bd5a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -19,7 +19,7 @@ class LoadProfileSourceTest extends Specification { then: profiles.size() == 11 BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } - profiles.values().every { it.entries.size() == 864} + profiles.values().every { it.entries.size() == 96} } def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { @@ -28,6 +28,6 @@ class LoadProfileSourceTest extends Specification { then: random.loadProfile == RANDOM_LOAD_PROFILE - random.entries.size() == 288 + random.entries.size() == 96 } } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index a0a641cab..691646e4e 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -9,24 +9,22 @@ import static edu.ie3.util.quantities.PowerSystemUnits.* import static tech.units.indriya.unit.Units.CELSIUS import static tech.units.indriya.unit.Units.METRE_PER_SECOND -import edu.ie3.datamodel.models.Season import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.BDEWLoadProfileTimeSeries -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory import org.locationtech.jts.geom.Point import org.locationtech.jts.geom.PrecisionModel import tech.units.indriya.quantity.Quantities -import java.time.DayOfWeek import java.time.ZoneId import java.time.ZonedDateTime @@ -396,52 +394,57 @@ trait TimeSeriesTestData { ] as LinkedHashMap ] as Set - BDEWLoadProfileTimeSeries loadProfileTimeSeries = new BDEWLoadProfileTimeSeries( + BdewLoadProfileTimeSeries loadProfileTimeSeries = new BdewLoadProfileTimeSeries( UUID.fromString("b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc"), BdewStandardLoadProfile.G2, [ - new BDEWLoadProfileEntry( - new PValue(Quantities.getQuantity(5d, KILOWATT)), - Season.SUMMER, - DayOfWeek.MONDAY, - 0 + new LoadProfileEntry<>( + new BdewLoadValues(63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), 0 ), - new BDEWLoadProfileEntry( - new PValue(Quantities.getQuantity(15d, KILOWATT)), - Season.SUMMER, - DayOfWeek.MONDAY, - 1 + new LoadProfileEntry<>( + new BdewLoadValues(58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4), 1), + new LoadProfileEntry<>( + new BdewLoadValues(53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4), 2 ), - new BDEWLoadProfileEntry( - new PValue(Quantities.getQuantity(10d, KILOWATT)), - Season.SUMMER, - DayOfWeek.MONDAY, - 2 - ) ] as Set ) Set> loadProfileTimeSeriesProcessed = [ [ - "dayOfWeek" : "MONDAY", - "loadProfile": "g2", - "season": "su", - "p" : "5.0", - "quarterHourOfDay" : "0" + "suSa": "63.1", + "suSu": "50.6", + "suWd": "60.8", + "trSa": "73.1", + "trSu": "64.2", + "trWd": "70.5", + "wiSa": "80.6", + "wiSu": "73.7", + "wiWd": "77.4", + "quarterHour": "0" ] as LinkedHashMap, [ - "dayOfWeek" : "MONDAY", - "loadProfile": "g2", - "season": "su", - "p" : "15.0", - "quarterHourOfDay" : "1" + "suSa": "58.0", + "suSu": "47.4", + "suWd": "53.0", + "trSa": "67.6", + "trSu": "60.7", + "trWd": "61.9", + "wiSa": "74.6", + "wiSu": "68.7", + "wiWd": "67.4", + "quarterHour": "1" ] as LinkedHashMap, [ - "dayOfWeek" : "MONDAY", - "loadProfile": "g2", - "season": "su", - "p" : "10.0", - "quarterHourOfDay" : "2" + "suSa": "53.5", + "suSu": "44.3", + "suWd": "46.0", + "trSa": "62.8", + "trSu": "56.9", + "trWd": "54.4", + "wiSa": "69.2", + "wiSu": "63.6", + "wiWd": "58.4", + "quarterHour": "2" ] as LinkedHashMap ] as Set From 683a2b7f5dbf012347fa3879fbff0bc3bcc80eb8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 6 Sep 2024 14:15:15 +0200 Subject: [PATCH 112/310] Fixing codacy issues. --- src/main/java/edu/ie3/datamodel/models/BdewSeason.java | 2 +- .../edu/ie3/datamodel/models/value/load/BdewLoadValues.java | 2 +- .../edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy | 2 +- src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java index a10acb260..defb4c016 100644 --- a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -34,7 +34,7 @@ public static BdewSeason parse(String key) throws ParsingException { * @param time the time * @return a season */ - public static BdewSeason get(ZonedDateTime time) { + public static BdewSeason getSeason(ZonedDateTime time) { int day = time.getDayOfMonth(); // winter: 1.11.-20.03. diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 1364efdaf..8e526c214 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -73,7 +73,7 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { TRANSITION, TrWd); }; - PValue value = new PValue(Quantities.getQuantity(mapping.get(BdewSeason.get(time)), KILOWATT)); + PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), KILOWATT)); if (loadProfile == BdewStandardLoadProfile.H0) { /* For the residential average profile, a dynamization has to be taken into account */ diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy index 14066bd5a..322ceb75b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -19,7 +19,7 @@ class LoadProfileSourceTest extends Specification { then: profiles.size() == 11 BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } - profiles.values().every { it.entries.size() == 96} + profiles.values().every { it.entries.size() == 96 } } def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 691646e4e..d452e6220 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -402,9 +402,9 @@ trait TimeSeriesTestData { new BdewLoadValues(63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), 0 ), new LoadProfileEntry<>( - new BdewLoadValues(58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4), 1), + new BdewLoadValues(58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), 1), new LoadProfileEntry<>( - new BdewLoadValues(53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4), 2 + new BdewLoadValues(53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), 2 ), ] as Set ) From 51f3bdbf0c929a4f72433f63c0b314267d76b9bc Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 9 Sep 2024 11:01:24 +0200 Subject: [PATCH 113/310] Adding `maxPower` to `BdewLoadProfileTimeSeries`. --- .../repetitive/BdewLoadProfileTimeSeries.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 478a9f3b1..8036559cc 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -5,23 +5,65 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import java.util.Objects; -import java.util.Set; -import java.util.UUID; +import java.util.*; +import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a * pattern */ public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { + /** + * The maximum average power consumption per quarter hour for a given load profile, calculated + * over all seasons and weekday types of given load profile + */ + public final PValue maxPower; public BdewLoadProfileTimeSeries( UUID uuid, BdewStandardLoadProfile loadProfile, Set> values) { super(uuid, loadProfile, values); + + double power; + + if (loadProfile == BdewStandardLoadProfile.H0) { + power = + values.stream() + .map(TimeSeriesEntry::getValue) + .map(v -> List.of(v.getWiSa(), v.getWiSu(), v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()) + .orElse(0d); + + } else { + power = + values.stream() + .map(LoadProfileEntry::getValue) + .map( + v -> + List.of( + v.getSuSa(), + v.getSuSu(), + v.getSuWd(), + v.getTrSa(), + v.getTrSu(), + v.getTrWd(), + v.getWiSa(), + v.getWiSu(), + v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()) + .orElse(0d); + } + + this.maxPower = new PValue(Quantities.getQuantity(power, KILOWATT)); } @Override From 086a492d2efd2b805f15e7bb9157df5e3019ef56 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 9 Sep 2024 11:37:20 +0200 Subject: [PATCH 114/310] Adding power information. --- .../timeseries/repetitive/BdewLoadProfileTimeSeries.java | 6 +++--- .../timeseries/repetitive/RandomLoadProfileTimeSeries.java | 5 +++++ .../edu/ie3/datamodel/models/value/load/BdewLoadValues.java | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 8036559cc..39ce98f09 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -16,7 +16,7 @@ /** * Describes a bdew load profile time series with repetitive values that can be calculated from a - * pattern + * pattern. Each value of this timeseries is given in W. */ public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { /** @@ -63,7 +63,7 @@ public BdewLoadProfileTimeSeries( .orElse(0d); } - this.maxPower = new PValue(Quantities.getQuantity(power, KILOWATT)); + this.maxPower = new PValue(Quantities.getQuantity(power, WATT)); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index 85e457880..cc50077b3 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -5,12 +5,17 @@ */ package edu.ie3.datamodel.models.timeseries.repetitive; +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.Objects; import java.util.Set; import java.util.UUID; +/** + * Describes a random load profile time series based on a {@link + * GeneralizedExtremeValueDistribution}. Each value of this# timeseries is given in kW. + */ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries) { diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 8e526c214..1918542ec 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.models.value.load; import static edu.ie3.datamodel.models.BdewSeason.*; -import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; import static java.lang.Math.pow; import static java.lang.Math.round; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.models.BdewSeason; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; @@ -73,7 +73,7 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { TRANSITION, TrWd); }; - PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), KILOWATT)); + PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), WATT)); if (loadProfile == BdewStandardLoadProfile.H0) { /* For the residential average profile, a dynamization has to be taken into account */ @@ -103,7 +103,7 @@ private PValue dynamization(PValue load, int t) { load.getP() .map(v -> v.getValue().doubleValue()) .map(round) - .map(v -> Quantities.getQuantity(v, KILOWATT)) + .map(v -> Quantities.getQuantity(v, WATT)) .orElse(null); return new PValue(value); From ba498fd7f9d867af615267ee84c43f2849148e63 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 9 Sep 2024 16:35:33 +0200 Subject: [PATCH 115/310] Adding `maxPower` to `LoadProfileTimeSeries`. Adding sql sources for `LoadProfileTimeSeries`. --- .../timeseries/BdewLoadProfileFactory.java | 55 ++++- .../timeseries/LoadProfileFactory.java | 23 ++- .../timeseries/RandomLoadProfileFactory.java | 12 +- .../TimeSeriesMetaInformationFactory.java | 19 +- .../io/naming/DatabaseNamingStrategy.java | 5 + .../io/source/LoadProfileSource.java | 12 ++ .../TimeSeriesMetaInformationSource.java | 18 ++ .../io/source/csv/CsvLoadProfileSource.java | 6 + .../CsvTimeSeriesMetaInformationSource.java | 27 ++- .../io/source/sql/SqlLoadProfileSource.java | 195 ++++++++++++++++++ .../SqlTimeSeriesMetaInformationSource.java | 54 ++++- .../repetitive/BdewLoadProfileTimeSeries.java | 56 +---- .../repetitive/LoadProfileTimeSeries.java | 25 ++- .../RandomLoadProfileTimeSeries.java | 3 +- .../ie3/datamodel/utils/TimeSeriesUtils.java | 10 + .../source/sql/SqlLoadProfileSourceIT.groovy | 97 +++++++++ ...qlTimeSeriesMetaInformationSourceIT.groovy | 39 +++- .../common/TimeSeriesSourceTestData.groovy | 9 + .../ie3/test/common/TimeSeriesTestData.groovy | 3 +- .../_timeseries/time_series_load_profiles.sql | 36 ++++ 20 files changed, 633 insertions(+), 71 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 9c90e1818..265fd4c09 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -5,16 +5,20 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import static tech.units.indriya.unit.Units.WATT; + import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import java.util.List; -import java.util.Set; +import java.util.*; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; public class BdewLoadProfileFactory extends LoadProfileFactory { @@ -71,11 +75,14 @@ protected List> getFields(Class entityClass) { } @Override - public LoadProfileTimeSeries build( + public BdewLoadProfileTimeSeries build( LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries) { - return new BdewLoadProfileTimeSeries( - metaInformation.getUuid(), parseProfile(metaInformation.getProfile()), entries); + + BdewStandardLoadProfile profile = parseProfile(metaInformation.getProfile()); + Optional> maxPower = calculateMaxPower(profile, entries); + + return new BdewLoadProfileTimeSeries(metaInformation.getUuid(), profile, entries, maxPower); } @Override @@ -86,4 +93,40 @@ public BdewStandardLoadProfile parseProfile(String profile) { throw new FactoryException("An error occurred while parsing the profile: " + profile, e); } } + + @Override + public Optional> calculateMaxPower( + BdewStandardLoadProfile loadProfile, Set> entries) { + Optional power; + + if (loadProfile == BdewStandardLoadProfile.H0) { + power = + entries.stream() + .map(TimeSeriesEntry::getValue) + .map(v -> List.of(v.getWiSa(), v.getWiSu(), v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()); + + } else { + power = + entries.stream() + .map(LoadProfileEntry::getValue) + .map( + v -> + List.of( + v.getSuSa(), + v.getSuSu(), + v.getSuWd(), + v.getTrSa(), + v.getTrSu(), + v.getTrWd(), + v.getWiSa(), + v.getWiSu(), + v.getWiWd())) + .flatMap(Collection::stream) + .max(Comparator.naturalOrder()); + } + + return power.map(p -> Quantities.getQuantity(p, WATT)); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index a7cb16b13..a65c39a32 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -11,18 +11,37 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.LoadValues; +import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; public abstract class LoadProfileFactory

    extends Factory, LoadProfileEntry> { - public static final String QUARTER_HOUR = "quarterHour"; + protected static final String QUARTER_HOUR = "quarterHour"; public LoadProfileFactory(Class valueClass) { super(valueClass); } public abstract LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set> data); + LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries); public abstract P parseProfile(String profile); + + /** + * Calculates the maximum average power consumption per quarter-hour for a given calculated over + * all seasons and weekday types of given load profile + * + * @param loadProfile given load profile + * @param entries with power values + * @return an option for the maximal power + */ + public abstract Optional> calculateMaxPower( + P loadProfile, Set> entries); + + /** Returns the quarter-hour field. */ + public String getTimeFieldString() { + return QUARTER_HOUR; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 8d741bb2a..c5c182ea6 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -10,11 +10,13 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.List; +import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; public class RandomLoadProfileFactory extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; @@ -66,7 +68,7 @@ protected List> getFields(Class entityClass) { } @Override - public LoadProfileTimeSeries build( + public RandomLoadProfileTimeSeries build( LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries) { return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); @@ -76,4 +78,10 @@ public LoadProfileTimeSeries build( public LoadProfile parseProfile(String profile) { return RANDOM_LOAD_PROFILE; } + + @Override + public Optional> calculateMaxPower( + LoadProfile loadProfile, Set> loadProfileEntries) { + return Optional.empty(); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index 327f920eb..aebbfa02e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -7,8 +7,10 @@ import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import java.util.Collections; import java.util.List; import java.util.Set; @@ -21,12 +23,13 @@ * mappings */ public class TimeSeriesMetaInformationFactory - extends EntityFactory { + extends EntityFactory { private static final String TIME_SERIES = "timeSeries"; private static final String COLUMN_SCHEME = "columnScheme"; + private static final String LOAD_PROFILE = "loadProfile"; public TimeSeriesMetaInformationFactory() { - super(IndividualTimeSeriesMetaInformation.class); + super(IndividualTimeSeriesMetaInformation.class, LoadProfileTimeSeriesMetaInformation.class); } @Override @@ -36,9 +39,15 @@ protected List> getFields(Class entityClass) { } @Override - protected IndividualTimeSeriesMetaInformation buildModel(EntityData data) { + protected TimeSeriesMetaInformation buildModel(EntityData data) { UUID timeSeries = data.getUUID(TIME_SERIES); - ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); - return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); + + if (LoadProfileTimeSeriesMetaInformation.class.isAssignableFrom(data.getTargetClass())) { + String profile = data.getField(LOAD_PROFILE); + return new LoadProfileTimeSeriesMetaInformation(timeSeries, profile); + } else { + ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); + return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); + } } } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 2be6831fd..26939fea2 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -42,6 +42,11 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { return TIME_SERIES_PREFIX + columnScheme.getScheme(); } + /** Provides the name of the time series table that contains all load profiles. */ + public String getLoadProfileTimeSeriesEntityName() { + return TIME_SERIES_PREFIX + "load_profiles"; + } + public Optional getEntityName(Class cls) { return entityPersistenceNamingStrategy.getEntityName(cls); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index 57f4dddb8..b9fc6c770 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -8,6 +8,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData; @@ -18,6 +19,7 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.*; +import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.models.value.load.BdewLoadValues; import edu.ie3.datamodel.models.value.load.LoadValues; @@ -27,6 +29,7 @@ import java.time.ZonedDateTime; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -65,6 +68,15 @@ protected Try, FactoryException> createEntries( */ public abstract List getTimeKeysAfter(ZonedDateTime time); + /** + * Method to get the value for a given time. + * + * @param time for which a value is needed + * @return an optional + * @throws SourceException if an exception occurred + */ + public abstract Optional getValue(ZonedDateTime time) throws SourceException; + /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java index d97c032ba..3bc09db66 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java @@ -7,6 +7,8 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -29,4 +31,20 @@ public interface TimeSeriesMetaInformationSource { * @return An Option on the meta information */ Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid); + + /** + * Gat a mapping from load profile to {@link LoadProfileTimeSeriesMetaInformation}. + * + * @return that mapping + */ + Map getLoadProfileMetaInformation(); + + /** + * Get an option on the given time series meta information + * + * @param loadProfile load profile of the time series in question + * @return An Option on the meta information + */ + Optional getLoadProfileMetaInformation( + LoadProfile loadProfile); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index aa742557d..3bcebfa12 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -14,6 +14,7 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.load.LoadValues; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; @@ -67,6 +68,11 @@ public List getTimeKeysAfter(ZonedDateTime time) { return loadProfileTimeSeries.getTimeKeysAfter(time); } + @Override + public Optional getValue(ZonedDateTime time) throws SourceException { + return loadProfileTimeSeries.getValue(time); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index dbf5114cf..101dd838c 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -6,15 +6,20 @@ package edu.ie3.datamodel.io.source.csv; import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMetaInformationSource; +import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.TimeSeriesUtils; import java.nio.file.Path; +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.UUID; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -27,6 +32,8 @@ public class CsvTimeSeriesMetaInformationSource implements TimeSeriesMetaInforma private final Map timeSeriesMetaInformation; + private final Map loadProfileMetaInformation; + /** * Creates a time series type source * @@ -41,12 +48,17 @@ public CsvTimeSeriesMetaInformationSource( this.timeSeriesMetaInformation = dataSource.getCsvIndividualTimeSeriesMetaInformation( TimeSeriesUtils.getAcceptedColumnSchemes().toArray(new ColumnScheme[0])); + + this.loadProfileMetaInformation = + dataSource.getCsvLoadProfileMetaInformation().stream() + .collect( + Collectors.toMap( + LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); } @Override public Map getTimeSeriesMetaInformation() { - return timeSeriesMetaInformation.entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + return Collections.unmodifiableMap(timeSeriesMetaInformation); } @Override @@ -54,4 +66,15 @@ public Optional getTimeSeriesMetaInformatio UUID timeSeriesUuid) { return Optional.ofNullable(timeSeriesMetaInformation.get(timeSeriesUuid)); } + + @Override + public Map getLoadProfileMetaInformation() { + return Collections.unmodifiableMap(loadProfileMetaInformation); + } + + @Override + public Optional getLoadProfileMetaInformation( + LoadProfile loadProfile) { + return Optional.ofNullable(loadProfileMetaInformation.get(loadProfile.getKey())); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java new file mode 100644 index 000000000..5cdabea95 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -0,0 +1,195 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.source.sql; + +import static edu.ie3.datamodel.io.source.sql.SqlDataSource.createBaseQueryString; + +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.connectors.SqlConnector; +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; +import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.source.LoadProfileSource; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.models.value.load.LoadValues; +import edu.ie3.datamodel.utils.TimeSeriesUtils; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Sql source for {@link LoadProfileTimeSeries}. + * + * @param

    type of load profile + * @param type of load values + */ +public class SqlLoadProfileSource

    + extends LoadProfileSource { + protected static final Logger log = LoggerFactory.getLogger(SqlTimeSeriesSource.class); + private final SqlDataSource dataSource; + private final String tableName; + + private final LoadProfileTimeSeriesMetaInformation metaInformation; + private final P loadProfile; + + // General fields + private static final String WHERE = " WHERE "; + private static final String TIME_SERIES = "time_series"; + private static final String LOAD_PROFILE = "load_profile"; + + /** + * Queries that are available within this source. Motivation to have them as field value is to + * avoid creating a new string each time, bc they're always the same. + */ + private final String queryFull; + + private final String queryTime; + + public SqlLoadProfileSource( + SqlDataSource dataSource, + LoadProfileTimeSeriesMetaInformation metaInformation, + Class entryClass, + LoadProfileFactory entryFactory) { + super(entryClass, entryFactory); + this.dataSource = dataSource; + + this.tableName = dataSource.databaseNamingStrategy.getLoadProfileTimeSeriesEntityName(); + this.metaInformation = metaInformation; + this.loadProfile = entryFactory.parseProfile(metaInformation.getProfile()); + + String dbTimeColumnName = + dataSource.getDbColumnName(entryFactory.getTimeFieldString(), tableName); + + this.queryFull = createQueryFull(dataSource.schemaName, tableName); + this.queryTime = createQueryForTime(dataSource.schemaName, tableName, dbTimeColumnName); + } + + public SqlLoadProfileSource( + SqlConnector connector, + String schemaName, + DatabaseNamingStrategy namingStrategy, + LoadProfileTimeSeriesMetaInformation metaInformation, + Class entryClass, + LoadProfileFactory entryFactory) { + this( + new SqlDataSource(connector, schemaName, namingStrategy), + metaInformation, + entryClass, + entryFactory); + } + + @Override + public void validate() throws ValidationException { + validate(entryClass, () -> dataSource.getSourceFields(tableName), entryFactory); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + @Override + public LoadProfileTimeSeries getTimeSeries() { + Set> entries = getEntries(queryFull, ps -> {}); + return entryFactory.build(metaInformation, entries); + } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + return List.of(time.plusMinutes(15)); + } + + @Override + public Optional getValue(ZonedDateTime time) throws SourceException { + Set> entries = + getEntries(queryTime, ps -> ps.setInt(1, TimeSeriesUtils.calculateQuarterHourOfDay(time))); + if (entries.isEmpty()) return Optional.empty(); + if (entries.size() > 1) log.warn("Retrieved more than one result value, using the first"); + return Optional.of(entries.stream().toList().get(0).getValue().getValue(time, loadProfile)); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Creates a set of {@link LoadProfileEntry} from database. + * + * @param query to execute + * @param addParams additional parameters + * @return a set of {@link LoadProfileEntry} + */ + private Set> getEntries(String query, SqlDataSource.AddParams addParams) { + return dataSource + .executeQuery(query, addParams) + .map(this::createEntity) + .flatMap(Optional::stream) + .collect(Collectors.toSet()); + } + + /** + * Build a {@link LoadProfileEntry} of type {@code V}, whereas the underlying {@link Value} does + * not need any additional information. + * + * @param fieldToValues Mapping from field id to values + * @return optional {@link LoadProfileEntry} + */ + private Optional> createEntity(Map fieldToValues) { + fieldToValues.remove("timeSeries"); + return createEntries(fieldToValues).getData(); + } + + /** + * Creates a base query to retrieve all entities for this time series:
    + * {@code WHERE time_series = $timeSeriesUuid AND

    extends EntitySource { - private static final CsvDataSource buildInSource = getBuildInSource(Path.of("load")); - protected final Class entryClass; protected final LoadProfileFactory entryFactory; @@ -82,7 +82,10 @@ protected Try, FactoryException> createEntries( * * @return a map: load profile to time series */ - public static Map getBDEWLoadProfiles() { + public static Map getBDEWLoadProfiles() + throws SourceException { + CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); + BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() @@ -100,7 +103,9 @@ public static Map getBDEWLoa * * @return the random load profile time series */ - public static RandomLoadProfileTimeSeries getRandomLoadProfile() { + public static RandomLoadProfileTimeSeries getRandomLoadProfile() throws SourceException { + CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); + CsvLoadProfileMetaInformation metaInformation = buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).stream() .findAny() diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 322a1c9e6..c15e308cb 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -58,6 +58,13 @@ public CsvDataSource(String csvSep, Path directoryPath, FileNamingStrategy fileN this.fileNamingStrategy = fileNamingStrategy; } + public CsvDataSource( + String csvSep, CsvFileConnector connector, FileNamingStrategy fileNamingStrategy) { + this.csvSep = csvSep; + this.connector = connector; + this.fileNamingStrategy = fileNamingStrategy; + } + @Override public Optional> getSourceFields(Class entityClass) throws SourceException { diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index 101dd838c..a3c828903 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -43,7 +43,16 @@ public class CsvTimeSeriesMetaInformationSource implements TimeSeriesMetaInforma */ public CsvTimeSeriesMetaInformationSource( String csvSep, Path folderPath, FileNamingStrategy fileNamingStrategy) { - this.dataSource = new CsvDataSource(csvSep, folderPath, fileNamingStrategy); + this(new CsvDataSource(csvSep, folderPath, fileNamingStrategy)); + } + + /** + * Creates a time series type source + * + * @param dataSource a csv data source + */ + public CsvTimeSeriesMetaInformationSource(CsvDataSource dataSource) { + this.dataSource = dataSource; // retrieve only the desired time series this.timeSeriesMetaInformation = dataSource.getCsvIndividualTimeSeriesMetaInformation( From ee53f1ea643c4a356b9084f66630d30ffef03bba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 06:26:36 +0000 Subject: [PATCH 125/310] Bump commons-io:commons-io from 2.16.1 to 2.17.0 (#1153) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a2a4bb6de..37db3ba83 100644 --- a/build.gradle +++ b/build.gradle @@ -93,7 +93,7 @@ dependencies { implementation 'com.couchbase.client:java-client:3.7.2' runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime - implementation 'commons-io:commons-io:2.16.1' // I/O functionalities + implementation 'commons-io:commons-io:2.17.0' // I/O functionalities implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress implementation 'org.apache.commons:commons-compress:1.27.1' // I/O functionalities } From 08ed24e10cad63d351a37714cc8313ca10c0ee94 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 20 Sep 2024 13:10:21 +0200 Subject: [PATCH 126/310] Improving code. --- .../io/factory/timeseries/BdewLoadProfileFactory.java | 5 +++++ .../io/factory/timeseries/LoadProfileFactory.java | 3 +++ .../factory/timeseries/RandomLoadProfileFactory.java | 5 +++++ .../ie3/datamodel/io/source/LoadProfileSource.java | 10 ++++++++++ .../datamodel/io/source/csv/CsvLoadProfileSource.java | 7 +++++++ .../datamodel/io/source/sql/SqlLoadProfileSource.java | 7 +++++++ .../java/edu/ie3/datamodel/models/BdewSeason.java | 11 +++++++---- 7 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 265fd4c09..c45b3705e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -129,4 +129,9 @@ public Optional> calculateMaxPower( return power.map(p -> Quantities.getQuantity(p, WATT)); } + + @Override + public double getLoadProfileEnergyScaling() { + return 1000d; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index a65c39a32..18402be8f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -44,4 +44,7 @@ public abstract Optional> calculateMaxPower( public String getTimeFieldString() { return QUARTER_HOUR; } + + /** Returns the load profile energy scaling. */ + public abstract double getLoadProfileEnergyScaling(); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index c5c182ea6..3dace9bdb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -84,4 +84,9 @@ public Optional> calculateMaxPower( LoadProfile loadProfile, Set> loadProfileEntries) { return Optional.empty(); } + + @Override + public double getLoadProfileEnergyScaling() { + return 1d; + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index f5f60b0a4..baac992e9 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -34,6 +34,8 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; public abstract class LoadProfileSource

    extends EntitySource { @@ -77,6 +79,14 @@ protected Try, FactoryException> createEntries( */ public abstract Optional getValue(ZonedDateTime time) throws SourceException; + /** Returns the maximal power value of the time series */ + public abstract Optional> getMaxValue(); + + /** Returns the load profile energy scaling for this load profile time series. */ + public double getLoadProfileEnergyScaling() { + return entryFactory.getLoadProfileEnergyScaling(); + } + /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 3bcebfa12..c4719560e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -22,6 +22,8 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Source that is capable of providing information around load profile time series from csv files. @@ -73,6 +75,11 @@ public Optional getValue(ZonedDateTime time) throws SourceException { return loadProfileTimeSeries.getValue(time); } + @Override + public Optional> getMaxValue() { + return loadProfileTimeSeries.maxPower; + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 5cdabea95..1ab5de5a9 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -27,8 +27,10 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.measure.quantity.Power; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tech.units.indriya.ComparableQuantity; /** * Sql source for {@link LoadProfileTimeSeries}. @@ -118,6 +120,11 @@ public Optional getValue(ZonedDateTime time) throws SourceException { return Optional.of(entries.stream().toList().get(0).getValue().getValue(time, loadProfile)); } + @Override + public Optional> getMaxValue() { + return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java index defb4c016..eb7336c55 100644 --- a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -21,10 +21,13 @@ public enum BdewSeason { public static BdewSeason parse(String key) throws ParsingException { return switch (key) { - case "Wi" -> WINTER; - case "Su" -> SUMMER; - case "Tr" -> TRANSITION; - default -> throw new ParsingException("There is no season for key:" + key); + case "Wi", "Winter" -> WINTER; + case "Su", "Summer" -> SUMMER; + case "Tr", "Intermediate" -> TRANSITION; + default -> throw new ParsingException( + "There is no season for key:" + + key + + ". Permissible keys: 'Wi', 'Winter', 'Su', 'Summer', 'Tr', 'Intermediate'"); }; } From 8c4c8b6d4c71ee1944b80e09978a48b2bcca34ee Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 20 Sep 2024 13:40:34 +0200 Subject: [PATCH 127/310] Improving code. --- .../io/factory/timeseries/RandomLoadProfileFactory.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 3dace9bdb..d17e44c51 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -16,7 +16,10 @@ import java.util.Optional; import java.util.Set; import javax.measure.quantity.Power; + +import edu.ie3.util.quantities.PowerSystemUnits; import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; public class RandomLoadProfileFactory extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; @@ -82,11 +85,11 @@ public LoadProfile parseProfile(String profile) { @Override public Optional> calculateMaxPower( LoadProfile loadProfile, Set> loadProfileEntries) { - return Optional.empty(); + return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); } @Override public double getLoadProfileEnergyScaling() { - return 1d; + return 716.5416966513656; } } From d824816d8319a98f8a4f1908588b58dfa9ba2720 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:50:43 +0000 Subject: [PATCH 128/310] Bump com.couchbase.client:java-client from 3.7.2 to 3.7.3 (#1154) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 37db3ba83..dcc5dbdb6 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.2' + implementation 'com.couchbase.client:java-client:3.7.3' runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.17.0' // I/O functionalities From 4dd1c496d04f94079d2a41963c2a2b9fda087a5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 06:50:59 +0000 Subject: [PATCH 129/310] Bump com.github.spotbugs from 6.0.22 to 6.0.23 (#1155) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dcc5dbdb6..156f50fe0 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0' //code format - id 'com.github.spotbugs' version '6.0.22' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.23' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From e2d0741b4267d9ba2993b2a52f39966f6330d8d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 09:01:15 +0000 Subject: [PATCH 130/310] Bump net.bytebuddy:byte-buddy from 1.15.1 to 1.15.2 (#1157) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 156f50fe0..ef4b71ec9 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.1' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.2' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From a5e548c574187e9331f7cc84c3681da39b8f9ab2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 09:06:28 +0000 Subject: [PATCH 131/310] Bump org.junit.jupiter:junit-jupiter from 5.11.0 to 5.11.1 (#1156) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ef4b71ec9..7120d0159 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.1' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.15.2' // Mocks of classes From 072d7378f3b0a586277204b74f5e0c1e5a794ea1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 07:58:23 +0000 Subject: [PATCH 132/310] Bump net.bytebuddy:byte-buddy from 1.15.2 to 1.15.3 (#1158) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7120d0159..008be077e 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.1' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.2' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.3' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From d5dd47f82bba84804d5c9b2ef2f96cace3ddaaca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 06:59:42 +0000 Subject: [PATCH 133/310] Bump org.apache.logging.log4j:log4j-bom from 2.24.0 to 2.24.1 (#1159) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 008be077e..95a027a22 100644 --- a/build.gradle +++ b/build.gradle @@ -83,7 +83,7 @@ dependencies { testImplementation "org.testcontainers:couchbase:$testcontainersVersion" // logging - implementation platform('org.apache.logging.log4j:log4j-bom:2.24.0') + implementation platform('org.apache.logging.log4j:log4j-bom:2.24.1') implementation 'org.apache.logging.log4j:log4j-api' // log4j implementation 'org.apache.logging.log4j:log4j-core' // log4j implementation 'org.apache.logging.log4j:log4j-slf4j-impl' // log4j -> slf4j From 65d9d0907a211178b4af999ae147b8844d0871d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 08:17:29 +0000 Subject: [PATCH 134/310] Bump testcontainersVersion from 1.20.1 to 1.20.2 (#1160) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 95a027a22..17e25bc4b 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ ext { javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" groovyBinaryVersion = "4.0.23" - testcontainersVersion = '1.20.1' + testcontainersVersion = '1.20.2' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins } From 0c7737c4819e11fe27648e57ceabad28964bb1a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:33:17 +0000 Subject: [PATCH 135/310] Bump sphinx-rtd-theme from 2.0.0 to 3.0.0 in /docs/readthedocs (#1163) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index d3f0f997c..52aab5af8 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 Sphinx==7.4.7 -sphinx-rtd-theme==2.0.0 +sphinx-rtd-theme==3.0.0 myst-parser==4.0.0 markdown-it-py==3.0.0 From 588c616c5ea527e5d32d5c62638366c772d77b94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:39:09 +0000 Subject: [PATCH 136/310] Bump sphinx from 7.4.7 to 8.0.2 in /docs/readthedocs (#1126) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index 52aab5af8..0cdd09a64 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 -Sphinx==7.4.7 +Sphinx==8.0.2 sphinx-rtd-theme==3.0.0 myst-parser==4.0.0 markdown-it-py==3.0.0 From 8aff6e70aa08fd1ade51b6977ff0dcc79fa5503e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 07:43:05 +0000 Subject: [PATCH 137/310] Bump com.couchbase.client:java-client from 3.7.3 to 3.7.4 (#1164) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 17e25bc4b..794bb142e 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.3' + implementation 'com.couchbase.client:java-client:3.7.4' runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.17.0' // I/O functionalities From 3dd8f6a9a2e2264769f71ef137226ce878c6bf13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 08:48:34 +0000 Subject: [PATCH 138/310] Bump com.github.spotbugs from 6.0.23 to 6.0.24 (#1161) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 794bb142e..50d990d03 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0' //code format - id 'com.github.spotbugs' version '6.0.23' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.24' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From f4c3e71ec8b472d7d4fa45be2a548ed1ec5bdb1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:15:28 +0000 Subject: [PATCH 139/310] Bump org.junit.jupiter:junit-jupiter from 5.11.1 to 5.11.2 (#1162) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 50d990d03..5a32e005e 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.1' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.2' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.15.3' // Mocks of classes From 6988d84341a1d8e158731bcd1cd7d3518dc5fa3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 04:07:45 +0000 Subject: [PATCH 140/310] Bump sphinx-rtd-theme from 3.0.0 to 3.0.1 in /docs/readthedocs Bumps [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) from 3.0.0 to 3.0.1. - [Changelog](https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst) - [Commits](https://github.com/readthedocs/sphinx_rtd_theme/compare/3.0.0...3.0.1) --- updated-dependencies: - dependency-name: sphinx-rtd-theme dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index 0cdd09a64..bb851aa80 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 Sphinx==8.0.2 -sphinx-rtd-theme==3.0.0 +sphinx-rtd-theme==3.0.1 myst-parser==4.0.0 markdown-it-py==3.0.0 From 5f4639e2c658ea3f85d5279c3e46f9a6e2895c2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:52:40 +0000 Subject: [PATCH 141/310] Bump net.bytebuddy:byte-buddy from 1.15.3 to 1.15.4 (#1166) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5a32e005e..30b47dbbe 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.2' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.3' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.4' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From d41f606691841cf4a8d032742eff3cbbf8477c58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 08:43:07 +0000 Subject: [PATCH 142/310] Bump sphinx from 8.0.2 to 8.1.0 in /docs/readthedocs (#1167) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index bb851aa80..ff629b462 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 -Sphinx==8.0.2 +Sphinx==8.1.0 sphinx-rtd-theme==3.0.1 myst-parser==4.0.0 markdown-it-py==3.0.0 From b01804d97eb330cc9f60ce63fab212115d181ffb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 08:01:41 +0000 Subject: [PATCH 143/310] Bump sphinx from 8.1.0 to 8.1.3 in /docs/readthedocs (#1168) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index ff629b462..aedf2f3ce 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 -Sphinx==8.1.0 +Sphinx==8.1.3 sphinx-rtd-theme==3.0.1 myst-parser==4.0.0 markdown-it-py==3.0.0 From a1e137f6af900f2e8e079719ee9ed7938a05aa8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:39:52 +0000 Subject: [PATCH 144/310] Bump com.github.spotbugs from 6.0.24 to 6.0.25 (#1169) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 30b47dbbe..cd3bf89ac 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0' //code format - id 'com.github.spotbugs' version '6.0.24' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.25' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From 5f6740667600fabe94159f039fe460471f65c5d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 07:33:40 +0000 Subject: [PATCH 145/310] Bump net.bytebuddy:byte-buddy from 1.15.4 to 1.15.5 (#1170) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index cd3bf89ac..d05fdba13 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.2' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.4' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.5' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From 49898d02b8dcc3234c6b4c6979a75d8fcdb21ea6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:07:43 +0000 Subject: [PATCH 146/310] Bump org.junit.jupiter:junit-jupiter from 5.11.2 to 5.11.3 (#1171) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d05fdba13..b64f034e6 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.3' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.15.5' // Mocks of classes From 7e16c9806749239aba59b0c28fdbaeaaff37a590 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 06:54:08 +0000 Subject: [PATCH 147/310] Bump testcontainersVersion from 1.20.2 to 1.20.3 (#1172) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b64f034e6..e62891fa9 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ ext { javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" groovyBinaryVersion = "4.0.23" - testcontainersVersion = '1.20.2' + testcontainersVersion = '1.20.3' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins } From e962a0de4111324119013df330349ad7bb8e19d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 05:41:38 +0000 Subject: [PATCH 148/310] Bump net.bytebuddy:byte-buddy from 1.15.5 to 1.15.7 (#1173) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e62891fa9..a03381725 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.3' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.5' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.7' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From 07eed44031f1ed60cc08e4ed3e77a30a114c64fd Mon Sep 17 00:00:00 2001 From: Johannes Bao Date: Tue, 29 Oct 2024 13:48:07 +0100 Subject: [PATCH 149/310] simplify persist joint grid --- .../edu/ie3/datamodel/io/sink/SqlSink.java | 78 +------------------ 1 file changed, 1 insertion(+), 77 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 06e4c646c..907322b1f 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -20,10 +20,7 @@ import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.input.*; import edu.ie3.datamodel.models.input.connector.*; -import edu.ie3.datamodel.models.input.container.GraphicElements; import edu.ie3.datamodel.models.input.container.JointGridContainer; -import edu.ie3.datamodel.models.input.container.RawGridElements; -import edu.ie3.datamodel.models.input.container.SystemParticipants; import edu.ie3.datamodel.models.input.graphics.GraphicInput; import edu.ie3.datamodel.models.input.system.*; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; @@ -280,80 +277,7 @@ private void executeQueryToPersist(String query) { /** Persists a whole {@link JointGridContainer}. */ public void persistJointGrid(JointGridContainer jointGridContainer, UUID gridUUID) { DbGridMetadata identifier = new DbGridMetadata(jointGridContainer.getGridName(), gridUUID); - - // get raw grid entities with types or operators - RawGridElements rawGridElements = jointGridContainer.getRawGrid(); - Set nodes = rawGridElements.getNodes(); - Set lines = rawGridElements.getLines(); - Set transformer2Ws = rawGridElements.getTransformer2Ws(); - Set transformer3Ws = rawGridElements.getTransformer3Ws(); - Set switches = rawGridElements.getSwitches(); - Set measurementUnits = rawGridElements.getMeasurementUnits(); - - // get system participants with types or operators - SystemParticipants systemParticipants = jointGridContainer.getSystemParticipants(); - Set bmPlants = systemParticipants.getBmPlants(); - Set chpPlants = systemParticipants.getChpPlants(); - Set evCS = systemParticipants.getEvcs(); - Set evs = systemParticipants.getEvs(); - Set fixedFeedIns = systemParticipants.getFixedFeedIns(); - Set heatPumps = systemParticipants.getHeatPumps(); - Set loads = systemParticipants.getLoads(); - Set pvPlants = systemParticipants.getPvPlants(); - Set storages = systemParticipants.getStorages(); - Set wecPlants = systemParticipants.getWecPlants(); - - // get graphic elements (just for better readability, we could also just get them directly - // below) - GraphicElements graphicElements = jointGridContainer.getGraphics(); - - // extract types - Set types = - Stream.of( - lines, - transformer2Ws, - transformer3Ws, - bmPlants, - chpPlants, - evs, - heatPumps, - storages, - wecPlants) - .flatMap(Collection::stream) - .map(Extractor::extractType) - .collect(Collectors.toSet()); - - // extract operators - Set operators = - Stream.of( - nodes, - lines, - transformer2Ws, - transformer3Ws, - switches, - measurementUnits, - bmPlants, - chpPlants, - evCS, - evs, - fixedFeedIns, - heatPumps, - loads, - pvPlants, - storages, - wecPlants) - .flatMap(Collection::stream) - .map(Extractor::extractOperator) - .flatMap(Optional::stream) - .collect(Collectors.toSet()); - - List toAdd = new LinkedList<>(); - toAdd.addAll(rawGridElements.allEntitiesAsList()); - toAdd.addAll(systemParticipants.allEntitiesAsList()); - toAdd.addAll(graphicElements.allEntitiesAsList()); - toAdd.addAll(types); - toAdd.addAll(operators); - + List toAdd = new LinkedList<>(jointGridContainer.allEntitiesAsList()); persistAll(toAdd, identifier); } From a817f4ce395a504f862fb42eaee0b19ad3b4b3dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:44:40 +0000 Subject: [PATCH 150/310] Bump net.bytebuddy:byte-buddy from 1.15.7 to 1.15.10 (#1174) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a03381725..4725abe32 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.3' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.7' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.15.10' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From d1fcf67d94769ecc2ac484ca18fbe847846e5f9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 08:51:27 +0000 Subject: [PATCH 151/310] Bump com.github.spotbugs from 6.0.25 to 6.0.26 (#1175) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4725abe32..67450b2fa 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '6.25.0' //code format - id 'com.github.spotbugs' version '6.0.25' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.26' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From 7e79c9bb7897a263c95a0066d984633aebaddffc Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 5 Nov 2024 12:55:10 +0100 Subject: [PATCH 152/310] Sonar - change the visibility of constructor to protected --- .../models/result/thermal/AbstractThermalStorageResult.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java index a64d72b07..293ab29bf 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/AbstractThermalStorageResult.java @@ -28,7 +28,7 @@ public abstract class AbstractThermalStorageResult extends ThermalStorageResult * @param qDot Heat power flowing into (> 0) or coming from (< 0) the storage * @param fillLevel Fill level of the storage */ - public AbstractThermalStorageResult( + protected AbstractThermalStorageResult( ZonedDateTime time, UUID inputModel, ComparableQuantity energy, From 890322f320afe0d5edc5869dc6e2a5b820d0bc13 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 5 Nov 2024 13:00:11 +0100 Subject: [PATCH 153/310] Sonar - add override annotations --- .../models/input/thermal/DomesticHotWaterStorageInput.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 29d880770..35c827b3f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -116,29 +116,34 @@ public DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput enti super(entity); } + @Override public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl( ComparableQuantity storageVolumeLvl) { this.storageVolumeLvl = storageVolumeLvl; return this; } + @Override public DomesticHotWaterStorageInputCopyBuilder inletTemp( ComparableQuantity inletTemp) { this.inletTemp = inletTemp; return this; } + @Override public DomesticHotWaterStorageInputCopyBuilder returnTemp( ComparableQuantity returnTemp) { this.returnTemp = returnTemp; return this; } + @Override public DomesticHotWaterStorageInputCopyBuilder c(ComparableQuantity c) { this.c = c; return this; } + @Override public DomesticHotWaterStorageInputCopyBuilder pThermalMax( ComparableQuantity pThermalMax) { this.pThermalMax = pThermalMax; From 61e7ca34c8809be0f2bb61286b579372684419ab Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 5 Nov 2024 15:19:12 +0100 Subject: [PATCH 154/310] Small improvements. --- .../datamodel/io/connectors/SqlConnector.java | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 37b27c3ee..4ae00937d 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -68,12 +68,12 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException */ public int executeUpdate(String query) throws SQLException { try (Statement statement = getConnection().createStatement()) { - int res = statement.executeUpdate(query); - getConnection().commit(); - return res; + int res = statement.executeUpdate(query); + getConnection().commit(); + return res; } catch (SQLException e) { - throw new SQLException( - String.format("Error at execution of query, SQLReason: '%s'", e.getMessage()), e); + throw new SQLException( + String.format("Error at execution of query, SQLReason: '%s'", e.getMessage()), e); } } @@ -162,13 +162,25 @@ public boolean hasNext() { return rs.next(); } catch (SQLException e) { log.error("Exception at extracting next ResultSet: ", e); + + try { + rs.close(); + } catch (SQLException ex) { + throw new RuntimeException(ex); + } + return false; } } @Override public Map next() { - return extractFieldMap(rs); + try { + return extractFieldMap(rs); + } catch (SQLException e) { + log.error("Exception at extracting ResultSet: ", e); + return Collections.emptyMap(); + } } }; } @@ -179,26 +191,24 @@ public Map next() { * @param rs the ResultSet to use * @return the field map for the current row */ - public Map extractFieldMap(ResultSet rs) { + public Map extractFieldMap(ResultSet rs) throws SQLException { TreeMap insensitiveFieldsToAttributes = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - try { - ResultSetMetaData metaData = rs.getMetaData(); - int columnCount = metaData.getColumnCount(); - for (int i = 1; i <= columnCount; i++) { - String columnName = StringUtils.snakeCaseToCamelCase(metaData.getColumnName(i)); - String value; - Object result = rs.getObject(i); - if (result instanceof Timestamp) { - value = TimeUtil.withDefaults.toString(rs.getTimestamp(i).toInstant()); - } else { - value = String.valueOf(rs.getObject(i)); - } - insensitiveFieldsToAttributes.put(columnName, value); + + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + for (int i = 1; i <= columnCount; i++) { + String columnName = StringUtils.snakeCaseToCamelCase(metaData.getColumnName(i)); + String value; + Object result = rs.getObject(i); + if (result instanceof Timestamp) { + value = TimeUtil.withDefaults.toString(rs.getTimestamp(i).toInstant()); + } else { + value = String.valueOf(rs.getObject(i)); } - } catch (SQLException e) { - log.error("Exception at extracting ResultSet: ", e); + insensitiveFieldsToAttributes.put(columnName, value); } + return insensitiveFieldsToAttributes; } } From 357de537af474f1e43859b82110f82cd20af4b05 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 6 Nov 2024 09:24:14 +0100 Subject: [PATCH 155/310] Fixing failing sql test. --- .../datamodel/io/connectors/SqlConnector.java | 3 ++ .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 28 ++----------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 4ae00937d..5ad343d8a 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -68,6 +68,9 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException */ public int executeUpdate(String query) throws SQLException { try (Statement statement = getConnection().createStatement()) { + // updates the database with previous commits, necessary if previously an error occurred + getConnection().commit(); + int res = statement.executeUpdate(query); getConnection().commit(); return res; diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 9e45cf059..06d52d87a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -13,46 +13,23 @@ import edu.ie3.datamodel.io.DbGridMetadata import edu.ie3.datamodel.io.connectors.SqlConnector import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy import edu.ie3.datamodel.io.processor.ProcessorProvider -import edu.ie3.datamodel.io.processor.input.InputEntityProcessor -import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.io.source.sql.SqlDataSource import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.connector.LineInput -import edu.ie3.datamodel.models.input.connector.Transformer2WInput -import edu.ie3.datamodel.models.input.connector.type.LineTypeInput -import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput -import edu.ie3.datamodel.models.input.graphics.LineGraphicInput -import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.EvcsInput -import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput import edu.ie3.datamodel.models.input.system.characteristic.CosPhiFixed -import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput -import edu.ie3.datamodel.models.result.system.EmResult -import edu.ie3.datamodel.models.result.system.EvResult -import edu.ie3.datamodel.models.result.system.EvcsResult -import edu.ie3.datamodel.models.result.system.FlexOptionsResult -import edu.ie3.datamodel.models.result.system.PvResult -import edu.ie3.datamodel.models.result.system.WecResult +import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.Value -import edu.ie3.test.common.GridTestData -import edu.ie3.test.common.SampleJointGrid -import edu.ie3.test.common.SystemParticipantTestData -import edu.ie3.test.common.ThermalUnitInputTestData -import edu.ie3.test.common.TimeSeriesTestData +import edu.ie3.test.common.* import edu.ie3.test.helper.TestContainerHelper import edu.ie3.util.TimeUtil import org.testcontainers.containers.Container @@ -63,7 +40,6 @@ import spock.lang.Shared import spock.lang.Specification import tech.units.indriya.quantity.Quantities -import java.sql.SQLException import javax.measure.Quantity import javax.measure.quantity.Power From 19372799f1148f58630b8727c69c5da2bad721d5 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 6 Nov 2024 10:31:28 +0100 Subject: [PATCH 156/310] Adding missing import in `SqlSinkTest`. --- src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 06d52d87a..67e5065e4 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -40,6 +40,7 @@ import spock.lang.Shared import spock.lang.Specification import tech.units.indriya.quantity.Quantities +import java.sql.SQLException import javax.measure.Quantity import javax.measure.quantity.Power From 0595b723b7c3d7931db005dd9a138ee869656b05 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 6 Nov 2024 14:37:14 +0100 Subject: [PATCH 157/310] Small improvements. --- .../ie3/datamodel/io/connectors/SqlConnector.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 5ad343d8a..9d6e4150d 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -57,6 +57,9 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException return stmt.executeQuery(query); } catch (SQLException e) { throw new SQLException(String.format("Error at execution of query \"%1.127s\": ", query), e); + } finally { + // commits any changes made and unlocks database + getConnection().commit(); } } @@ -68,15 +71,13 @@ public ResultSet executeQuery(Statement stmt, String query) throws SQLException */ public int executeUpdate(String query) throws SQLException { try (Statement statement = getConnection().createStatement()) { - // updates the database with previous commits, necessary if previously an error occurred - getConnection().commit(); - - int res = statement.executeUpdate(query); - getConnection().commit(); - return res; + return statement.executeUpdate(query); } catch (SQLException e) { throw new SQLException( String.format("Error at execution of query, SQLReason: '%s'", e.getMessage()), e); + } finally { + // commits any changes made and unlocks database + getConnection().commit(); } } From 450a3835fa288454d942cf5f7ffa4c5582769423 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 08:51:51 +0000 Subject: [PATCH 158/310] Bump com.couchbase.client:java-client from 3.7.4 to 3.7.5 (#1176) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 67450b2fa..46e9f8be1 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.4' + implementation 'com.couchbase.client:java-client:3.7.5' runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.17.0' // I/O functionalities From e472dde0b952eaf3a5d76ba4f31c21e3af245b69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 08:38:48 +0000 Subject: [PATCH 159/310] Bump org.apache.groovy:groovy from 4.0.23 to 4.0.24 (#1177) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 46e9f8be1..5435625cf 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ ext { //version (changing these should be considered thoroughly!) javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" - groovyBinaryVersion = "4.0.23" + groovyBinaryVersion = "4.0.24" testcontainersVersion = '1.20.3' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins From 3779c1f39270d90a90875367e4dc500bf1b5f163 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 8 Nov 2024 13:21:11 +0100 Subject: [PATCH 160/310] Removing uuid for load profile time series. --- .../io/csv/CsvLoadProfileMetaInformation.java | 7 +-- .../timeseries/RandomLoadProfileFactory.java | 3 +- .../TimeSeriesMetaInformationFactory.java | 6 +- .../io/naming/DatabaseNamingStrategy.java | 17 +++--- .../EntityPersistenceNamingStrategy.java | 7 +-- .../LoadProfileTimeSeriesMetaInformation.java | 5 ++ .../edu/ie3/datamodel/io/sink/SqlSink.java | 59 ++++++++++++++----- .../ie3/datamodel/io/source/EntitySource.java | 1 - .../io/source/LoadProfileSource.java | 7 ++- .../io/source/csv/CsvDataSource.java | 8 ++- .../CsvTimeSeriesMetaInformationSource.java | 2 +- .../io/source/sql/SqlLoadProfileSource.java | 11 +--- .../SqlTimeSeriesMetaInformationSource.java | 6 +- ...479c-8a40-1323bb9150a9.csv => lpts_g0.csv} | 0 ...4a14-b627-71a43fea1d20.csv => lpts_g1.csv} | 0 ...4c9b-b818-4079cebf59cc.csv => lpts_g2.csv} | 0 ...43c1-a3f4-26dd26266216.csv => lpts_g3.csv} | 0 ...4f7d-a888-0a9502abd763.csv => lpts_g4.csv} | 0 ...4f14-8330-b2eea9414101.csv => lpts_g5.csv} | 0 ...4950-a579-e02b31fa9d1a.csv => lpts_g6.csv} | 0 ...4310-8f21-298e6af8b245.csv => lpts_h0.csv} | 0 ...4949-87e4-3611cf485a82.csv => lpts_l0.csv} | 0 ...49af-961b-b0daf04fdeee.csv => lpts_l1.csv} | 0 ...4647-96db-086f463d0e0d.csv => lpts_l2.csv} | 0 ...-869f-d22c4e9e07cb.csv => lpts_random.csv} | 0 ...EntityPersistenceNamingStrategyTest.groovy | 11 ++-- .../io/naming/FileNamingStrategyTest.groovy | 20 +++---- .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 3 +- .../io/source/csv/CsvDataSourceTest.groovy | 26 +++----- .../source/sql/SqlLoadProfileSourceIT.groovy | 2 +- ...qlTimeSeriesMetaInformationSourceIT.groovy | 15 ++--- .../datamodel/io/sink/_sql/load_profile.sql | 11 ---- .../datamodel/io/sink/_sql/load_profiles.sql | 24 ++++++++ .../io/source/csv/_timeseries/lpts_g2.csv | 3 + .../source/sql/_timeseries/load_profiles.sql | 35 +++++++++++ .../_timeseries/time_series_load_profiles.sql | 36 ----------- 37 files changed, 173 insertions(+), 154 deletions(-) rename src/main/resources/load/{lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv => lpts_g0.csv} (100%) rename src/main/resources/load/{lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv => lpts_g1.csv} (100%) rename src/main/resources/load/{lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv => lpts_g2.csv} (100%) rename src/main/resources/load/{lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv => lpts_g3.csv} (100%) rename src/main/resources/load/{lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv => lpts_g4.csv} (100%) rename src/main/resources/load/{lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv => lpts_g5.csv} (100%) rename src/main/resources/load/{lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv => lpts_g6.csv} (100%) rename src/main/resources/load/{lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv => lpts_h0.csv} (100%) rename src/main/resources/load/{lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv => lpts_l0.csv} (100%) rename src/main/resources/load/{lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv => lpts_l1.csv} (100%) rename src/main/resources/load/{lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv => lpts_l2.csv} (100%) rename src/main/resources/load/{lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv => lpts_random.csv} (100%) delete mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql delete mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java index 8db0ef7fe..a7ccd4f8c 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java @@ -8,19 +8,18 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import java.nio.file.Path; import java.util.Objects; -import java.util.UUID; public class CsvLoadProfileMetaInformation extends LoadProfileTimeSeriesMetaInformation { private final Path fullFilePath; - public CsvLoadProfileMetaInformation(UUID uuid, String profile, Path fullFilePath) { - super(uuid, profile); + public CsvLoadProfileMetaInformation(String profile, Path fullFilePath) { + super(profile); this.fullFilePath = fullFilePath; } public CsvLoadProfileMetaInformation( LoadProfileTimeSeriesMetaInformation metaInformation, Path fullFilePath) { - this(metaInformation.getUuid(), metaInformation.getProfile(), fullFilePath); + this(metaInformation.getProfile(), fullFilePath); } public Path getFullFilePath() { diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index d17e44c51..d6555509a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -12,12 +12,11 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.RandomLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.List; import java.util.Optional; import java.util.Set; import javax.measure.quantity.Power; - -import edu.ie3.util.quantities.PowerSystemUnits; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index aebbfa02e..820f3f48a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -40,12 +40,12 @@ protected List> getFields(Class entityClass) { @Override protected TimeSeriesMetaInformation buildModel(EntityData data) { - UUID timeSeries = data.getUUID(TIME_SERIES); - if (LoadProfileTimeSeriesMetaInformation.class.isAssignableFrom(data.getTargetClass())) { String profile = data.getField(LOAD_PROFILE); - return new LoadProfileTimeSeriesMetaInformation(timeSeries, profile); + return new LoadProfileTimeSeriesMetaInformation(profile); } else { + UUID timeSeries = data.getUUID(TIME_SERIES); + ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index b3b35172b..ebcc1fdf6 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -12,7 +12,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; import java.util.Optional; @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy { private static final String TIME_SERIES_PREFIX = "time_series_"; - private static final String LOAD_PROFILE_PREFIX = "load_profile_"; + private static final String LOAD_PROFILE_PREFIX = "load_profiles"; private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; @@ -53,13 +53,12 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { } /** - * Provides the name of a load profile given by the load profile key + * Provides the name of the load profile table. * - * @param lpKey Load profile key * @return the table name */ - private String getLoadProfileEntityName(String lpKey) { - return LOAD_PROFILE_PREFIX + lpKey; + public String getLoadProfileEntityName() { + return LOAD_PROFILE_PREFIX; } /** @@ -78,7 +77,7 @@ public Optional getEntityName(Class cls) { * @param timeSeries to be named TimeSeries * @return the table name */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) { Optional maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst(); @@ -89,8 +88,8 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { - return Optional.of(getLoadProfileEntityName(loadProfileInput.getType().getKey())); + } else if (timeSeries instanceof LoadProfileTimeSeries) { + return Optional.of(getLoadProfileEntityName()); } else { logger.error("There is no naming strategy defined for {}", timeSeries); return Optional.empty(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index e328041b3..c6a0b89ab 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy { * profile is accessible via the named capturing group "profile", the uuid by the group "uuid" */ private static final String LOAD_PROFILE_TIME_SERIES = - "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?" + UUID_STRING + ")"; + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})"; /** * Pattern to identify load profile time series in this instance of the naming strategy (takes @@ -163,8 +163,7 @@ public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformatio throw new IllegalArgumentException( "Cannot extract meta information on load profile time series from '" + fileName + "'."); - return new LoadProfileTimeSeriesMetaInformation( - UUID.fromString(matcher.group("uuid")), matcher.group("profile")); + return new LoadProfileTimeSeriesMetaInformation(matcher.group("profile")); } /** @@ -374,8 +373,6 @@ Optional getEntityName(T timeSeries) { .concat("lpts") .concat("_") .concat(loadProfileTimeSeries.getLoadProfile().getKey()) - .concat("_") - .concat(loadProfileTimeSeries.getUuid().toString()) .concat(suffix)); } else { logger.error("There is no naming strategy defined for {}", timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java index d1e319668..72a3df4cf 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -13,6 +13,11 @@ public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation { private final String profile; + public LoadProfileTimeSeriesMetaInformation(String profile) { + super(UUID.randomUUID()); + this.profile = profile; + } + public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { super(uuid); this.profile = profile; diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 907322b1f..35cdf3b9e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -5,10 +5,12 @@ */ package edu.ie3.datamodel.io.sink; -import static edu.ie3.datamodel.io.SqlUtils.*; +import static edu.ie3.datamodel.io.SqlUtils.quote; import static java.util.stream.Collectors.groupingBy; -import edu.ie3.datamodel.exceptions.*; +import edu.ie3.datamodel.exceptions.EntityProcessorException; +import edu.ie3.datamodel.exceptions.ExtractorException; +import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.DbGridMetadata; import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.extractor.Extractor; @@ -18,17 +20,22 @@ import edu.ie3.datamodel.io.processor.ProcessorProvider; import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.input.*; -import edu.ie3.datamodel.models.input.connector.*; +import edu.ie3.datamodel.models.input.AssetTypeInput; +import edu.ie3.datamodel.models.input.InputEntity; +import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.connector.ConnectorInput; import edu.ie3.datamodel.models.input.container.JointGridContainer; import edu.ie3.datamodel.models.input.graphics.GraphicInput; -import edu.ie3.datamodel.models.input.system.*; +import edu.ie3.datamodel.models.input.system.SystemParticipantInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput; import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.utils.TriFunction; import edu.ie3.util.StringUtils; import java.sql.SQLException; import java.util.*; @@ -47,6 +54,7 @@ public class SqlSink { private final String schemaName; private static final String TIME_SERIES = "time_series"; + private static final String LOAD_PROFILE = "load_profile"; public SqlSink( String schemaName, DatabaseNamingStrategy databaseNamingStrategy, SqlConnector connector) @@ -109,12 +117,12 @@ public void persistAll(Collection entities, DbGridMetadata } /** - * Persist an entity. By default this method takes care of the extraction process of nested + * Persist an entity. By default, this method takes care of the extraction process of nested * entities (if any) * * @param entity the entity that should be persisted * @param identifier identifier of the grid - * @throws SQLException + * @throws SQLException if an error occurred */ public void persist(C entity, DbGridMetadata identifier) throws SQLException { if (entity instanceof InputEntity inputEntity) { @@ -178,7 +186,7 @@ private void persistMixedList(List entities, DbGridMetadat * Persist a list of entities with same types. To minimize the number of queries, the entities * will be grouped by their class. */ - private , V extends Value> void persistList( + private , V extends Value> void persistList( List entities, Class cls, DbGridMetadata identifier) throws SQLException { // Check if there are only elements of the same class Class firstClass = entities.get(0).getClass(); @@ -222,7 +230,7 @@ private void insertListIgnoreNested( } /** Persist one time series. */ - protected , V extends Value> void persistTimeSeries( + protected , V extends Value> void persistTimeSeries( TimeSeries timeSeries, DbGridMetadata identifier) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -234,17 +242,30 @@ protected , V extends Value> void persistTimeSeries } } - private , V extends Value> void persistTimeSeries( + private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { try { + + TriFunction queryBuilder; + String timeSeriesIdentifier; + + if (timeSeries instanceof LoadProfileTimeSeries lpts) { + timeSeriesIdentifier = lpts.getLoadProfile().getKey(); + queryBuilder = this::basicInsertQueryValuesLPTS; + } else { + timeSeriesIdentifier = timeSeries.getUuid().toString(); + queryBuilder = this::basicInsertQueryValuesITS; + } + String query = - basicInsertQueryValuesITS( + queryBuilder.apply( schemaName, databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), headerElements); Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); + query = query + entityFieldData.stream() @@ -254,7 +275,7 @@ private , V extends Value> void persistTimeSeries( sqlEntityFieldData(data), headerElements, identifier, - timeSeries.getUuid().toString())) + timeSeriesIdentifier)) .collect(Collectors.joining(",\n", "", ";")); executeQueryToPersist(query); } catch (ProcessorProviderException e) { @@ -352,13 +373,13 @@ private String queryTimeSeriesValueLine( Map entityFieldData, String[] headerElements, DbGridMetadata identifier, - String tsUuid) { + String timeSeriesIdentifier) { return writeOneLine( Stream.concat( Stream.concat( Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), - Stream.of(quote(tsUuid, "'")))); + Stream.of(quote(timeSeriesIdentifier, "'")))); } private LinkedHashMap sqlEntityFieldData( @@ -397,6 +418,16 @@ private String basicInsertQueryValuesITS( + "\nVALUES\n"; } + /** Provides the insert, column names, grid identifier, and the VALUES statement for a query. */ + private String basicInsertQueryValuesLPTS( + String schemaName, String tableName, String[] headerElements) { + String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN, LOAD_PROFILE}; + return basicInsertQuery(schemaName, tableName) + + " " + + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + + "\nVALUES\n"; + } + /** Converts a stream of strings into an one line string with brackets. */ private String writeOneLine(Stream entries) { return "(" + entries.collect(Collectors.joining(",")) + ")"; diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 2d752cc74..be0cdea31 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -129,7 +129,6 @@ protected static CsvDataSource getBuildInSource(Class clazz, String subdirect case "file" -> connector = new CsvFileConnector(Path.of(uri)); case "jar" -> { // handling resources in jar - String[] array = uri.toString().split("!"); if (jarFileSystem == null) { diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index baac992e9..c232e2252 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -98,7 +98,10 @@ public static Map getBDEWLoa BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); - return buildInSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()).stream() + return buildInSource + .getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.values()) + .values() + .stream() .map( metaInformation -> (BdewLoadProfileTimeSeries) @@ -117,7 +120,7 @@ public static RandomLoadProfileTimeSeries getRandomLoadProfile() throws SourceEx CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); CsvLoadProfileMetaInformation metaInformation = - buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).stream() + buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).values().stream() .findAny() .orElseThrow(); return (RandomLoadProfileTimeSeries) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index c15e308cb..da8700287 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -136,9 +136,9 @@ public FileNamingStrategy getNamingStrategy() { * Receive the information for specific load profile time series. They are given back mapped to * their uuid. * - * @return A mapping from uuid to the load profile time series meta information + * @return A mapping from profile to the load profile time series meta information */ - public Set getCsvLoadProfileMetaInformation( + public Map getCsvLoadProfileMetaInformation( LoadProfile... profiles) { return getTimeSeriesFilePaths(fileNamingStrategy.getLoadProfileTimeSeriesPattern()) .parallelStream() @@ -156,7 +156,9 @@ public Set getCsvLoadProfileMetaInformation( || profiles.length == 0 || Stream.of(profiles) .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) - .collect(Collectors.toSet()); + .collect( + Collectors.toMap( + LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index a3c828903..edd307727 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -59,7 +59,7 @@ public CsvTimeSeriesMetaInformationSource(CsvDataSource dataSource) { TimeSeriesUtils.getAcceptedColumnSchemes().toArray(new ColumnScheme[0])); this.loadProfileMetaInformation = - dataSource.getCsvLoadProfileMetaInformation().stream() + dataSource.getCsvLoadProfileMetaInformation().values().stream() .collect( Collectors.toMap( LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 1ab5de5a9..cadb87e75 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -49,7 +49,6 @@ public class SqlLoadProfileSource

    // General fields private static final String WHERE = " WHERE "; - private static final String TIME_SERIES = "time_series"; private static final String LOAD_PROFILE = "load_profile"; /** @@ -68,7 +67,7 @@ public SqlLoadProfileSource( super(entryClass, entryFactory); this.dataSource = dataSource; - this.tableName = dataSource.databaseNamingStrategy.getLoadProfileTimeSeriesEntityName(); + this.tableName = "load_profiles"; this.metaInformation = metaInformation; this.loadProfile = entryFactory.parseProfile(metaInformation.getProfile()); @@ -165,10 +164,6 @@ private Optional> createEntity(Map fieldToVa private String createQueryFull(String schemaName, String tableName) { return createBaseQueryString(schemaName, tableName) + WHERE - + TIME_SERIES - + " = '" - + metaInformation.getUuid().toString() - + "' AND " + LOAD_PROFILE + " = '" + loadProfile.getKey() @@ -188,10 +183,6 @@ private String createQueryFull(String schemaName, String tableName) { private String createQueryForTime(String schemaName, String tableName, String timeColumnName) { return createBaseQueryString(schemaName, tableName) + WHERE - + TIME_SERIES - + " = '" - + metaInformation.getUuid().toString() - + "' AND " + LOAD_PROFILE + " = '" + loadProfile.getKey() diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index a3d9a6567..97ea31888 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -100,11 +100,7 @@ private String createQueryComplete(String schemaName) { * @return query String */ private String createLoadProfileQueryComplete(String schemaName) { - return "SELECT DISTINCT load_profile, time_series FROM " - + schemaName - + "." - + namingStrategy.getLoadProfileTimeSeriesEntityName() - + ";"; + return "SELECT DISTINCT load_profile FROM " + schemaName + ".load_profiles;"; } @Override diff --git a/src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv b/src/main/resources/load/lpts_g0.csv similarity index 100% rename from src/main/resources/load/lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv rename to src/main/resources/load/lpts_g0.csv diff --git a/src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv b/src/main/resources/load/lpts_g1.csv similarity index 100% rename from src/main/resources/load/lpts_g1_177ebd2f-7174-4a14-b627-71a43fea1d20.csv rename to src/main/resources/load/lpts_g1.csv diff --git a/src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv b/src/main/resources/load/lpts_g2.csv similarity index 100% rename from src/main/resources/load/lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv rename to src/main/resources/load/lpts_g2.csv diff --git a/src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv b/src/main/resources/load/lpts_g3.csv similarity index 100% rename from src/main/resources/load/lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216.csv rename to src/main/resources/load/lpts_g3.csv diff --git a/src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv b/src/main/resources/load/lpts_g4.csv similarity index 100% rename from src/main/resources/load/lpts_g4_b7682f84-d317-4f7d-a888-0a9502abd763.csv rename to src/main/resources/load/lpts_g4.csv diff --git a/src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv b/src/main/resources/load/lpts_g5.csv similarity index 100% rename from src/main/resources/load/lpts_g5_ec51ae43-3849-4f14-8330-b2eea9414101.csv rename to src/main/resources/load/lpts_g5.csv diff --git a/src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv b/src/main/resources/load/lpts_g6.csv similarity index 100% rename from src/main/resources/load/lpts_g6_d0606284-5f9e-4950-a579-e02b31fa9d1a.csv rename to src/main/resources/load/lpts_g6.csv diff --git a/src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv b/src/main/resources/load/lpts_h0.csv similarity index 100% rename from src/main/resources/load/lpts_h0_de021c4d-bb57-4310-8f21-298e6af8b245.csv rename to src/main/resources/load/lpts_h0.csv diff --git a/src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv b/src/main/resources/load/lpts_l0.csv similarity index 100% rename from src/main/resources/load/lpts_l0_42f31f05-8c3b-4949-87e4-3611cf485a82.csv rename to src/main/resources/load/lpts_l0.csv diff --git a/src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv b/src/main/resources/load/lpts_l1.csv similarity index 100% rename from src/main/resources/load/lpts_l1_aa65260e-efd5-49af-961b-b0daf04fdeee.csv rename to src/main/resources/load/lpts_l1.csv diff --git a/src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv b/src/main/resources/load/lpts_l2.csv similarity index 100% rename from src/main/resources/load/lpts_l2_9029deec-5f70-4647-96db-086f463d0e0d.csv rename to src/main/resources/load/lpts_l2.csv diff --git a/src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv b/src/main/resources/load/lpts_random.csv similarity index 100% rename from src/main/resources/load/lpts_random_34e34adb-a54a-4669-869f-d22c4e9e07cb.csv rename to src/main/resources/load/lpts_random.csv diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 897873d76..06765fdc1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -80,7 +80,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "The pattern for a repetitive load profile time series file name actually matches a valid file name and extracts the correct groups"() { given: def ens = new EntityPersistenceNamingStrategy() - def validFileName = "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" + def validFileName = "lpts_g3" when: def matcher = ens.loadProfileTimeSeriesPattern.matcher(validFileName) @@ -89,11 +89,9 @@ class EntityPersistenceNamingStrategyTest extends Specification { matcher.matches() then: "it also has correct capturing groups" - matcher.groupCount() == 2 + matcher.groupCount() == 1 matcher.group(1) == "g3" - matcher.group(2) == "bee0a8b6-4788-4f18-bf72-be52035f7304" matcher.group("profile") == "g3" - matcher.group("uuid") == "bee0a8b6-4788-4f18-bf72-be52035f7304" } def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() { @@ -415,7 +413,6 @@ class EntityPersistenceNamingStrategyTest extends Specification { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() BdewLoadProfileTimeSeries timeSeries = Mock(BdewLoadProfileTimeSeries) - timeSeries.uuid >> uuid timeSeries.loadProfile >> type when: @@ -426,8 +423,8 @@ class EntityPersistenceNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - BdewLoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216" + clazz | type || expectedFileName + BdewLoadProfileTimeSeries | BdewStandardLoadProfile.G3 || "lpts_g3" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index 4902b03e5..353fa3f8d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -399,7 +399,6 @@ class FileNamingStrategyTest extends Specification { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) def timeSeries = Mock(LoadProfileTimeSeries) - timeSeries.uuid >> uuid timeSeries.loadProfile >> type when: @@ -410,8 +409,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") + clazz | type || expectedFileName + LoadProfileTimeSeries | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3") } def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for time series mapping"() { @@ -706,7 +705,6 @@ class FileNamingStrategyTest extends Specification { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) def timeSeries = Mock(LoadProfileTimeSeries) - timeSeries.uuid >> uuid timeSeries.loadProfile >> type when: @@ -717,8 +715,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFilePath where: - clazz | uuid | type || expectedFilePath - LoadProfileTimeSeries | UUID.fromString("9b880468-309c-43c1-a3f4-26dd26266216") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_9b880468-309c-43c1-a3f4-26dd26266216") + clazz | type || expectedFilePath + LoadProfileTimeSeries | BdewStandardLoadProfile.G3 || Path.of("lpts_g3") } def "A FileNamingStrategy with FlatHierarchy does return valid file path for individual time series"() { @@ -764,7 +762,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})" } def "A FileNamingStrategy with FlatHierarchy returns correct individual time series file name pattern"() { @@ -786,7 +784,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})" } def "Trying to extract time series meta information throws an Exception, if it is provided a malformed string"() { @@ -908,7 +906,7 @@ class FileNamingStrategyTest extends Specification { def "The FileNamingStrategy extracts correct meta information from a valid load profile time series file name"() { given: def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def path = Path.of("/bla/foo/lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304.csv") + def path = Path.of("/bla/foo/lpts_g3.csv") when: def metaInformation = fns.timeSeriesMetaInformation(path) @@ -916,7 +914,6 @@ class FileNamingStrategyTest extends Specification { then: LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) (metaInformation as LoadProfileTimeSeriesMetaInformation).with { - assert uuid == UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") assert profile == "g3" } } @@ -924,7 +921,7 @@ class FileNamingStrategyTest extends Specification { def "The FileNamingStrategy extracts correct meta information from a valid load profile time series file name with pre- and suffix"() { given: def fns = new FileNamingStrategy(new EntityPersistenceNamingStrategy("prefix", "suffix"), flatHierarchy) - def path = Path.of("/bla/foo/prefix_lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304_suffix.csv") + def path = Path.of("/bla/foo/prefix_lpts_g3_suffix.csv") when: def metaInformation = fns.timeSeriesMetaInformation(path) @@ -932,7 +929,6 @@ class FileNamingStrategyTest extends Specification { then: LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) (metaInformation as LoadProfileTimeSeriesMetaInformation).with { - assert uuid == UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") assert profile == "g3" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 649f70518..84a54459b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -236,7 +236,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("its_ph_56c20b88-c001-4225-8dac-cd13a75c6b48.csv").toFile().exists() testBaseFolderPath.resolve("its_pqh_83b577cc-06b1-47a1-bfff-ad648a00784b.csv").toFile().exists() testBaseFolderPath.resolve("its_c_a4bbcb77-b9d0-4b88-92be-b9a14a3e332b.csv").toFile().exists() - testBaseFolderPath.resolve("lpts_g2_b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc.csv").toFile().exists() + testBaseFolderPath.resolve("lpts_g2.csv").toFile().exists() testBaseFolderPath.resolve("its_weather_4fcbdfcd-4ff0-46dd-b0df-f3af7ae3ed98.csv").toFile().exists() } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 9e45cf059..15eb3d9b8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -110,7 +110,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri "result_entities.sql", "input_entities.sql", "time_series.sql", - "load_profile.sql" + "load_profiles.sql" ) for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) @@ -222,6 +222,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_ph", ps -> {}).count() == 3 source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pqh", ps -> {}).count() == 3 source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_weather", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "load_profiles", ps -> {}).count() == 3 cleanup: sink.shutdown() diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index f0721a805..5388c5b2d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -72,9 +72,9 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { timeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } loadProfileTimeSeriesPaths = [ - "lpts_r1_aac618d5-f707-4000-8871-ea080c24df82.csv", - "lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448.csv", - "lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9.csv" + "lpts_r1.csv", + "lpts_r2.csv", + "lpts_g0.csv" ].stream().map { file -> Path.of(file) }.collect(Collectors.toSet()) loadProfileTimeSeriesPaths.forEach { path -> Files.createFile(testBaseFolderPath.resolve(path)) } } @@ -360,30 +360,22 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { } def "The CsvDataSource is able to build correct load profile meta information"() { - given: - def expected = [ - new CsvLoadProfileMetaInformation(UUID.fromString("aac618d5-f707-4000-8871-ea080c24df82"), "r1", Path.of("lpts_r1_aac618d5-f707-4000-8871-ea080c24df82")), - new CsvLoadProfileMetaInformation(UUID.fromString("0b5059d9-dbf5-4047-85f7-522a43608448"), "r2", Path.of("lpts_r2_0b5059d9-dbf5-4047-85f7-522a43608448")), - new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) - ] as Set - when: def actual = dummyCsvSource.getCsvLoadProfileMetaInformation() then: - actual == expected + actual.size() == 3 + actual.get("r1").fullFilePath == Path.of("lpts_r1") + actual.get("r2").fullFilePath == Path.of("lpts_r2") + actual.get("g0").fullFilePath == Path.of("lpts_g0") } def "The CsvDataSource is able to build correct load profile meta information when restricting load profile"() { - given: - def expected = [ - new CsvLoadProfileMetaInformation(UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9"), "g0", Path.of("lpts_g0_fa3894c1-25af-479c-8a40-1323bb9150a9")) - ] as Set - when: def actual = dummyCsvSource.getCsvLoadProfileMetaInformation(BdewStandardLoadProfile.G0) then: - actual == expected + actual.size() == 1 + actual.get("g0").fullFilePath == Path.of("lpts_g0") } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy index dd00ce6a1..e46a108c6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy @@ -49,7 +49,7 @@ class SqlLoadProfileSourceIT extends Specification implements TestContainerHelpe postgreSQLContainer.copyFileToContainer(sqlImportFile, "/home/") // Execute import script - Iterable importFiles = Arrays.asList("time_series_load_profiles.sql") + Iterable importFiles = Arrays.asList("load_profiles.sql") for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) assert res.stderr.empty diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy index 23e53553d..4f26fa36c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSourceIT.groovy @@ -43,7 +43,7 @@ class SqlTimeSeriesMetaInformationSourceIT extends Specification implements Test "time_series_ph.sql", "time_series_pq.sql", "time_series_pqh.sql", - "time_series_load_profiles.sql") + "load_profiles.sql") for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) assert res.stderr.empty @@ -112,9 +112,6 @@ class SqlTimeSeriesMetaInformationSourceIT extends Specification implements Test result.size() == 2 result.keySet() == ["g2", "g3"] as Set - - result.get("g2").uuid == UUID.fromString('b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc') - result.get("g3").uuid == UUID.fromString('9b880468-309c-43c1-a3f4-26dd26266216') } def "The SQL time series meta information source returns correct meta information for a given load profile"() { @@ -122,13 +119,13 @@ class SqlTimeSeriesMetaInformationSourceIT extends Specification implements Test def result = source.getLoadProfileMetaInformation(profile) then: - result.present - result.get().uuid == expectedUuid + result.present == expected where: - profile || expectedUuid - BdewStandardLoadProfile.G2 || UUID.fromString('b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc') - BdewStandardLoadProfile.G3 || UUID.fromString('9b880468-309c-43c1-a3f4-26dd26266216') + profile || expected + BdewStandardLoadProfile.G2 || true + BdewStandardLoadProfile.G3 || true + BdewStandardLoadProfile.L0 ||false } def "The SQL time series meta information source returns an empty optional for an unknown load profile"() { diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql deleted file mode 100644 index 474be75de..000000000 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE public.load_profile_g2 -( - time_series UUID NOT NULL, - day_of_week TEXT NOT NULL, - quarter_hour_of_day TEXT NOT NULL, - p DOUBLE PRECISION, - grid_uuid UUID NOT NULL REFERENCES grids(uuid) -) - WITHOUT OIDS - TABLESPACE pg_default; - diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql new file mode 100644 index 000000000..da883ded9 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql @@ -0,0 +1,24 @@ +CREATE TABLE public.load_profiles +( + load_profile VARCHAR(11) NOT NULL, + quarter_hour integer NOT NULL, + su_sa DOUBLE PRECISION NOT NULL, + su_su DOUBLE PRECISION NOT NULL, + su_wd DOUBLE PRECISION NOT NULL, + tr_sa DOUBLE PRECISION NOT NULL, + tr_su DOUBLE PRECISION NOT NULL, + tr_wd DOUBLE PRECISION NOT NULL, + wi_sa DOUBLE PRECISION NOT NULL, + wi_su DOUBLE PRECISION NOT NULL, + wi_wd DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX load_profiles_series_id ON load_profiles USING hash (load_profile); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX load_profiles_series_time ON load_profiles USING btree (load_profile, quarter_hour); \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv new file mode 100644 index 000000000..b216cb1f6 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv @@ -0,0 +1,3 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,0 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,1 \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql new file mode 100644 index 000000000..8402798ae --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql @@ -0,0 +1,35 @@ +CREATE TABLE public.load_profiles +( + load_profile VARCHAR(11) NOT NULL, + quarter_hour integer NOT NULL, + su_sa DOUBLE PRECISION NOT NULL, + su_su DOUBLE PRECISION NOT NULL, + su_wd DOUBLE PRECISION NOT NULL, + tr_sa DOUBLE PRECISION NOT NULL, + tr_su DOUBLE PRECISION NOT NULL, + tr_wd DOUBLE PRECISION NOT NULL, + wi_sa DOUBLE PRECISION NOT NULL, + wi_su DOUBLE PRECISION NOT NULL, + wi_wd DOUBLE PRECISION NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX load_profiles_series_id ON load_profiles USING hash (load_profile); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX load_profiles_series_time ON load_profiles USING btree (load_profile, quarter_hour); + +INSERT INTO + public.load_profiles (load_profile, quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd) +VALUES + +('g2', 0, 63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), +('g2', 1, 58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), +('g2', 2, 53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), + +('g3', 0, 99.0, 94.6, 98.5, 92.5, 87.6, 91.2, 95.3, 87.8, 94.7), +('g3', 1, 100.0, 95.3, 99.0, 93.0, 87.3, 90.2, 95.5, 88.3, 94.1), +('g3', 2, 100.9, 96.0, 99.4, 93.7, 87.4, 89.4, 96.2, 89.0, 94.1); diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql deleted file mode 100644 index e428877f0..000000000 --- a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_load_profiles.sql +++ /dev/null @@ -1,36 +0,0 @@ -CREATE TABLE public.time_series_load_profiles -( - load_profile VARCHAR(11) NOT NULL, - time_series uuid NOT NULL, - quarter_hour integer NOT NULL, - SuSa double precision NOT NULL, - SuSu double precision NOT NULL, - SuWd double precision NOT NULL, - TrSa double precision NOT NULL, - TrSu double precision NOT NULL, - TrWd double precision NOT NULL, - WiSa double precision NOT NULL, - WiSu double precision NOT NULL, - WiWd double precision NOT NULL -) - WITHOUT OIDS - TABLESPACE pg_default; - -CREATE INDEX time_series_load_profiles_series_id ON time_series_load_profiles USING hash (time_series); - --- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html --- Column time_series needs to placed as the first argument since we at most use an equality constraint on --- time_series and a range query on time. -CREATE UNIQUE INDEX time_series_load_profiles_series_time ON time_series_load_profiles USING btree (time_series, quarter_hour); - -INSERT INTO - public.time_series_load_profiles (load_profile, time_series, quarter_hour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd) -VALUES - -('g2', 'b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc', 0, 63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), -('g2', 'b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc', 1, 58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), -('g2', 'b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc', 2, 53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), - -('g3', '9b880468-309c-43c1-a3f4-26dd26266216', 0, 99.0, 94.6, 98.5, 92.5, 87.6, 91.2, 95.3, 87.8, 94.7), -('g3', '9b880468-309c-43c1-a3f4-26dd26266216', 1, 100.0, 95.3, 99.0, 93.0, 87.3, 90.2, 95.5, 88.3, 94.1), -('g3', '9b880468-309c-43c1-a3f4-26dd26266216', 2, 100.9, 96.0, 99.4, 93.7, 87.4, 89.4, 96.2, 89.0, 94.1); From 3e47beb4655736938ec5276f01737eb821f366cf Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 8 Nov 2024 13:51:17 +0100 Subject: [PATCH 161/310] Improving closing of sql resources on error. --- .../datamodel/io/connectors/SqlConnector.java | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 9d6e4150d..7133bdbad 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -134,22 +134,21 @@ public void shutdown() { */ public Stream> toStream(PreparedStatement ps, int fetchSize) throws SQLException { - ps.setFetchSize(fetchSize); - ResultSet resultSet = ps.executeQuery(); - Iterator> sqlIterator = getSqlIterator(resultSet); - - return StreamSupport.stream( - Spliterators.spliteratorUnknownSize( - sqlIterator, Spliterator.NONNULL | Spliterator.IMMUTABLE), - true) - .onClose( - () -> { - try (resultSet) { - log.debug("Resources successfully closed."); - } catch (SQLException e) { - log.warn("Failed to properly close sources.", e); - } - }); + try { + ps.setFetchSize(fetchSize); + ResultSet resultSet = ps.executeQuery(); + Iterator> sqlIterator = getSqlIterator(resultSet); + + return StreamSupport.stream( + Spliterators.spliteratorUnknownSize( + sqlIterator, Spliterator.NONNULL | Spliterator.IMMUTABLE), + true) + .onClose(() -> closeResultSet(ps, resultSet)); + } catch (SQLException e) { + // catches the exception, closes the statement and re-throws the exception + closeResultSet(ps, null); + throw e; + } } /** @@ -166,13 +165,7 @@ public boolean hasNext() { return rs.next(); } catch (SQLException e) { log.error("Exception at extracting next ResultSet: ", e); - - try { - rs.close(); - } catch (SQLException ex) { - throw new RuntimeException(ex); - } - + closeResultSet(null, rs); return false; } } @@ -183,12 +176,27 @@ public Map next() { return extractFieldMap(rs); } catch (SQLException e) { log.error("Exception at extracting ResultSet: ", e); + closeResultSet(null, rs); return Collections.emptyMap(); } } }; } + /** + * Method for closing a {@link ResultSet}. + * + * @param rs to close + */ + private void closeResultSet(PreparedStatement ps, ResultSet rs) { + try (ps; + rs) { + log.debug("Resources successfully closed."); + } catch (SQLException e) { + log.warn("Failed to properly close sources.", e); + } + } + /** * Extracts only the current row of the ResultSet into a field to value map * From 919e10b2a21bf12646d949f3b1f47663034862b9 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Fri, 8 Nov 2024 18:31:00 +0100 Subject: [PATCH 162/310] Adding NoSuchElementException to solve SQ bug --- .../edu/ie3/datamodel/io/connectors/SqlConnector.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 7133bdbad..0de8c9c42 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -162,7 +162,9 @@ public Iterator> getSqlIterator(ResultSet rs) { @Override public boolean hasNext() { try { - return rs.next(); + boolean notEmpty = rs.isBeforeFirst() || rs.getRow() > 0; + boolean notLastRow = !rs.isLast(); + return notEmpty && notLastRow; } catch (SQLException e) { log.error("Exception at extracting next ResultSet: ", e); closeResultSet(null, rs); @@ -173,6 +175,12 @@ public boolean hasNext() { @Override public Map next() { try { + boolean valid = rs.next(); + + if (!valid) + throw new NoSuchElementException( + "There is no more element to iterate to in the ResultSet."); + return extractFieldMap(rs); } catch (SQLException e) { log.error("Exception at extracting ResultSet: ", e); From 3e4a7b914d64522a67b9d47098a62c1b8c6d1dae Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Fri, 8 Nov 2024 18:42:47 +0100 Subject: [PATCH 163/310] Solving code smell regarding method name --- .../ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java index d0e41c599..83661604c 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlIdCoordinateSource.java @@ -145,7 +145,7 @@ public Optional getId(Point coordinate) { @Override public Collection getAllCoordinates() { - return executeQuerytoStream(basicQuery + ";").map(value -> value.coordinate).toList(); + return executeQueryToStream(basicQuery + ";").map(value -> value.coordinate).toList(); } @Override @@ -206,7 +206,7 @@ private CoordinateValue createCoordinateValue(Map fieldToValues) return new CoordinateValue(idCoordinate.id(), idCoordinate.point()); } - private Stream executeQuerytoStream(String query) { + private Stream executeQueryToStream(String query) { return dataSource.executeQuery(query).map(this::createCoordinateValue); } From 5dd424ef9d61675e5a78c9ae862863b28db23c33 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Fri, 8 Nov 2024 19:00:27 +0100 Subject: [PATCH 164/310] Solving new code smell --- .../edu/ie3/datamodel/io/connectors/SqlConnector.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index 0de8c9c42..eed7307ad 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -162,9 +162,7 @@ public Iterator> getSqlIterator(ResultSet rs) { @Override public boolean hasNext() { try { - boolean notEmpty = rs.isBeforeFirst() || rs.getRow() > 0; - boolean notLastRow = !rs.isLast(); - return notEmpty && notLastRow; + return rs.next(); } catch (SQLException e) { log.error("Exception at extracting next ResultSet: ", e); closeResultSet(null, rs); @@ -175,9 +173,9 @@ public boolean hasNext() { @Override public Map next() { try { - boolean valid = rs.next(); + boolean isEmpty = !rs.isBeforeFirst() && rs.getRow() == 0; - if (!valid) + if (isEmpty || rs.isAfterLast()) throw new NoSuchElementException( "There is no more element to iterate to in the ResultSet."); From cc26b88e7d8b49eb4a3bf09f0f69975c2d3eeb28 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 12 Nov 2024 14:55:01 +0100 Subject: [PATCH 165/310] Improving code. --- build.gradle | 1 + .../timeseries/BdewLoadProfileFactory.java | 42 +++++++------------ .../models/value/load/BdewLoadValues.java | 30 +++++-------- 3 files changed, 27 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index 97155e59f..5783c2386 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ plugins { id 'jacoco' // java code coverage plugin id "org.sonarqube" version "5.1.0.4882" // sonarqube id 'net.thauvin.erik.gradle.semver' version '1.0.4' // semantic versioning + id "com.github.johnrengelman.shadow" version "8.1.1" // fat jar } ext { diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index c45b3705e..868c672e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -16,6 +16,8 @@ import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; import java.util.*; +import java.util.function.Function; +import java.util.stream.Stream; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; @@ -97,37 +99,23 @@ public BdewStandardLoadProfile parseProfile(String profile) { @Override public Optional> calculateMaxPower( BdewStandardLoadProfile loadProfile, Set> entries) { - Optional power; + Function> valueExtractor; if (loadProfile == BdewStandardLoadProfile.H0) { - power = - entries.stream() - .map(TimeSeriesEntry::getValue) - .map(v -> List.of(v.getWiSa(), v.getWiSu(), v.getWiWd())) - .flatMap(Collection::stream) - .max(Comparator.naturalOrder()); - + // maximum dynamization factor is on day 366 (leap year) or day 365 (regular year). + // The difference between day 365 and day 366 is negligible, thus pick 366 + valueExtractor = + v -> + Stream.of(v.getWiSa(), v.getWiSu(), v.getWiWd()) + .map(p -> BdewLoadValues.dynamization(p, 366)); } else { - power = - entries.stream() - .map(LoadProfileEntry::getValue) - .map( - v -> - List.of( - v.getSuSa(), - v.getSuSu(), - v.getSuWd(), - v.getTrSa(), - v.getTrSu(), - v.getTrWd(), - v.getWiSa(), - v.getWiSu(), - v.getWiWd())) - .flatMap(Collection::stream) - .max(Comparator.naturalOrder()); + valueExtractor = v -> v.values().stream(); } - - return power.map(p -> Quantities.getQuantity(p, WATT)); + return entries.stream() + .map(TimeSeriesEntry::getValue) + .flatMap(valueExtractor) + .max(Comparator.naturalOrder()) + .map(p -> Quantities.getQuantity(p, WATT)); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java index 1918542ec..0bf549cac 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -15,11 +15,9 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.PValue; import java.time.ZonedDateTime; +import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.Function; -import javax.measure.quantity.Power; -import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; /** Load values for a {@link BdewStandardLoadProfile} */ @@ -73,14 +71,14 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { TRANSITION, TrWd); }; - PValue value = new PValue(Quantities.getQuantity(mapping.get(getSeason(time)), WATT)); + double power = mapping.get(getSeason(time)); if (loadProfile == BdewStandardLoadProfile.H0) { /* For the residential average profile, a dynamization has to be taken into account */ - return dynamization(value, time.getDayOfYear()); // leap years are ignored - } else { - return value; + power = dynamization(power, time.getDayOfYear()); // leap years are ignored } + + return new PValue(Quantities.getQuantity(power, WATT)); } /** @@ -92,21 +90,11 @@ public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { * @param t day of year (1-366) * @return dynamization factor */ - private PValue dynamization(PValue load, int t) { + public static double dynamization(double load, int t) { double factor = (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places - Function round = - l -> round(l * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place - - ComparableQuantity value = - load.getP() - .map(v -> v.getValue().doubleValue()) - .map(round) - .map(v -> Quantities.getQuantity(v, WATT)) - .orElse(null); - - return new PValue(value); + return round(load * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place } public double getSuSa() { @@ -145,6 +133,10 @@ public double getWiWd() { return WiWd; } + public List values() { + return List.of(SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd); + } + @Override public boolean equals(Object o) { if (this == o) return true; From 22279f37c538e3ef1fe6b0f354f1fc49356d2238 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 13 Nov 2024 10:08:04 +0100 Subject: [PATCH 166/310] Fixing small issue in `SqlTimeSeriesMetaInformationSource`. Renaming `LoadProfileTimeSeriesMetaInformation` to `LoadProfileMetaInformation`. --- .../io/csv/CsvLoadProfileMetaInformation.java | 6 +- .../timeseries/BdewLoadProfileFactory.java | 5 +- .../timeseries/LoadProfileFactory.java | 4 +- .../timeseries/RandomLoadProfileFactory.java | 5 +- .../TimeSeriesMetaInformationFactory.java | 8 +-- .../io/naming/DatabaseNamingStrategy.java | 9 ++- .../EntityPersistenceNamingStrategy.java | 7 +-- .../io/naming/FileNamingStrategy.java | 5 +- ...n.java => LoadProfileMetaInformation.java} | 8 +-- .../TimeSeriesMetaInformationSource.java | 24 +++++--- .../io/source/csv/CsvDataSource.java | 8 +-- .../CsvTimeSeriesMetaInformationSource.java | 23 +------- .../io/source/sql/SqlLoadProfileSource.java | 8 +-- .../SqlTimeSeriesMetaInformationSource.java | 59 ++++++++----------- .../BdewLoadProfileFactoryTest.groovy | 4 +- .../RandomLoadProfileFactoryTest.groovy | 4 +- .../io/naming/FileNamingStrategyTest.groovy | 10 ++-- .../source/sql/SqlLoadProfileSourceIT.groovy | 4 +- 18 files changed, 90 insertions(+), 111 deletions(-) rename src/main/java/edu/ie3/datamodel/io/naming/timeseries/{LoadProfileTimeSeriesMetaInformation.java => LoadProfileMetaInformation.java} (78%) diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java index a7ccd4f8c..905f1ee3f 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvLoadProfileMetaInformation.java @@ -5,11 +5,11 @@ */ package edu.ie3.datamodel.io.csv; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import java.nio.file.Path; import java.util.Objects; -public class CsvLoadProfileMetaInformation extends LoadProfileTimeSeriesMetaInformation { +public class CsvLoadProfileMetaInformation extends LoadProfileMetaInformation { private final Path fullFilePath; public CsvLoadProfileMetaInformation(String profile, Path fullFilePath) { @@ -18,7 +18,7 @@ public CsvLoadProfileMetaInformation(String profile, Path fullFilePath) { } public CsvLoadProfileMetaInformation( - LoadProfileTimeSeriesMetaInformation metaInformation, Path fullFilePath) { + LoadProfileMetaInformation metaInformation, Path fullFilePath) { this(metaInformation.getProfile(), fullFilePath); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 868c672e6..492a53be7 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -9,7 +9,7 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; @@ -78,8 +78,7 @@ protected List> getFields(Class entityClass) { @Override public BdewLoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, - Set> entries) { + LoadProfileMetaInformation metaInformation, Set> entries) { BdewStandardLoadProfile profile = parseProfile(metaInformation.getProfile()); Optional> maxPower = calculateMaxPower(profile, entries); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 18402be8f..d4b25d395 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.timeseries; import edu.ie3.datamodel.io.factory.Factory; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; @@ -25,7 +25,7 @@ public LoadProfileFactory(Class valueClass) { } public abstract LoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, Set> entries); + LoadProfileMetaInformation metaInformation, Set> entries); public abstract P parseProfile(String profile); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index d6555509a..15745884f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -7,7 +7,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; @@ -71,8 +71,7 @@ protected List> getFields(Class entityClass) { @Override public RandomLoadProfileTimeSeries build( - LoadProfileTimeSeriesMetaInformation metaInformation, - Set> entries) { + LoadProfileMetaInformation metaInformation, Set> entries) { return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index 820f3f48a..71c64cbd8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -10,7 +10,7 @@ import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import java.util.Collections; import java.util.List; import java.util.Set; @@ -29,7 +29,7 @@ public class TimeSeriesMetaInformationFactory private static final String LOAD_PROFILE = "loadProfile"; public TimeSeriesMetaInformationFactory() { - super(IndividualTimeSeriesMetaInformation.class, LoadProfileTimeSeriesMetaInformation.class); + super(IndividualTimeSeriesMetaInformation.class, LoadProfileMetaInformation.class); } @Override @@ -40,9 +40,9 @@ protected List> getFields(Class entityClass) { @Override protected TimeSeriesMetaInformation buildModel(EntityData data) { - if (LoadProfileTimeSeriesMetaInformation.class.isAssignableFrom(data.getTargetClass())) { + if (LoadProfileMetaInformation.class.isAssignableFrom(data.getTargetClass())) { String profile = data.getField(LOAD_PROFILE); - return new LoadProfileTimeSeriesMetaInformation(profile); + return new LoadProfileMetaInformation(profile); } else { UUID timeSeries = data.getUUID(TIME_SERIES); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index ebcc1fdf6..03a9a32d2 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy { private static final String TIME_SERIES_PREFIX = "time_series_"; - private static final String LOAD_PROFILE_PREFIX = "load_profiles"; + private static final String LOAD_PROFILE = "load_profiles"; private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; @@ -42,6 +42,11 @@ public String getTimeSeriesPrefix() { return TIME_SERIES_PREFIX; } + /** Returns the String of the load profile table */ + public String getLoadProfileTableName() { + return LOAD_PROFILE; + } + /** * Provides the name of a time series table given a column scheme * @@ -58,7 +63,7 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { * @return the table name */ public String getLoadProfileEntityName() { - return LOAD_PROFILE_PREFIX; + return getLoadProfileTableName(); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index c6a0b89ab..37a070aa3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -7,7 +7,7 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.input.*; @@ -156,14 +156,13 @@ public IndividualTimeSeriesMetaInformation individualTimesSeriesMetaInformation( * @param fileName File name to extract information from * @return Meta information form load profile time series file name */ - public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformation( - String fileName) { + public LoadProfileMetaInformation loadProfileTimesSeriesMetaInformation(String fileName) { Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName); if (!matcher.matches()) throw new IllegalArgumentException( "Cannot extract meta information on load profile time series from '" + fileName + "'."); - return new LoadProfileTimeSeriesMetaInformation(matcher.group("profile")); + return new LoadProfileMetaInformation(matcher.group("profile")); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index c81520bc3..dc3e8dc66 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -7,7 +7,7 @@ import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -238,8 +238,7 @@ public IndividualTimeSeriesMetaInformation individualTimeSeriesMetaInformation(S removeFileNameEnding(fileName)); } - public LoadProfileTimeSeriesMetaInformation loadProfileTimeSeriesMetaInformation( - String fileName) { + public LoadProfileMetaInformation loadProfileTimeSeriesMetaInformation(String fileName) { return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation( removeFileNameEnding(fileName)); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java similarity index 78% rename from src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java index 72a3df4cf..875c881e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java @@ -10,15 +10,15 @@ import java.util.UUID; /** Specific meta information, that can be derived from a load profile time series file */ -public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation { +public class LoadProfileMetaInformation extends TimeSeriesMetaInformation { private final String profile; - public LoadProfileTimeSeriesMetaInformation(String profile) { + public LoadProfileMetaInformation(String profile) { super(UUID.randomUUID()); this.profile = profile; } - public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { + public LoadProfileMetaInformation(UUID uuid, String profile) { super(uuid); this.profile = profile; } @@ -30,7 +30,7 @@ public String getProfile() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof LoadProfileTimeSeriesMetaInformation that)) return false; + if (!(o instanceof LoadProfileMetaInformation that)) return false; if (!super.equals(o)) return false; return profile.equals(that.profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java index 3bc09db66..7bf442bca 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMetaInformationSource.java @@ -7,14 +7,17 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile; +import java.util.Collections; import java.util.Map; import java.util.Optional; import java.util.UUID; /** Source for all available time series with their {@link UUID} and {@link ColumnScheme} */ -public interface TimeSeriesMetaInformationSource { +public abstract class TimeSeriesMetaInformationSource { + + protected Map loadProfileMetaInformation; /** * Get a mapping from time series {@link UUID} to its meta information {@link @@ -22,7 +25,7 @@ public interface TimeSeriesMetaInformationSource { * * @return that mapping */ - Map getTimeSeriesMetaInformation(); + public abstract Map getTimeSeriesMetaInformation(); /** * Get an option on the given time series meta information @@ -30,14 +33,17 @@ public interface TimeSeriesMetaInformationSource { * @param timeSeriesUuid Unique identifier of the time series in question * @return An Option on the meta information */ - Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid); + public abstract Optional getTimeSeriesMetaInformation( + UUID timeSeriesUuid); /** - * Gat a mapping from load profile to {@link LoadProfileTimeSeriesMetaInformation}. + * Gat a mapping from load profile to {@link LoadProfileMetaInformation}. * * @return that mapping */ - Map getLoadProfileMetaInformation(); + public Map getLoadProfileMetaInformation() { + return Collections.unmodifiableMap(loadProfileMetaInformation); + } /** * Get an option on the given time series meta information @@ -45,6 +51,8 @@ public interface TimeSeriesMetaInformationSource { * @param loadProfile load profile of the time series in question * @return An Option on the meta information */ - Optional getLoadProfileMetaInformation( - LoadProfile loadProfile); + public Optional getLoadProfileMetaInformation( + LoadProfile loadProfile) { + return Optional.ofNullable(loadProfileMetaInformation.get(loadProfile.getKey())); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index da8700287..ad978e462 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -13,7 +13,7 @@ import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.DataSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.profile.LoadProfile; @@ -145,7 +145,7 @@ public Map getCsvLoadProfileMetaInformati .map( filePath -> { /* Extract meta information from file path and enhance it with the file path itself */ - LoadProfileTimeSeriesMetaInformation metaInformation = + LoadProfileMetaInformation metaInformation = fileNamingStrategy.loadProfileTimeSeriesMetaInformation(filePath.toString()); return new CsvLoadProfileMetaInformation( metaInformation, FileNamingStrategy.removeFileNameEnding(filePath.getFileName())); @@ -156,9 +156,7 @@ public Map getCsvLoadProfileMetaInformati || profiles.length == 0 || Stream.of(profiles) .anyMatch(profile -> profile.getKey().equals(metaInformation.getProfile()))) - .collect( - Collectors.toMap( - LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); + .collect(Collectors.toMap(LoadProfileMetaInformation::getProfile, Function.identity())); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java index edd307727..786474e87 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMetaInformationSource.java @@ -6,13 +6,11 @@ package edu.ie3.datamodel.io.source.csv; import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.csv.CsvLoadProfileMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMetaInformationSource; -import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.TimeSeriesUtils; import java.nio.file.Path; import java.util.Collections; @@ -26,14 +24,12 @@ * CSV implementation for retrieving {@link TimeSeriesMetaInformationSource} from input directory * structures */ -public class CsvTimeSeriesMetaInformationSource implements TimeSeriesMetaInformationSource { +public class CsvTimeSeriesMetaInformationSource extends TimeSeriesMetaInformationSource { protected final CsvDataSource dataSource; private final Map timeSeriesMetaInformation; - private final Map loadProfileMetaInformation; - /** * Creates a time series type source * @@ -60,9 +56,7 @@ public CsvTimeSeriesMetaInformationSource(CsvDataSource dataSource) { this.loadProfileMetaInformation = dataSource.getCsvLoadProfileMetaInformation().values().stream() - .collect( - Collectors.toMap( - LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); + .collect(Collectors.toMap(LoadProfileMetaInformation::getProfile, Function.identity())); } @Override @@ -75,15 +69,4 @@ public Optional getTimeSeriesMetaInformatio UUID timeSeriesUuid) { return Optional.ofNullable(timeSeriesMetaInformation.get(timeSeriesUuid)); } - - @Override - public Map getLoadProfileMetaInformation() { - return Collections.unmodifiableMap(loadProfileMetaInformation); - } - - @Override - public Optional getLoadProfileMetaInformation( - LoadProfile loadProfile) { - return Optional.ofNullable(loadProfileMetaInformation.get(loadProfile.getKey())); - } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index cadb87e75..68a612921 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -12,7 +12,7 @@ import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.factory.timeseries.LoadProfileFactory; import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.LoadProfileSource; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; @@ -44,7 +44,7 @@ public class SqlLoadProfileSource

    private final SqlDataSource dataSource; private final String tableName; - private final LoadProfileTimeSeriesMetaInformation metaInformation; + private final LoadProfileMetaInformation metaInformation; private final P loadProfile; // General fields @@ -61,7 +61,7 @@ public class SqlLoadProfileSource

    public SqlLoadProfileSource( SqlDataSource dataSource, - LoadProfileTimeSeriesMetaInformation metaInformation, + LoadProfileMetaInformation metaInformation, Class entryClass, LoadProfileFactory entryFactory) { super(entryClass, entryFactory); @@ -82,7 +82,7 @@ public SqlLoadProfileSource( SqlConnector connector, String schemaName, DatabaseNamingStrategy namingStrategy, - LoadProfileTimeSeriesMetaInformation metaInformation, + LoadProfileMetaInformation metaInformation, Class entryClass, LoadProfileFactory entryFactory) { this( diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index 97ea31888..fdc161f34 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -11,10 +11,10 @@ import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMetaInformationSource; -import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.utils.TimeSeriesUtils; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -22,16 +22,14 @@ import java.util.stream.Collectors; /** SQL implementation for retrieving {@link TimeSeriesMetaInformationSource} from the SQL scheme */ -public class SqlTimeSeriesMetaInformationSource implements TimeSeriesMetaInformationSource { +public class SqlTimeSeriesMetaInformationSource extends TimeSeriesMetaInformationSource { - private static final TimeSeriesMetaInformationFactory mappingFactory = + private static final TimeSeriesMetaInformationFactory metaInformationFactory = new TimeSeriesMetaInformationFactory(); - private final DatabaseNamingStrategy namingStrategy; - private final Map mapping; - private final Map - loadProfileTimeSeriesMetaInformation; + private final Map timeSeriesMetaInformation; + private final DatabaseNamingStrategy namingStrategy; private final SqlDataSource dataSource; public SqlTimeSeriesMetaInformationSource( @@ -42,7 +40,7 @@ public SqlTimeSeriesMetaInformationSource( String queryComplete = createQueryComplete(schemaName); String loadMetaInformationQuery = createLoadProfileQueryComplete(schemaName); - this.mapping = + this.timeSeriesMetaInformation = dataSource .executeQuery(queryComplete) .map(this::createEntity) @@ -51,14 +49,12 @@ public SqlTimeSeriesMetaInformationSource( Collectors.toMap( IndividualTimeSeriesMetaInformation::getUuid, Function.identity())); - this.loadProfileTimeSeriesMetaInformation = + this.loadProfileMetaInformation = dataSource .executeQuery(loadMetaInformationQuery) .map(this::createLoadProfileEntity) .flatMap(Optional::stream) - .collect( - Collectors.toMap( - LoadProfileTimeSeriesMetaInformation::getProfile, Function.identity())); + .collect(Collectors.toMap(LoadProfileMetaInformation::getProfile, Function.identity())); } /** @@ -74,7 +70,7 @@ private String createQueryComplete(String schemaName) { Collectors.toMap( namingStrategy::getTimeSeriesEntityName, columnScheme -> columnScheme)); - Iterable selectQueries = + List selectQueries = dataSource.getDbTables(schemaName, namingStrategy.getTimeSeriesPrefix() + "%").stream() .map( tableName -> @@ -90,7 +86,7 @@ private String createQueryComplete(String schemaName) { .flatMap(Optional::stream) .toList(); - return String.join("\nUNION\n", selectQueries) + ";"; + return selectQueries.isEmpty() ? ";" : String.join("\nUNION\n", selectQueries) + ";"; } /** @@ -100,48 +96,41 @@ private String createQueryComplete(String schemaName) { * @return query String */ private String createLoadProfileQueryComplete(String schemaName) { - return "SELECT DISTINCT load_profile FROM " + schemaName + ".load_profiles;"; + String tableName = namingStrategy.getLoadProfileTableName(); + boolean isNotPresent = dataSource.getDbTables(schemaName, tableName).isEmpty(); + + return isNotPresent + ? ";" + : "SELECT DISTINCT load_profile FROM " + schemaName + "." + tableName + ";"; } @Override public Map getTimeSeriesMetaInformation() { - return this.mapping; + return timeSeriesMetaInformation; } @Override public Optional getTimeSeriesMetaInformation( UUID timeSeriesUuid) { - return Optional.ofNullable(this.mapping.get(timeSeriesUuid)); - } - - @Override - public Map getLoadProfileMetaInformation() { - return loadProfileTimeSeriesMetaInformation; - } - - @Override - public Optional getLoadProfileMetaInformation( - LoadProfile loadProfile) { - return Optional.ofNullable(loadProfileTimeSeriesMetaInformation.get(loadProfile.getKey())); + return Optional.ofNullable(timeSeriesMetaInformation.get(timeSeriesUuid)); } private Optional createEntity( Map fieldToValues) { EntityData entityData = new EntityData(fieldToValues, IndividualTimeSeriesMetaInformation.class); - return mappingFactory + return metaInformationFactory .get(entityData) .map(meta -> (IndividualTimeSeriesMetaInformation) meta) .getData(); } - private Optional createLoadProfileEntity( + private Optional createLoadProfileEntity( Map fieldToValues) { - EntityData entityData = - new EntityData(fieldToValues, LoadProfileTimeSeriesMetaInformation.class); - return mappingFactory + EntityData entityData = new EntityData(fieldToValues, LoadProfileMetaInformation.class); + return metaInformationFactory .get(entityData) - .map(meta -> (LoadProfileTimeSeriesMetaInformation) meta) + .map(meta -> (LoadProfileMetaInformation) meta) .getData(); } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index d13a41185..80a2f5300 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.BdewLoadValues @@ -130,7 +130,7 @@ class BdewLoadProfileFactoryTest extends Specification { def "A BDEWLoadProfileFactory builds time series from entries"() { given: UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") - LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "g0") + LoadProfileMetaInformation metaInformation = new LoadProfileMetaInformation(uuid, "g0") when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index eaa1d3ea9..514fb598a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.timeseries -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.LoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.RandomLoadValues @@ -130,7 +130,7 @@ class RandomLoadProfileFactoryTest extends Specification { def "A RandomLoadProfileFactory builds time series from entries"() { given: UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") - LoadProfileTimeSeriesMetaInformation metaInformation = new LoadProfileTimeSeriesMetaInformation(uuid, "random") + LoadProfileMetaInformation metaInformation = new LoadProfileMetaInformation(uuid, "random") when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index 353fa3f8d..528529532 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -7,7 +7,7 @@ package edu.ie3.datamodel.io.naming import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.MeasurementUnitInput @@ -912,8 +912,8 @@ class FileNamingStrategyTest extends Specification { def metaInformation = fns.timeSeriesMetaInformation(path) then: - LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) - (metaInformation as LoadProfileTimeSeriesMetaInformation).with { + LoadProfileMetaInformation.isAssignableFrom(metaInformation.getClass()) + (metaInformation as LoadProfileMetaInformation).with { assert profile == "g3" } } @@ -927,8 +927,8 @@ class FileNamingStrategyTest extends Specification { def metaInformation = fns.timeSeriesMetaInformation(path) then: - LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) - (metaInformation as LoadProfileTimeSeriesMetaInformation).with { + LoadProfileMetaInformation.isAssignableFrom(metaInformation.getClass()) + (metaInformation as LoadProfileMetaInformation).with { assert profile == "g3" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy index e46a108c6..c29dcca76 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy @@ -12,7 +12,7 @@ import static edu.ie3.test.common.TimeSeriesSourceTestData.TIME_00MIN import edu.ie3.datamodel.io.connectors.SqlConnector import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.value.load.BdewLoadValues import edu.ie3.test.helper.TestContainerHelper @@ -56,7 +56,7 @@ class SqlLoadProfileSourceIT extends Specification implements TestContainerHelpe } connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) - def metaInformation = new LoadProfileTimeSeriesMetaInformation(timeSeriesUuid, "g3") + def metaInformation = new LoadProfileMetaInformation(timeSeriesUuid, "g3") namingStrategy = new DatabaseNamingStrategy() From 3691920b672bac95bc4ee4fdf87f43c559a7a7aa Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 13 Nov 2024 15:11:54 +0100 Subject: [PATCH 167/310] Improving code. --- .../timeseries/BdewLoadProfileFactory.java | 7 +++- .../timeseries/LoadProfileFactory.java | 3 +- .../timeseries/RandomLoadProfileFactory.java | 15 ++++--- .../io/source/LoadProfileSource.java | 40 +++++++++---------- .../io/source/csv/CsvLoadProfileSource.java | 14 ++++++- .../io/source/sql/SqlLoadProfileSource.java | 13 +++++- .../repetitive/BdewLoadProfileTimeSeries.java | 9 ++++- .../repetitive/LoadProfileTimeSeries.java | 10 ++++- .../RandomLoadProfileTimeSeries.java | 10 ++++- .../io/source/LoadProfileSourceTest.groovy | 6 +-- 10 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 492a53be7..b2bc2a74d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -15,9 +15,11 @@ import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.*; import java.util.function.Function; import java.util.stream.Stream; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; @@ -118,7 +120,8 @@ public Optional> calculateMaxPower( } @Override - public double getLoadProfileEnergyScaling() { - return 1000d; + public Optional> getLoadProfileEnergyScaling( + BdewStandardLoadProfile loadProfile) { + return Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index d4b25d395..e4af59b88 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -13,6 +13,7 @@ import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -46,5 +47,5 @@ public String getTimeFieldString() { } /** Returns the load profile energy scaling. */ - public abstract double getLoadProfileEnergyScaling(); + public abstract Optional> getLoadProfileEnergyScaling(P loadProfile); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 15745884f..25a94e8f7 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -8,7 +8,7 @@ import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; -import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; import edu.ie3.datamodel.models.value.load.RandomLoadValues; @@ -16,11 +16,13 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; import tech.units.indriya.quantity.Quantities; -public class RandomLoadProfileFactory extends LoadProfileFactory { +public class RandomLoadProfileFactory + extends LoadProfileFactory { public static final String K_WEEKDAY = "kWd"; public static final String K_SATURDAY = "kSa"; public static final String K_SUNDAY = "kSu"; @@ -76,18 +78,19 @@ public RandomLoadProfileTimeSeries build( } @Override - public LoadProfile parseProfile(String profile) { + public RandomLoadProfile parseProfile(String profile) { return RANDOM_LOAD_PROFILE; } @Override public Optional> calculateMaxPower( - LoadProfile loadProfile, Set> loadProfileEntries) { + RandomLoadProfile loadProfile, Set> loadProfileEntries) { return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); } @Override - public double getLoadProfileEnergyScaling() { - return 716.5416966513656; + public Optional> getLoadProfileEnergyScaling( + RandomLoadProfile loadProfile) { + return Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index c232e2252..60e30dd4e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -18,7 +18,6 @@ import edu.ie3.datamodel.io.source.csv.CsvLoadProfileSource; import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.profile.LoadProfile; -import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; @@ -34,6 +33,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -79,21 +79,23 @@ protected Try, FactoryException> createEntries( */ public abstract Optional getValue(ZonedDateTime time) throws SourceException; + /** Returns the load profile of this source. */ + public abstract P getLoadProfile(); + /** Returns the maximal power value of the time series */ - public abstract Optional> getMaxValue(); + public abstract Optional> getMaxPower(); /** Returns the load profile energy scaling for this load profile time series. */ - public double getLoadProfileEnergyScaling() { - return entryFactory.getLoadProfileEnergyScaling(); - } + public abstract Optional> getLoadProfileEnergyScaling(); /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. * - * @return a map: load profile to time series + * @return a map: load profile to load profile source */ - public static Map getBDEWLoadProfiles() - throws SourceException { + public static Map< + BdewStandardLoadProfile, CsvLoadProfileSource> + getBdewLoadProfiles() throws SourceException { CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); BdewLoadProfileFactory factory = new BdewLoadProfileFactory(); @@ -104,31 +106,25 @@ public static Map getBDEWLoa .stream() .map( metaInformation -> - (BdewLoadProfileTimeSeries) - new CsvLoadProfileSource<>( - buildInSource, metaInformation, BdewLoadValues.class, factory) - .getTimeSeries()) - .collect(Collectors.toMap(BdewLoadProfileTimeSeries::getLoadProfile, Function.identity())); + new CsvLoadProfileSource<>( + buildInSource, metaInformation, BdewLoadValues.class, factory)) + .collect(Collectors.toMap(CsvLoadProfileSource::getLoadProfile, Function.identity())); } /** * Method to read in the build-in {@link RandomLoadProfileTimeSeries}. * - * @return the random load profile time series + * @return the random load profile source */ - public static RandomLoadProfileTimeSeries getRandomLoadProfile() throws SourceException { + public static CsvLoadProfileSource + getRandomLoadProfile() throws SourceException { CsvDataSource buildInSource = getBuildInSource(LoadProfileSource.class, "/load"); CsvLoadProfileMetaInformation metaInformation = buildInSource.getCsvLoadProfileMetaInformation(RANDOM_LOAD_PROFILE).values().stream() .findAny() .orElseThrow(); - return (RandomLoadProfileTimeSeries) - new CsvLoadProfileSource<>( - buildInSource, - metaInformation, - RandomLoadValues.class, - new RandomLoadProfileFactory()) - .getTimeSeries(); + return new CsvLoadProfileSource<>( + buildInSource, metaInformation, RandomLoadValues.class, new RandomLoadProfileFactory()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index c4719560e..278eb7a8e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -22,6 +22,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -76,10 +77,21 @@ public Optional getValue(ZonedDateTime time) throws SourceException { } @Override - public Optional> getMaxValue() { + @SuppressWarnings("unchecked") + public P getLoadProfile() { + return (P) getTimeSeries().getLoadProfile(); + } + + @Override + public Optional> getMaxPower() { return loadProfileTimeSeries.maxPower; } + @Override + public Optional> getLoadProfileEnergyScaling() { + return loadProfileTimeSeries.profileEnergyScaling; + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 68a612921..df85a139e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -27,6 +27,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -120,10 +121,20 @@ public Optional getValue(ZonedDateTime time) throws SourceException { } @Override - public Optional> getMaxValue() { + public P getLoadProfile() { + return loadProfile; + } + + @Override + public Optional> getMaxPower() { return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); } + @Override + public Optional> getLoadProfileEnergyScaling() { + return entryFactory.getLoadProfileEnergyScaling(loadProfile); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 39864fbfa..38edbd08c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -7,12 +7,14 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a @@ -25,7 +27,12 @@ public BdewLoadProfileTimeSeries( BdewStandardLoadProfile loadProfile, Set> values, Optional> maxPower) { - super(uuid, loadProfile, values, maxPower); + super( + uuid, + loadProfile, + values, + maxPower, + Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR))); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index f980279a0..6a14a863c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -12,6 +12,7 @@ import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Collectors; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -25,15 +26,19 @@ public class LoadProfileTimeSeries /** * The maximum average power consumption per quarter-hour for a given calculated over all seasons - * and weekday types of given load profile + * and weekday types of given load profile. */ public final Optional> maxPower; + /** The profile energy scaling in kWh. */ + public final Optional> profileEnergyScaling; + public LoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries, - Optional> maxPower) { + Optional> maxPower, + Optional> profileEnergyScaling) { super(uuid, entries); this.loadProfile = loadProfile; this.valueMapping = @@ -42,6 +47,7 @@ public LoadProfileTimeSeries( Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); this.maxPower = maxPower; + this.profileEnergyScaling = profileEnergyScaling; } /** Returns the {@link LoadProfile}. */ diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index e1adcf4ef..c494112ce 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -8,19 +8,27 @@ import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; +import tech.units.indriya.quantity.Quantities; /** * Describes a random load profile time series based on a {@link * GeneralizedExtremeValueDistribution}. Each value of this# timeseries is given in kW. */ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { + public RandomLoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries) { - super(uuid, loadProfile, entries, Optional.empty()); + super( + uuid, + loadProfile, + entries, + Optional.empty(), + Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR))); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy index 322ceb75b..013e93e67 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/LoadProfileSourceTest.groovy @@ -14,17 +14,17 @@ class LoadProfileSourceTest extends Specification { def "A LoadProfileSourceTest should read in all build-in BDEWStandardLoadProfiles"() { when: - def profiles = LoadProfileSource.getBDEWLoadProfiles() + def profiles = LoadProfileSource.bdewLoadProfiles then: profiles.size() == 11 BdewStandardLoadProfile.values().every { profiles.keySet().contains(it) } - profiles.values().every { it.entries.size() == 96 } + profiles.values().every { it.timeSeries.entries.size() == 96 } } def "A LoadProfileSourceTest should read in the build-in RandomLoadProfile"() { when: - def random = LoadProfileSource.randomLoadProfile + def random = LoadProfileSource.randomLoadProfile.timeSeries then: random.loadProfile == RANDOM_LOAD_PROFILE From 15a0f184659a09727706fb1d480882354cbe5017 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:10:12 +0000 Subject: [PATCH 168/310] Bump sphinx-rtd-theme from 3.0.1 to 3.0.2 in /docs/readthedocs (#1178) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index aedf2f3ce..a22c632a5 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 Sphinx==8.1.3 -sphinx-rtd-theme==3.0.1 +sphinx-rtd-theme==3.0.2 myst-parser==4.0.0 markdown-it-py==3.0.0 From 61b9b7a97d344ab190e7f97436abac6c5d10d028 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Thu, 14 Nov 2024 12:38:00 +0100 Subject: [PATCH 169/310] Simplifying code. --- .../timeseries/TimeSeriesMappingFactory.java | 18 ++------ .../io/source/TimeSeriesMappingSource.java | 43 +------------------ .../input/InputEntityProcessorTest.groovy | 2 +- .../UniquenessValidationUtilsTest.groovy | 19 +++----- .../sql/_timeseries/time_series_mapping.sql | 11 +++-- 5 files changed, 16 insertions(+), 77 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java index 3ef9d60c1..b39a1fdc5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java @@ -5,20 +5,16 @@ */ package edu.ie3.datamodel.io.factory.timeseries; -import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import java.util.List; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class TimeSeriesMappingFactory extends EntityFactory { private static final String ENTITY = "entity"; - private static final String PARTICIPANT = "participant"; private static final String TIME_SERIES = "timeSeries"; public TimeSeriesMappingFactory() { @@ -27,21 +23,13 @@ public TimeSeriesMappingFactory() { @Override protected List> getFields(Class entityClass) { - return List.of( - Stream.of(ENTITY, TIME_SERIES).collect(Collectors.toSet()), - Stream.of(PARTICIPANT, TIME_SERIES).collect(Collectors.toSet())); + return List.of(newSet(ENTITY, TIME_SERIES)); } @Override protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) { + UUID entity = data.getUUID(ENTITY); UUID timeSeries = data.getUUID(TIME_SERIES); - - try { - UUID entity = data.getUUID(ENTITY); - return new TimeSeriesMappingSource.EntityMappingEntry(entity, timeSeries); - } catch (FactoryException e) { - UUID participant = data.getUUID(PARTICIPANT); - return new TimeSeriesMappingSource.ParticipantMappingEntry(participant, timeSeries); - } + return new TimeSeriesMappingSource.MappingEntry(entity, timeSeries); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java index 81c382f9e..da5e7b9fc 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java @@ -80,8 +80,8 @@ private Try createMappingEntry( // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** Class to represent one entry within the entity to time series mapping */ - public abstract static class MappingEntry implements InputEntity { - protected final UUID entity; + public static class MappingEntry implements InputEntity { + private final UUID entity; private final UUID timeSeries; public MappingEntry(UUID entity, UUID timeSeries) { @@ -116,43 +116,4 @@ public String toString() { return "MappingEntry{" + "entity=" + entity + ", timeSeries=" + timeSeries + '}'; } } - - /** Class to represent one entry within the entity to time series mapping */ - public static class EntityMappingEntry extends MappingEntry { - - public EntityMappingEntry(UUID entity, UUID timeSeries) { - super(entity, timeSeries); - } - - @Override - public String toString() { - return "EntityMappingEntry{" + "entity=" + entity + ", timeSeries=" + getTimeSeries() + '}'; - } - } - - /** Class to represent one entry within the participant to time series mapping */ - public static class ParticipantMappingEntry extends MappingEntry { - - public ParticipantMappingEntry(UUID participant, UUID timeSeries) { - super(participant, timeSeries); - } - - /** - * Returns the {@link UUID} of the {@link - * edu.ie3.datamodel.models.input.system.SystemParticipantInput}. - */ - public UUID getParticipant() { - return entity; - } - - @Override - public String toString() { - return "ParticipantMappingEntry{" - + "participant=" - + entity - + ", timeSeries=" - + getTimeSeries() - + '}'; - } - } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index b0fd79168..de99a0067 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -627,7 +627,7 @@ class InputEntityProcessorTest extends Specification { def "The InputEntityProcessor should serialize a provided MappingEntry correctly"() { given: def processor = new InputEntityProcessor(TimeSeriesMappingSource.MappingEntry) - def validResult = new TimeSeriesMappingSource.ParticipantMappingEntry(UUID.fromString("7eb7b296-f4c4-4020-acf3-e865453b5dbd"), UUID.fromString("bc581c6c-3044-48a1-aea1-5b2cb1370356")) + def validResult = new TimeSeriesMappingSource.MappingEntry(UUID.fromString("7eb7b296-f4c4-4020-acf3-e865453b5dbd"), UUID.fromString("bc581c6c-3044-48a1-aea1-5b2cb1370356")) Map expectedResults = [ "entity": "7eb7b296-f4c4-4020-acf3-e865453b5dbd", diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index ef5027514..95b2f0472 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -169,8 +169,8 @@ class UniquenessValidationUtilsTest extends Specification { given: UUID timeSeries = UUID.randomUUID() Set uniqueEntries = [ - new TimeSeriesMappingSource.ParticipantMappingEntry(UUID.randomUUID(), timeSeries), - new TimeSeriesMappingSource.ParticipantMappingEntry(UUID.randomUUID(), timeSeries), + new TimeSeriesMappingSource.MappingEntry(UUID.randomUUID(), timeSeries), + new TimeSeriesMappingSource.MappingEntry(UUID.randomUUID(), timeSeries), ] when: @@ -184,27 +184,18 @@ class UniquenessValidationUtilsTest extends Specification { given: UUID participant = UUID.fromString("1f25eea2-20eb-4b6b-8f05-bdbb0e851e65") - Set uniqueParticipantEntries = [ - new TimeSeriesMappingSource.ParticipantMappingEntry(participant, UUID.randomUUID()), - new TimeSeriesMappingSource.ParticipantMappingEntry(participant, UUID.randomUUID()), - ] - Set uniqueEntityEntries = [ - new TimeSeriesMappingSource.EntityMappingEntry(participant, UUID.randomUUID()), - new TimeSeriesMappingSource.EntityMappingEntry(participant, UUID.randomUUID()), + new TimeSeriesMappingSource.MappingEntry(participant, UUID.randomUUID()), + new TimeSeriesMappingSource.MappingEntry(participant, UUID.randomUUID()), ] when: - def participantDuplicate = Try.ofVoid(() -> checkMappingEntryUniqueness(uniqueParticipantEntries), DuplicateEntitiesException) def entityDuplicate = Try.ofVoid(() -> checkMappingEntryUniqueness(uniqueEntityEntries), DuplicateEntitiesException) then: - participantDuplicate.failure - participantDuplicate.exception.get().message == "'ParticipantMappingEntry' entities with duplicated UUID key, but different field values found! " + - "Affected primary keys: [1f25eea2-20eb-4b6b-8f05-bdbb0e851e65]" entityDuplicate.failure - entityDuplicate.exception.get().message == "'EntityMappingEntry' entities with duplicated UUID key, but different field values found! " + + entityDuplicate.exception.get().message == "'MappingEntry' entities with duplicated UUID key, but different field values found! " + "Affected primary keys: [1f25eea2-20eb-4b6b-8f05-bdbb0e851e65]" } diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_mapping.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_mapping.sql index b3921f442..260fa5224 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_mapping.sql +++ b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/time_series_mapping.sql @@ -1,15 +1,14 @@ CREATE TABLE public.time_series_mapping ( - uuid uuid PRIMARY KEY, - participant uuid, + entity uuid PRIMARY KEY, time_series uuid ) WITHOUT OIDS TABLESPACE pg_default; INSERT INTO - public.time_series_mapping (uuid, participant, time_series) + public.time_series_mapping (entity, time_series) VALUES -('58167015-d760-4f90-8109-f2ebd94cda91', 'b86e95b0-e579-4a80-a534-37c7a470a409', '9185b8c1-86ba-4a16-8dea-5ac898e8caa5'), -('9a9ebfda-dc26-4a40-b9ca-25cd42f6cc3f', 'c7ebcc6c-55fc-479b-aa6b-6fa82ccac6b8', '3fbfaa97-cff4-46d4-95ba-a95665e87c26'), -('9c1c53ea-e575-41a2-a373-a8b2d3ed2c39', '90a96daa-012b-4fea-82dc-24ba7a7ab81c', '3fbfaa97-cff4-46d4-95ba-a95665e87c26'); +('b86e95b0-e579-4a80-a534-37c7a470a409', '9185b8c1-86ba-4a16-8dea-5ac898e8caa5'), +('c7ebcc6c-55fc-479b-aa6b-6fa82ccac6b8', '3fbfaa97-cff4-46d4-95ba-a95665e87c26'), +('90a96daa-012b-4fea-82dc-24ba7a7ab81c', '3fbfaa97-cff4-46d4-95ba-a95665e87c26'); From 1cd65b3c95954cf9e31db652dc0208dadb252e76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 05:50:14 +0000 Subject: [PATCH 170/310] Bump commons-io:commons-io from 2.17.0 to 2.18.0 (#1181) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5435625cf..79900d2c2 100644 --- a/build.gradle +++ b/build.gradle @@ -93,7 +93,7 @@ dependencies { implementation 'com.couchbase.client:java-client:3.7.5' runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime - implementation 'commons-io:commons-io:2.17.0' // I/O functionalities + implementation 'commons-io:commons-io:2.18.0' // I/O functionalities implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress implementation 'org.apache.commons:commons-compress:1.27.1' // I/O functionalities } From 90be855944233ab874a58957faad4de870ae1da8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 20 Nov 2024 08:57:16 +0100 Subject: [PATCH 171/310] Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key. --- CHANGELOG.md | 1 + .../datamodel/io/source/TimeSeriesSource.java | 4 +- .../io/source/csv/CsvTimeSeriesSource.java | 9 ++++ .../io/source/sql/SqlTimeSeriesSource.java | 47 +++++++++++++++---- .../individual/IndividualTimeSeries.java | 4 +- .../repetitive/LoadProfileInput.java | 4 +- .../source/csv/CsvTimeSeriesSourceIT.groovy | 20 ++++++++ .../source/sql/SqlTimeSeriesSourceIT.groovy | 10 ++++ .../IndividualTimeSeriesTest.groovy | 4 +- 9 files changed, 88 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c6c590e8..e53f08eba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Enhance `TimeSeriesSource` with method to retrieve all time keys after a given key [#543](https://github.com/ie3-institute/PowerSystemDataModel/issues/543) - Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) +- Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) ### Fixed diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java index a9ade054e..2a80e0a78 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java @@ -50,7 +50,9 @@ protected Try, FactoryException> createTimeBasedValue( public abstract IndividualTimeSeries getTimeSeries(ClosedInterval timeInterval) throws SourceException; - public abstract Optional getValue(ZonedDateTime time) throws SourceException; + public abstract Optional getValue(ZonedDateTime time); + + public abstract Optional> getPreviousTimeBasedValue(ZonedDateTime time); /** * Method to return all time keys after a given timestamp. diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 1bbab427a..0210b7dde 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -128,6 +128,15 @@ public Optional getValue(ZonedDateTime time) { return timeSeries.getValue(time); } + @Override + public Optional> getPreviousTimeBasedValue(ZonedDateTime time) { + return timeSeries.getPreviousTimeBasedValue(time); + } + + public Optional> getNextTimeBasedValue(ZonedDateTime time) { + return timeSeries.getNextTimeBasedValue(time); + } + @Override public List getTimeKeysAfter(ZonedDateTime time) { return timeSeries.getTimeKeysAfter(time); diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java index c75e8b949..8743869b2 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java @@ -48,6 +48,7 @@ public class SqlTimeSeriesSource extends TimeSeriesSource { private final String queryTimeInterval; private final String queryTimeKeysAfter; + private final String queryForValueBefore; private final String queryTime; public SqlTimeSeriesSource( @@ -63,15 +64,16 @@ public SqlTimeSeriesSource( final ColumnScheme columnScheme = ColumnScheme.parse(valueClass).orElseThrow(); this.tableName = sqlDataSource.databaseNamingStrategy.getTimeSeriesEntityName(columnScheme); + String schemaName = sqlDataSource.schemaName; + String dbTimeColumnName = sqlDataSource.getDbColumnName(factory.getTimeFieldString(), tableName); - this.queryFull = createQueryFull(sqlDataSource.schemaName, tableName); - this.queryTimeInterval = - createQueryForTimeInterval(sqlDataSource.schemaName, tableName, dbTimeColumnName); - this.queryTimeKeysAfter = - createQueryForTimeKeysAfter(sqlDataSource.schemaName, tableName, dbTimeColumnName); - this.queryTime = createQueryForTime(sqlDataSource.schemaName, tableName, dbTimeColumnName); + this.queryFull = createQueryFull(schemaName, tableName); + this.queryTimeInterval = createQueryForTimeInterval(schemaName, tableName, dbTimeColumnName); + this.queryTimeKeysAfter = createQueryForTimeKeysAfter(schemaName, tableName, dbTimeColumnName); + this.queryForValueBefore = createQueryForValueBefore(schemaName, tableName, dbTimeColumnName); + this.queryTime = createQueryForTime(schemaName, tableName, dbTimeColumnName); } /** @@ -179,6 +181,14 @@ public Optional getValue(ZonedDateTime time) { return Optional.of(timeBasedValues.stream().toList().get(0).getValue()); } + @Override + public Optional> getPreviousTimeBasedValue(ZonedDateTime time) { + return getTimeBasedValueSet( + queryForValueBefore, ps -> ps.setTimestamp(1, Timestamp.from(time.toInstant()))) + .stream() + .max(TimeBasedValue::compareTo); + } + @Override public List getTimeKeysAfter(ZonedDateTime time) { return dataSource @@ -278,8 +288,29 @@ private String createQueryForTimeKeysAfter( } /** - * Creates a basic query to retrieve an entry for the given time series uuid and time with the - * following pattern:
    + * Creates a base query to retrieve all time keys after a given time for given time series with + * the following pattern:
    + * {@code WHERE time_series = $timeSeriesUuid AND

    This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link DomesticHotWaterStorageResult} which has to + * be checked manually, as {@link DomesticHotWaterStorageResult#equals(Object)} is NOT restricted + * by the uuid of {@link DomesticHotWaterStorageResult}. + * + * @return a set of object and uuid unique {@link DomesticHotWaterStorageResult} entities + */ + public Set getDomesticHotWaterStorageResult() + throws SourceException { + return getResultEntities(DomesticHotWaterStorageResult.class, thermalResultFactory); + } + /** * Returns a unique set of {@link ThermalHouseResult} instances. * From d68ab7d18c4ed6e9e9470ef3dea2e9c03e89b8d6 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 30 Dec 2024 18:28:31 +0100 Subject: [PATCH 199/310] adapt getter for fields of DomesticHotWaterStorageResult of ThermalResultFactory --- .../ie3/datamodel/io/factory/result/ThermalResultFactory.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java index 8bb06ba54..3b588a1b1 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java @@ -57,6 +57,8 @@ protected List> getFields(Class entityClass) { minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT, INDOOR_TEMPERATURE); } else if (entityClass.equals(CylindricalStorageResult.class)) { minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT, ENERGY, FILL_LEVEL); + } else if (entityClass.equals(DomesticHotWaterStorageResult.class)) { + minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT, ENERGY, FILL_LEVEL); } return List.of(minConstructorParams); From 24d9278629bd037f71b0b27ab171023583560932 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 30 Dec 2024 19:15:30 +0100 Subject: [PATCH 200/310] fix meter squared --- .../validation/SystemParticipantValidationUtilsTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/SystemParticipantValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/SystemParticipantValidationUtilsTest.groovy index ec8d08117..82207f5b9 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/SystemParticipantValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/SystemParticipantValidationUtilsTest.groovy @@ -454,7 +454,7 @@ class SystemParticipantValidationUtilsTest extends Specification { where: invalidWecType || expectedException new WecTypeInput(uuid, id, capex, opex, sRated, cosPhiRated, wecCharacteristic, Quantities.getQuantity(110d, EFFICIENCY), rotorArea, hubHeight) || new InvalidEntityException("Efficiency of the converter of WecTypeInput must be between 0% and 100%", invalidWecType) - new WecTypeInput(uuid, id, capex, opex, sRated, cosPhiRated, wecCharacteristic, etaConv, Quantities.getQuantity(-10, ROTOR_AREA), Quantities.getQuantity(-200, HUB_HEIGHT)) || new InvalidEntityException("The following quantities have to be zero or positive: -10 m², -200 m", invalidWecType) + new WecTypeInput(uuid, id, capex, opex, sRated, cosPhiRated, wecCharacteristic, etaConv, Quantities.getQuantity(-10, ROTOR_AREA), Quantities.getQuantity(-200, HUB_HEIGHT)) || new InvalidEntityException("The following quantities have to be zero or positive: -10 ㎡, -200 m", invalidWecType) } def "SystemParticipantValidationUtils.checkEvcs() recognizes all potential errors for a evcs"() { From 83beee8365a603f82af08a9afef82e7ed72ca57b Mon Sep 17 00:00:00 2001 From: Marvin Heintze Date: Fri, 3 Jan 2025 20:14:34 +0100 Subject: [PATCH 201/310] removed dsm variable --- .../input/participant/LoadInputFactory.java | 6 ++-- .../models/input/system/LoadInput.java | 33 ++----------------- 2 files changed, 4 insertions(+), 35 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java index 6c1d295be..c66cec08f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java @@ -26,7 +26,6 @@ public class LoadInputFactory private static final Logger logger = LoggerFactory.getLogger(LoadInputFactory.class); private static final String LOAD_PROFILE = "loadProfile"; - private static final String DSM = "dsm"; private static final String E_CONS_ANNUAL = "eConsAnnual"; private static final String S_RATED = "sRated"; private static final String COS_PHI = "cosPhiRated"; @@ -37,7 +36,7 @@ public LoadInputFactory() { @Override protected String[] getAdditionalFields() { - return new String[] {LOAD_PROFILE, DSM, E_CONS_ANNUAL, S_RATED, COS_PHI}; + return new String[] {LOAD_PROFILE, E_CONS_ANNUAL, S_RATED, COS_PHI}; } @Override @@ -60,7 +59,7 @@ protected LoadInput buildModel( loadProfile = LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE; } final EmInput em = data.getEm().orElse(null); - final boolean dsm = data.getBoolean(DSM); + final ComparableQuantity eConsAnnual = data.getQuantity(E_CONS_ANNUAL, StandardUnits.ENERGY_IN); final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); @@ -75,7 +74,6 @@ protected LoadInput buildModel( qCharacteristics, em, loadProfile, - dsm, eConsAnnual, sRated, cosPhi); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java index 81df5ea95..001bd712f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java @@ -30,8 +30,6 @@ public class LoadInput extends SystemParticipantInput { * model */ private final LoadProfile loadProfile; - /** True, if demand side management is activated for this load */ - private final boolean dsm; /** Annually consumed energy (typically in kWh) */ private final ComparableQuantity eConsAnnual; /** Active Power (typically in kVA) */ @@ -50,7 +48,6 @@ public class LoadInput extends SystemParticipantInput { * @param qCharacteristics Description of a reactive power characteristic * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfile Load profile to use for this model - * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) * @param sRated Rated apparent power (in kVA) * @param cosPhiRated Rated power factor @@ -64,13 +61,11 @@ public LoadInput( ReactivePowerCharacteristic qCharacteristics, EmInput em, LoadProfile loadProfile, - boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) { super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.loadProfile = loadProfile; - this.dsm = dsm; this.eConsAnnual = eConsAnnual.to(StandardUnits.ENERGY_IN); this.sRated = sRated.to(StandardUnits.S_RATED); this.cosPhiRated = cosPhiRated; @@ -89,7 +84,6 @@ public LoadInput( * @param loadProfileKey Load profile key corresponding to {@link * edu.ie3.datamodel.models.profile.BdewStandardLoadProfile} or {@link * edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile} - * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) * @param sRated Rated apparent power (in kVA) * @param cosPhiRated Rated power factor @@ -103,7 +97,6 @@ public LoadInput( ReactivePowerCharacteristic qCharacteristics, EmInput em, String loadProfileKey, - boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) @@ -118,7 +111,6 @@ public LoadInput( qCharacteristics, em, LoadProfile.parse(loadProfileKey), - dsm, eConsAnnual, sRated, cosPhiRated); @@ -133,7 +125,6 @@ public LoadInput( * @param qCharacteristics Description of a reactive power characteristic * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfile Standard load profile to use for this model - * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) * @param sRated Rated apparent power (in kVA) * @param cosPhiRated Rated power factor @@ -145,13 +136,11 @@ public LoadInput( ReactivePowerCharacteristic qCharacteristics, EmInput em, LoadProfile loadProfile, - boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) { super(uuid, id, node, qCharacteristics, em); this.loadProfile = loadProfile; - this.dsm = dsm; this.eConsAnnual = eConsAnnual.to(StandardUnits.ENERGY_IN); this.sRated = sRated.to(StandardUnits.S_RATED); this.cosPhiRated = cosPhiRated; @@ -168,7 +157,6 @@ public LoadInput( * @param loadProfileKey load profile key corresponding to {@link * edu.ie3.datamodel.models.profile.BdewStandardLoadProfile} or {@link * edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile} - * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) * @param sRated Rated apparent power (in kVA) * @param cosPhiRated Rated power factor @@ -180,7 +168,6 @@ public LoadInput( ReactivePowerCharacteristic qCharacteristics, EmInput em, String loadProfileKey, - boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) @@ -192,7 +179,6 @@ public LoadInput( qCharacteristics, em, LoadProfile.parse(loadProfileKey), - dsm, eConsAnnual, sRated, cosPhiRated); @@ -202,10 +188,6 @@ public LoadProfile getLoadProfile() { return loadProfile; } - public boolean isDsm() { - return dsm; - } - public ComparableQuantity geteConsAnnual() { return eConsAnnual; } @@ -227,8 +209,7 @@ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof LoadInput loadInput)) return false; if (!super.equals(o)) return false; - return dsm == loadInput.dsm - && Double.compare(loadInput.cosPhiRated, cosPhiRated) == 0 + return Double.compare(loadInput.cosPhiRated, cosPhiRated) == 0 && eConsAnnual.equals(loadInput.eConsAnnual) && loadProfile.equals(loadInput.loadProfile) && sRated.equals(loadInput.sRated); @@ -236,7 +217,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(super.hashCode(), dsm, eConsAnnual, sRated, cosPhiRated); + return Objects.hash(super.hashCode(), eConsAnnual, sRated, cosPhiRated); } @Override @@ -256,8 +237,6 @@ public String toString() { + getqCharacteristics() + "', em=" + getControllingEm() - + ", dsm=" - + dsm + ", eConsAnnual=" + eConsAnnual + ", sRated=" @@ -278,7 +257,6 @@ public static class LoadInputCopyBuilder extends SystemParticipantInputCopyBuilder { private LoadProfile loadProfile; - private boolean dsm; private ComparableQuantity eConsAnnual; private ComparableQuantity sRated; private double cosPhiRated; @@ -286,7 +264,6 @@ public static class LoadInputCopyBuilder private LoadInputCopyBuilder(LoadInput entity) { super(entity); this.loadProfile = entity.getLoadProfile(); - this.dsm = entity.isDsm(); this.eConsAnnual = entity.geteConsAnnual(); this.sRated = entity.getsRated(); this.cosPhiRated = entity.getCosPhiRated(); @@ -297,11 +274,6 @@ public LoadInputCopyBuilder loadprofile(StandardLoadProfile standardLoadProfile) return this; } - public LoadInputCopyBuilder dsm(boolean dsm) { - this.dsm = dsm; - return this; - } - public LoadInputCopyBuilder eConsAnnual(ComparableQuantity eConsAnnual) { this.eConsAnnual = eConsAnnual; return this; @@ -335,7 +307,6 @@ public LoadInput build() { getqCharacteristics(), getEm(), loadProfile, - dsm, eConsAnnual, sRated, cosPhiRated); From 13a4d95c291e163c6819403c3e7c8320d65007f0 Mon Sep 17 00:00:00 2001 From: Marvin Heintze Date: Fri, 3 Jan 2025 21:31:08 +0100 Subject: [PATCH 202/310] removed dsm variable from tests and documentation --- docs/readthedocs/models/input/participant/load.md | 4 ---- docs/uml/main/input/SystemDatamodelConcept.puml | 1 - .../io/factory/input/participant/LoadInputFactoryTest.groovy | 2 -- .../io/processor/input/InputEntityProcessorTest.groovy | 1 - .../edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy | 1 - .../ie3/datamodel/models/input/system/LoadInputTest.groovy | 4 +--- .../edu/ie3/datamodel/io/sink/_sql/input_entities.sql | 1 - .../ie3/datamodel/io/source/csv/_joint_grid/load_input.csv | 2 +- .../ie3/datamodel/io/source/csv/_participants/load_input.csv | 2 +- 9 files changed, 3 insertions(+), 15 deletions(-) diff --git a/docs/readthedocs/models/input/participant/load.md b/docs/readthedocs/models/input/participant/load.md index 782e3c495..4ad7f4667 100644 --- a/docs/readthedocs/models/input/participant/load.md +++ b/docs/readthedocs/models/input/participant/load.md @@ -44,10 +44,6 @@ Model of (mainly) domestic loads. - - [Load profile](#load-lp) as model behaviour - * - dsm - - - - Whether the load is able to follow demand side management signals - * - eConsAnnual - kWh - Annual energy consumption diff --git a/docs/uml/main/input/SystemDatamodelConcept.puml b/docs/uml/main/input/SystemDatamodelConcept.puml index 613ee4c59..7f86d7623 100644 --- a/docs/uml/main/input/SystemDatamodelConcept.puml +++ b/docs/uml/main/input/SystemDatamodelConcept.puml @@ -218,7 +218,6 @@ package models { class LoadInput { - standardLoadProfile: StandardLoadProfile - - dsm: Boolean - sRated: ComparableQuantity [kVA] - eConsAnnual: ComparableQuantity [kWh] - cosPhiRated: double diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy index c429ed541..d3eaef18a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy @@ -47,7 +47,6 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { "id" : "TestID", "qcharacteristics" : "cosPhiFixed:{(0.0,1.0)}", "loadprofile" : profileKey, - "dsm" : "true", "econsannual" : "3", "srated" : "4", "cosphirated" : "5" @@ -72,7 +71,6 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { } assert controllingEm == Optional.of(emUnit) assert loadProfile == profile - assert dsm assert eConsAnnual == getQuant(parameter["econsannual"], StandardUnits.ENERGY_IN) assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index 0a421286b..2dece01b2 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -239,7 +239,6 @@ class InputEntityProcessorTest extends Specification { LoadInput | SystemParticipantTestData.loadInput || [ "uuid" : SystemParticipantTestData.loadInput.uuid.toString(), "cosPhiRated" : SystemParticipantTestData.loadInput.cosPhiRated.toString(), - "dsm" : SystemParticipantTestData.loadInput.dsm.toString(), "eConsAnnual" : SystemParticipantTestData.loadInput.eConsAnnual.getValue().doubleValue().toString(), "id" : SystemParticipantTestData.loadInput.id, "node" : SystemParticipantTestData.loadInput.node.uuid.toString(), diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index 8194241e0..9e0ca10cd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -93,7 +93,6 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { "q_characteristics", "e_cons_annual", "operator", - "dsm", "em" ] as Set } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy index 710949a49..8694431b0 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy @@ -23,7 +23,7 @@ class LoadInputTest extends Specification { def loadInput = SystemParticipantTestData.loadInput when: - def alteredUnit = loadInput.copy().loadprofile(BdewStandardLoadProfile.G0).dsm(true) + def alteredUnit = loadInput.copy().loadprofile(BdewStandardLoadProfile.G0) .eConsAnnual(Quantities.getQuantity(6000, KILOWATTHOUR)).sRated(Quantities.getQuantity(0d, KILOVOLTAMPERE)) .cosPhiRated(0.8).node(GridTestData.nodeG) .qCharacteristics(CosPhiFixed.CONSTANT_CHARACTERISTIC).build() @@ -35,7 +35,6 @@ class LoadInputTest extends Specification { assert operator == loadInput.operator assert id == loadInput.id assert loadProfile == BdewStandardLoadProfile.G0 - assert dsm assert node == GridTestData.nodeG assert qCharacteristics == CosPhiFixed.CONSTANT_CHARACTERISTIC assert eConsAnnual == Quantities.getQuantity(6000, KILOWATTHOUR) @@ -59,7 +58,6 @@ class LoadInputTest extends Specification { assert operator == loadInput.operator assert id == loadInput.id assert loadProfile == loadInput.loadProfile - assert dsm == loadInput.dsm assert node == loadInput.node assert qCharacteristics == loadInput.qCharacteristics assert eConsAnnual == loadInput.eConsAnnual * 2d diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index 9b63f3fba..6018e6f7c 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -157,7 +157,6 @@ CREATE TABLE public.load_input uuid UUID PRIMARY KEY, controlling_em UUID NOT NULL, cos_phi_rated TEXT NOT NULL, - dsm BOOL NOT NULL, e_cons_annual DOUBLE PRECISION NOT NULL, id TEXT NOT NULL, load_profile TEXT NOT NULL, diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv index 3d0b9e810..17632129a 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv @@ -1,4 +1,4 @@ -"uuid","cos_phi_rated","dsm","e_cons_annual","id","node","operates_from","operates_until","operator","q_characteristics","s_rated","load_profile" +"uuid","cos_phi_rated","e_cons_annual","id","node","operates_from","operates_until","operator","q_characteristics","s_rated","load_profile" c2402412-97fa-4ca4-aa66-e6e04d010001,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(36),ca3391eb-ca94-4945-ac72-e116f396f82c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 fa8ef266-5b15-4fdd-a145-71ba95e3463d,0.949999988079071,false,4000.0,NS_NET146_L_F3_(17),0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 4dd0785a-482c-47e3-bb82-e315083684d1,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(6),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv index 8fc693e31..dba0c338a 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv @@ -1,2 +1,2 @@ -uuid,cos_phi_rated,dsm,e_cons_annual,id,node,operates_from,operates_until,operator,q_characteristics,s_rated,load_profile,em +uuid,cos_phi_rated,e_cons_annual,id,node,operates_from,operates_until,operator,q_characteristics,s_rated,load_profile,em eaf77f7e-9001-479f-94ca-7fb657766f5f,0.95,false,4000.0,test_loadInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,h0,977157f4-25e5-4c72-bf34-440edc778792 From 0017953ebd3545890944c3b6e084739d8294ee7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 08:33:55 +0000 Subject: [PATCH 203/310] Bump commons-codec:commons-codec from 1.17.1 to 1.17.2 (#1204) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ade08d913..08670cfe3 100644 --- a/build.gradle +++ b/build.gradle @@ -94,7 +94,7 @@ dependencies { runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.18.0' // I/O functionalities - implementation 'commons-codec:commons-codec:1.17.1' // needed by commons-compress + implementation 'commons-codec:commons-codec:1.17.2' // needed by commons-compress implementation 'org.apache.commons:commons-compress:1.27.1' // I/O functionalities } From 9f4d5aa3ac5262c3ec5f115dfcdfac7b0a19fc21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 09:33:30 +0000 Subject: [PATCH 204/310] Bump com.diffplug.spotless from 6.25.0 to 7.0.0 (#1203) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 08670cfe3..acf907cd1 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'maven-publish' id 'signing' id 'pmd' // code check, working on source code - id 'com.diffplug.spotless' version '6.25.0' //code format + id 'com.diffplug.spotless' version '7.0.0' //code format id 'com.github.spotbugs' version '6.0.27' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation From 279a077b0a30d195ed94a780c7bb6a9753991158 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 06:31:53 +0000 Subject: [PATCH 205/310] Bump com.diffplug.spotless from 7.0.0 to 7.0.1 (#1205) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 615c7e646..bde952869 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'maven-publish' id 'signing' id 'pmd' // code check, working on source code - id 'com.diffplug.spotless' version '7.0.0' //code format + id 'com.diffplug.spotless' version '7.0.1' //code format id 'com.github.spotbugs' version '6.0.27' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation From 014c9513e4114a7e411b512500781e220f785326 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Jan 2025 12:02:51 +0000 Subject: [PATCH 206/310] Bump com.github.spotbugs from 6.0.27 to 6.0.28 (#1208) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bde952869..c4d6379e7 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '7.0.1' //code format - id 'com.github.spotbugs' version '6.0.27' // code check, working on byte code + id 'com.github.spotbugs' version '6.0.28' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From 96055d71972a086951016d863282c26b622f1316 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:41:03 +0000 Subject: [PATCH 207/310] Bump com.github.spotbugs from 6.0.28 to 6.1.0 (#1209) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c4d6379e7..a22c767b8 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '7.0.1' //code format - id 'com.github.spotbugs' version '6.0.28' // code check, working on byte code + id 'com.github.spotbugs' version '6.1.0' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From ea0c4c01f3df59fd88c2fd1a14d8b440a75ac22d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 09:28:35 +0000 Subject: [PATCH 208/310] Bump com.couchbase.client:java-client from 3.7.6 to 3.7.7 (#1210) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a22c767b8..c8f4345d7 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.6' + implementation 'com.couchbase.client:java-client:3.7.7' runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.18.0' // I/O functionalities From 30945507fd113c2d47740d77ef446472d459bd19 Mon Sep 17 00:00:00 2001 From: Marvin Heintze Date: Tue, 14 Jan 2025 14:30:26 +0100 Subject: [PATCH 209/310] loadInputs fixed in tests --- .../ie3/test/common/SampleJointGrid.groovy | 2 - .../common/SystemParticipantTestData.groovy | 1 - .../io/source/csv/_joint_grid/load_input.csv | 992 +++++++++--------- .../source/csv/_participants/load_input.csv | 2 +- 4 files changed, 497 insertions(+), 500 deletions(-) diff --git a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy index 7ae270243..f3d87989d 100644 --- a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy +++ b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy @@ -92,7 +92,6 @@ class SampleJointGrid extends SystemParticipantTestData { cosPhiFixed, emInput, standardLoadProfile, - false, eConsAnnual, sRated, cosPhiRated) @@ -107,7 +106,6 @@ class SampleJointGrid extends SystemParticipantTestData { cosPhiFixed, emInput, standardLoadProfile, - false, eConsAnnual, sRated, cosPhiRated) diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index e77913cee..6953bb55e 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -264,7 +264,6 @@ class SystemParticipantTestData { cosPhiFixed, emInput, standardLoadProfile, - false, eConsAnnual, sRated, cosPhiRated diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv index 17632129a..5c2ebd341 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv @@ -1,497 +1,497 @@ "uuid","cos_phi_rated","e_cons_annual","id","node","operates_from","operates_until","operator","q_characteristics","s_rated","load_profile" -c2402412-97fa-4ca4-aa66-e6e04d010001,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(36),ca3391eb-ca94-4945-ac72-e116f396f82c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -fa8ef266-5b15-4fdd-a145-71ba95e3463d,0.949999988079071,false,4000.0,NS_NET146_L_F3_(17),0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4dd0785a-482c-47e3-bb82-e315083684d1,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(6),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9b027eb7-abfa-43ef-8eae-b20b47a631e6,0.949999988079071,false,4000.0,NS_NET146_L_F3_(18),85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7bbb2c62-36f7-4aab-8802-e3ddf478adf2,0.949999988079071,false,4000.0,NS_NET146_L_F3_(14),3dec12fd-3dc6-481d-be05-8df9df7f0c5d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ec035312-7214-4060-a502-71cbe819f32a,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(1),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -40ddb9cf-46f1-4ee6-8feb-432affbc95bf,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(1),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3b9ae1ad-11e5-4fb5-ba03-9027e39c33b4,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(8),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -16cd0d9b-bbaa-4d71-ad87-b8e834cf478d,0.9700000286102295,false,4000.0,MS2_Last_01,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -c806a93a-5f1c-47ba-9c67-31a86ae2658c,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(39),60173008-809d-4d8f-b06a-3c4a838dd989,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -5b821f32-64d4-436f-9840-40d04872f20f,0.949999988079071,false,4000.0,NS_NET126_L_F3_(12),eb125953-31d3-4207-adf7-aba3a3790d6f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -dcaeda6e-2dfc-4b53-9c25-cf51d486bb34,0.949999988079071,false,4000.0,NS_NET126_L_F2_(21),1dee13af-e638-4858-9c69-0069190cd577,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c78b87bd-855b-4741-9e82-c9d814dc5a7c,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(7),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -aef6783d-889c-48a2-bdf5-7a9086a73548,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(7),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9cc70cc7-642f-4fb1-9782-20a446368645,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(1),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2de16d4b-e4e0-41e0-ae33-105930964fcd,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(31),80d8252b-045f-471a-9638-416ed3f86120,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -07ac3307-90a9-4d74-9434-b977741a8858,0.949999988079071,false,4000.0,NS_NET126_L_F4_(4),a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -590108ac-416d-44fe-b574-4069cea1dbb1,0.9700000286102295,false,4000.0,MS3_Last_04,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -df1ebc6d-1252-4496-98bc-50f6ff46a085,0.949999988079071,false,4000.0,NS_NET126_L_F1_(18),2f64bf67-cee9-44bb-8c13-ff96878932af,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a850c129-beef-48d6-9543-1e217a5349ce,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(8),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ceec9e98-5303-4df3-99e8-592509c19d74,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(7),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -984470e3-f117-4b8c-932f-caeacf10ff2c,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(2),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -94ef12cc-d3bc-42b1-b8b0-6177b93bb25c,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(4),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e87a4990-0f33-44dc-bb98-ca7dd38e2493,0.949999988079071,false,4000.0,NS_NET146_L_F1_(18),2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5fa8b3e6-ed79-4804-997b-4c6eb2c7727b,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(5),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -716dc985-7e6d-4681-b4d8-aa9c039a347e,0.9700000286102295,false,4000.0,MS1_Last_07,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -c9576364-4a47-450d-a25d-864dd12ef7fa,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(3),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a8f50827-29eb-4c27-a60c-fb74c3a5f3fd,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(2),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9c4f5e8d-b780-4e31-9bb0-37e975066beb,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(8),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3d297678-497c-4620-ad5e-1e70cea8119d,0.949999988079071,false,4000.0,NS_NET146_L_F3_(5),ce71377d-63ea-462a-9290-67e51946a098,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -895edb06-282c-4965-acab-36c8b86f8f65,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(5),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8d84639d-d746-49c5-bc46-33a2aae666e7,0.949999988079071,false,4000.0,NS_NET126_L_F1_(16),4f78fe6d-3cb2-4d99-8c67-4f14cb626813,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8cd07c7c-1264-4141-b90e-e2b6f39c44be,0.949999988079071,false,4000.0,NS_NET126_L_F4_(9),119d270a-ff22-4fdb-8214-cb5b336790bf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0c5d8e98-e059-4768-be56-73e0e8914092,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(3),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -06747e73-c108-40d5-8ce6-6538e38b4ef2,0.949999988079071,false,4000.0,NS_NET126_L_F1_(6),99e26ef8-75e2-46f3-aafc-6287bf5e3905,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5d09da2a-e37c-4cca-93fd-0bf61918a2b2,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(4),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7ce95168-5af2-4274-943d-601176146ce8,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(8),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -188c5841-af7d-48ea-95ac-7178dc7407c9,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(8),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1d96cdde-d9d3-4d47-b3a4-60474b9caa92,0.9700000286102295,false,4000.0,MS2_Last_05,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -130b7cb2-f379-4d6c-b71d-404d87260133,0.949999988079071,false,4000.0,NS_NET146_L_F2_(19),636dec7c-4242-46e8-b7ae-db7e5a28c39c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b4b07036-0d49-4f8f-9194-0181e11d0470,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(7),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0442c234-22f8-4022-8daa-2f191e4a6bf3,0.949999988079071,false,4000.0,NS_NET146_L_F1_(24),205fcee1-928c-4374-950c-34575f07fa49,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -29a47779-6c11-490f-a0b2-e33c6c7a06b3,0.949999988079071,false,4000.0,NS_NET126_L_F3_(25),1bf26b4d-03cc-4490-8c33-d3db8597d807,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2b20b17c-774b-4b41-a1e8-ef9d8f39b0e3,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(8),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -70fcdefd-49c1-455f-9ceb-013dcbf26887,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(1),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5d842fa6-eb7a-4f88-8dd3-f7eac01afaad,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(29),867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -d7a1b657-6d15-45c7-8d04-d2eef97429b0,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(6),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e17786aa-4cf5-46d6-ad37-96f4d4502b1f,0.949999988079071,false,4000.0,NS_NET146_L_F4_(8),6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c22e9a91-f522-446d-8dc8-ae3e720a5053,0.949999988079071,false,4000.0,NS_NET126_L_F2_(19),52e15712-2572-442a-b22c-add48af95115,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1ec03866-9e92-43b9-9c13-1501533c8e1e,0.949999988079071,false,4000.0,NS_NET146_L_F1_(26),154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -26bf78c9-48ea-4004-9148-eaee014d6f09,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(7),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0a8bf78c-1e57-44f1-baee-0a8d8383875c,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(1),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5f58fa15-aff8-4a9b-bfc0-8ef690d6dba3,0.949999988079071,false,4000.0,NS_NET146_L_F2_(27),b179c38b-5af0-4304-84b1-1dc03314fd80,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a9f8dce4-b664-4bbd-9e52-c2ca6aa669aa,0.949999988079071,false,4000.0,NS_NET146_L_F1_(19),1f040625-ad1d-409f-bd7e-944c4d805e46,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -e3e2d73e-3dfc-42ae-ad50-fadebdf38868,0.949999988079071,false,4000.0,NS_NET126_L_F1_(26),3802b603-d08d-4031-b7d7-e29734bcc122,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -62800519-5f5f-4081-ae89-9b2b0784a714,0.949999988079071,false,4000.0,NS_NET126_L_F2_(6),9d7038e9-5bcc-4676-bead-46c4f1291ba8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1100ef62-0d33-46df-8ac7-c949d843217c,0.949999988079071,false,4000.0,NS_NET146_L_F3_(22),616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -33cd1941-51f2-425a-8f4d-67e00d0b1876,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(6),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9cff3e75-4374-48fc-a20a-27968427dc1a,0.949999988079071,false,4000.0,NS_NET126_L_F3_(5),f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2485a766-3e5c-4950-b598-0c3b84c747a7,0.949999988079071,false,4000.0,NS_NET146_L_F2_(4),369cffa5-bcee-4489-8193-1d9b10230eca,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5312d132-f5bc-4c34-98ca-16221a0111e2,0.949999988079071,false,4000.0,NS_NET146_L_F3_(2),0b2a3b46-5e43-4879-973e-d8fb96429d8a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8bd4fb73-bc7f-45c9-b1e6-916afd2e7359,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(4),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -05124256-80e0-43cf-a3c5-dc565ef38a07,0.949999988079071,false,4000.0,NS_NET146_L_F3_(27),55caf2ec-a21b-4afd-8830-1e4009cce396,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -283a1252-a774-4b04-bfcf-fe8879065982,0.949999988079071,false,4000.0,HS_NET1_L_S4,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -09fb83df-cd0f-4dca-a5b6-edc18d662e93,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(7),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f4536a0c-33d2-4c57-918c-0ebdf768265a,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(1),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -27f66b7b-f1ac-46e4-9c11-b9ff0d0f2990,0.949999988079071,false,4000.0,NS_NET146_L_F3_(31),b7a5be0d-2662-41b2-99c6-3b8121a75e9e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8df8d6b5-ef51-4901-aaed-bf29c912acd5,0.949999988079071,false,4000.0,NS_NET146_L_F3_(21),a4a44d93-48d6-4b87-8053-87fe0778e75c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d75d06ae-7ac0-491c-87ed-e1bb625e349a,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(3),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3ac82a59-756c-4ead-b34e-02957fc69ec4,0.949999988079071,false,4000.0,NS_NET126_L_F1_(21),14ae9865-cb9b-4518-9f2a-c0fda3455a42,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -96da3f13-3c72-4e9a-b433-a319a9018b40,0.949999988079071,false,4000.0,NS_NET146_L_F2_(21),bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -57d74ff0-f6c4-4932-93c5-9837d101297c,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(2),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a2d372db-d13c-4d3c-a987-ccf4138d43f2,0.9700000286102295,false,4000.0,MS4_Last_07,898d8295-bf35-4079-9374-99b059c2c956,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -182f6157-58ea-4fe2-92a2-90845427fbd0,0.949999988079071,false,4000.0,NS_NET126_L_F3_(13),f29859be-c6e7-4cf9-84d7-239eb98a9e65,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ae603fbc-a262-47ab-bea7-251fd61f3964,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(4),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2e7dda3e-4bd4-4bb7-8e15-260f709ab92e,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(3),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b5c6af22-2d56-4bd1-8235-74db06106eba,0.949999988079071,false,4000.0,NS_NET146_L_F3_(23),ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7f642ba6-1492-4bf6-9857-113c60a18709,0.949999988079071,false,4000.0,NS_NET146_L_F3_(11),e2267696-669b-48e8-b43a-37d0db95011d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -497de722-6c3b-49a5-8f1c-125c76a4a9cd,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(5),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1b64ea94-b338-40aa-92c8-144c7caaa8c2,0.9700000286102295,false,4000.0,MS1_Last_05,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -086208d0-52d4-4198-9f3d-966aa7a5557e,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(7),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fc5139da-5e61-44c5-8843-4f76df7c6e33,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(39),904c7476-5f16-4ec2-9138-7d5e32d38a3b,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -abe6ade3-f1c5-41c0-a850-1292506f3837,0.949999988079071,false,4000.0,NS_NET146_L_F3_(10),4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cbb8c279-5b80-4583-bec3-b878ab0c2755,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(1),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b431628f-bc6f-49ca-9f23-19fe41aadb53,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(2),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -6069eb20-4107-483f-8144-5bd479e32d98,0.949999988079071,false,4000.0,NS_NET126_L_F2_(12),9d02ea80-98d8-4cd0-a635-9104a14a56dd,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c81fa33a-1c21-4646-b43f-b9a93baf04ad,0.949999988079071,false,4000.0,NS_NET146_L_F2_(5),0228ffcd-f6bc-47c8-b26c-fcc0abacd963,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -660e69f8-cba2-45d0-9d0c-f7d5be09451d,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(6),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ee33524a-6c8e-4c12-8b40-7a116e386dbd,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(3),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4c6e6e4f-d4cb-4de3-b406-ff3ec1d50280,0.949999988079071,false,4000.0,NS_NET146_L_F2_(3),0170837a-1876-45f9-a613-666f9991964d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d85bcbda-20fb-481b-bb8d-aead291aa3c1,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(7),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -86754cd3-ba74-49fb-bf3b-5702b4fd5928,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(33),543f7e9f-b9be-486b-b365-2bae79010758,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -4dcec977-6c98-4bd2-b6f2-dc32d9c61cf2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(4),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1a155e7e-9636-4760-a84d-430e293142cc,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(4),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e90dfb70-2372-40d3-9577-01d2145eb59d,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(7),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -85bfce37-1c9a-4e5a-84ec-47faf7b13821,0.9700000286102295,false,4000.0,MS4_Last_02,174fb4b2-4f9e-415c-bfee-d850ef751307,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -16b0791d-eeff-4b12-b1fe-2961bf0fd4c2,0.949999988079071,false,4000.0,NS_NET126_L_F4_(10),857c264a-7072-4bb7-af56-2f01539b2a2e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -aa1ce00f-1a17-4172-9040-9ba15b179a15,0.949999988079071,false,4000.0,NS_NET146_L_F4_(16),9f7599de-c488-46c5-b053-1279a511f7b9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -34671961-b8a8-49f9-a99e-c7b5a33c600e,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(2),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e4f045d6-7f37-4871-b357-621d97b9c2a8,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(8),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -58cb8168-7a34-41e2-9db6-88a67287c5e9,0.949999988079071,false,4000.0,NS_NET146_L_F2_(8),792b505c-87ab-4665-a31d-b6035c5ece70,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -35555bee-2634-45cb-888b-d850767955a6,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(3),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -6322878b-9db6-4481-858b-64dbd00dc091,0.949999988079071,false,4000.0,NS_NET126_L_F3_(26),dc022eec-16b0-4a64-a2f5-498d81aca71e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0cf1f5c4-996b-4422-b61b-b4fbc840d004,0.949999988079071,false,4000.0,NS_NET146_L_F3_(24),773aebe4-fc03-46be-8209-0213e2760a8e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8ef945c1-4586-4755-98a8-bff3ee581620,0.949999988079071,false,4000.0,NS_NET146_L_F1_(7),67c1746c-3af8-403f-983e-1c7c047383df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -61c9c21b-38a5-45b3-8a41-60df0bb698ee,0.949999988079071,false,4000.0,NS_NET146_L_F1_(22),1ee9de9a-0095-4b58-beeb-e56fb908844a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -81e75c16-c8a4-4328-bc97-635049829f57,0.949999988079071,false,4000.0,NS_NET146_L_F2_(24),970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -53ae546b-c94f-4619-a613-3291f26fb78b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(4),f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c73800aa-9f9e-46da-83eb-82a88b2ab502,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(4),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8b9c12d1-5398-4c42-80a6-9604978de820,0.949999988079071,false,4000.0,NS_NET146_L_F4_(3),b5548457-5923-4d52-b3c9-fdb75a1df98e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -48ae1ea4-e001-4152-b54c-320fc9f35e92,0.949999988079071,false,4000.0,NS_NET126_L_F4_(5),de5ee252-ebb6-42b0-875c-77ae557ffbf6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9018c4d9-5b86-4c11-b5b3-2c26e756ad0e,0.949999988079071,false,4000.0,NS_NET126_L_F2_(20),de756ddb-793d-4b2d-959c-59d938a8f61f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3a2470e0-1d3f-4f33-990d-20c8b9611ac5,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(7),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1e79cec6-2546-4e64-92fc-c509d4eea216,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(32),49b511fa-8cff-45f4-9a59-54faaaf90abf,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -a1af0e38-339c-491c-94d8-446cf662d89b,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(1),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -91d402b7-e8c7-4919-bdbd-93c1c8492920,0.949999988079071,false,4000.0,NS_NET146_L_F4_(14),f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -521d8738-0393-4519-8b31-52ed06c9ed18,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(6),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -038ee933-439a-4705-b526-0373a4b0b16a,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(1),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a964d9b8-a035-41df-86c0-4c5306af2158,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(7),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c67f5f1a-7adf-4715-a0ee-1bc0156b7bb9,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(6),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8decd09e-f82a-4f38-8946-14a9b437303f,0.949999988079071,false,4000.0,NS_NET126_L_F2_(18),e80aa2db-f32c-410d-96a1-a32e03222568,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8736f13d-fcf4-486a-8225-259bfd9bd206,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(8),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0211454c-9be4-470f-9cf5-cef9b87cb640,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(5),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9b12597e-619f-4953-86c6-21f8d262bfbd,0.949999988079071,false,4000.0,NS_NET146_L_F4_(6),49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -bedce1e8-d623-469a-b7ff-bb618588bb3e,0.949999988079071,false,4000.0,NS_NET126_L_F2_(2),5981fe65-3c92-4a78-af92-1461904046d0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -080cbc7e-6acf-434d-ae38-b693f19edc69,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(4),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7b187641-d6fa-49f2-afd6-b03125c1acea,0.949999988079071,false,4000.0,NS_NET126_L_F2_(22),177a20fe-83b1-46df-94a3-4faa54348d10,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4336ad38-37d0-4bba-914e-b2ebec0cc8ab,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(2),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c098f9cd-09c8-4eef-8941-652cb8365992,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(4),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c9acf3dd-2d38-47f1-9449-421104c47171,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(8),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f855cedf-e3f0-4c0f-addd-c57deb4f9e03,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(2),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cb0661c0-15fb-4475-9e0b-fbcf734e19c7,0.949999988079071,false,4000.0,NS_NET146_L_F1_(4),dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -75b3f626-a1e0-47d6-9d2f-658500ac7630,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(38),32507a10-1eed-4a3f-820c-bc187f3b052e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -d5b04d0c-bdda-450b-b939-aec8af923eea,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(5),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -040e8122-1873-4622-952d-87ddef148e7e,0.949999988079071,false,4000.0,NS_NET126_L_F2_(1),196fe620-d4a7-45f9-93ad-0579e2bcbb9a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8052a8a9-d5a5-481e-a772-87f71ee8fbb9,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(3),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d3b5447b-a2ba-4f17-a10c-bd6354ab2338,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(5),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -08a60d08-3a12-4263-a831-274f3b374cbb,0.9700000286102295,false,4000.0,MS3_Last_03,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -bc54e624-8931-4188-9405-950e8deae723,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(6),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -62fad34c-a778-4140-a13d-dee5f0af255d,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(33),b425b28e-48a8-4ec4-a15a-387fcfb79895,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -dc34b951-89f4-4e28-8f04-3e6522bfa0c9,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(7),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c1049c54-1558-4d61-b47f-004b17e38770,0.949999988079071,false,4000.0,NS_NET126_L_F4_(16),b8fa1f73-223c-4b08-a140-44f12484cce3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -07ba8eae-b76d-4034-b378-a3ef8134fc2b,0.949999988079071,false,4000.0,NS_NET126_L_F2_(27),daed3552-e382-4153-95be-97f17e2c53e5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9413bafe-4537-4247-ae22-8b3d03bf6309,0.949999988079071,false,4000.0,NS_NET146_L_F1_(16),09ac8949-2b79-41d7-b56f-a58f20036df2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ec81e030-4dc6-462a-9218-b5c791e82da7,0.949999988079071,false,4000.0,NS_NET146_L_F4_(5),d7023c15-adb7-4d56-9f86-b182611a47ef,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2c90248b-ce63-492c-a2e1-2bd66a3f3287,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(8),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1107328f-3c13-4f0b-bde3-1d9580cf40db,0.949999988079071,false,4000.0,NS_NET146_L_F3_(12),f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8387b2f1-1e5f-4d85-8ca1-a78a44b09788,0.949999988079071,false,4000.0,NS_NET126_L_F2_(5),c8b1fd67-2f03-4153-8ed3-284e7a721ec5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -73c923b1-49ef-49b6-863f-8badb0915f70,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(2),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f60efe06-32af-466f-9359-52cc8a59b985,0.949999988079071,false,4000.0,NS_NET126_L_F2_(17),c5457e35-ad81-4427-9d3a-99e4c44ccae8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -12f5a119-679c-4198-b133-a4596816f6d1,0.949999988079071,false,4000.0,NS_NET146_L_F2_(14),9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -acc82c39-9615-4a9b-83a5-76c4704cbee0,0.949999988079071,false,4000.0,NS_NET146_L_F3_(13),bdf97a4d-622c-4251-8183-8b1a696f376e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -66f54dc9-83dc-435d-9c21-3361838e88d6,0.949999988079071,false,4000.0,NS_NET126_L_F3_(14),df8df8d2-3494-4da9-8d1b-f913d15f520f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f2f13d1d-3643-4d94-b519-94ea266b8816,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(3),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -180167d5-7277-407f-a269-da5d2f1e30f0,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(3),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -99a0a508-d25a-4136-8300-40a676832d35,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(2),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -146fba6b-bbbe-4f3b-ba51-2f3a2c31b118,0.949999988079071,false,4000.0,NS_NET126_L_F1_(22),c317a6cd-428b-4c36-8233-91d0c4e2717a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -96dbdf3b-98cd-45de-92e0-3743c609b08e,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(2),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2c970df7-5644-4665-835a-825b8df8aaf4,0.949999988079071,false,4000.0,NS_NET146_L_F4_(4),00d4a837-f09c-41df-bed1-dfdb78387116,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d24c0d3d-bfe6-4ae6-b707-eb781d7f7d2a,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(8),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9367b934-d77d-4f3b-b5e6-0692ec6789a3,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(7),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -397c7198-feee-4f46-9149-1ef9d31d9ba2,0.9700000286102295,false,4000.0,MS3_Last_01,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -6993add7-7f94-4f50-b87a-0b77dc41c421,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(6),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a9bb2858-c56d-4594-a364-fcfaf448d0e5,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(7),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -54f64be5-5966-4c66-8cfa-dd688e59e992,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(4),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -bc617ea3-3b85-4ba8-8b12-f243f077d6bb,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(4),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -513e31ea-560d-4e33-b1ec-c1aca5f63339,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(5),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5f825da0-bf7e-4846-9601-9049cac0f958,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(3),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cdd0ae9a-c06e-4234-aea3-255f359dbe64,0.949999988079071,false,4000.0,NS_NET146_L_F3_(16),3ec2f2a0-36a3-4d11-88ee-cc4df001e876,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -50c89980-8da2-4e98-8602-e2f0b560e7c4,0.949999988079071,false,4000.0,NS_NET146_L_F1_(8),d5489e1b-0e7e-4ca9-a362-09c23576a622,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a00956d5-6648-484c-a485-b3491c5181c2,0.949999988079071,false,4000.0,NS_NET126_L_F1_(20),36cda100-86ae-4a20-ac71-20af603ac0cf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ab77ac85-7990-4b93-a4e7-6fb812ad345a,0.949999988079071,false,4000.0,NS_NET146_L_F3_(3),8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6559c5f4-c9ed-4f01-af36-72d18f04ca9a,0.949999988079071,false,4000.0,NS_NET126_L_F1_(15),41c0087f-ce27-4da3-97d2-92d711b639b4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -bab50a41-657d-454b-91eb-3e64de845098,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(4),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4958e21c-cf9d-4bae-ad3f-a1612171c398,0.949999988079071,false,4000.0,NS_NET126_L_F1_(7),fc7821d2-ac64-483e-b520-38d9971f4db0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3025fcc5-7a14-4bbe-93a1-0b2533306ea1,0.949999988079071,false,4000.0,NS_NET146_L_F1_(11),666757e2-292e-473c-ac9c-04c0786574bc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -53347503-af44-482a-8b97-d1b638bb3634,0.949999988079071,false,4000.0,NS_NET146_L_F2_(23),ce513b50-b57a-41e2-b744-4c0fd2ae97d0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0de47e33-a4fb-4a86-839d-ec9ad49a8414,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(6),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e035cc33-0a53-4dc4-b35d-f3f44764a5aa,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(1),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -903c6f31-7c78-4d1e-b4ee-bf0dcbb9e938,0.949999988079071,false,4000.0,NS_NET146_L_F1_(10),6c24b464-790a-4aae-bb11-766718f07cd5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -422a643a-04d2-480b-b107-e8582b36e641,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(7),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9993f48a-8ee2-49b7-af31-afbfa3690c45,0.9700000286102295,false,4000.0,MS3_Last_07,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -f870937a-6644-4ef8-9bfd-15835471e775,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(30),519ace7e-fd3f-4797-b14b-36c1694b00cd,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -ed173f7f-071e-4687-b7fe-b59616148ee3,0.949999988079071,false,4000.0,NS_NET126_L_F4_(17),7125de08-1d28-409a-8b23-023a0294def5,,,,"cosPhiFixed:{(0.00,1.00)}",0.10000000149011612,h0 -eb8622e3-0dd8-42e4-ab49-23b5cec0eb9c,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(8),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -038c506d-59b4-406b-88b0-7f74719c55e7,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(3),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -25be1a94-a0cc-4de5-acc4-097d9e8639ff,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(8),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -449eaff2-92ca-4075-ae9f-2d517e7f0642,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(6),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d08a8e2d-0ab1-4d89-b111-6a8efe2a76af,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(1),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a1a11124-0e04-4a0c-bab9-eb68c9f20a9e,0.949999988079071,false,4000.0,NS_NET126_L_F3_(28),e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5596dd40-f34f-4ec4-bf80-17fcf122a67b,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(6),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7f6b1274-7b1b-4313-8027-6fc4a31f34e0,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(4),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9abc4242-f58f-474a-99fc-613e083e2589,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(4),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e733ea74-1c51-4592-9fb3-cc2d0a007450,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(3),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -04063357-c213-4cc9-a870-9cc11ac4ad92,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(7),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f231c4e2-2872-4d83-b486-894d846dc4d7,0.949999988079071,false,4000.0,NS_NET146_L_F2_(10),41414318-73e3-4bdc-8147-570a96b28d37,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6f97361f-d4e6-45b5-9bf2-d880d42eae25,0.949999988079071,false,4000.0,NS_NET126_L_F3_(17),462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7794309a-7ecd-436d-ae38-51bbdab5df11,0.949999988079071,false,4000.0,NS_NET146_L_F3_(6),01bdd8b2-145f-42b3-80e3-a2366dea1044,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a6ce4a93-174a-4ca0-92bb-f09abc579d81,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(1),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2d758bef-0a8a-4dac-aca6-556ace61ec84,0.949999988079071,false,4000.0,NS_NET126_L_F3_(32),7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -beb7a9e2-4394-4808-af58-d984ab871f98,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(3),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -66f00451-3542-41f2-adcf-24068c870afc,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(2),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -80d0b6a9-8d08-4262-81a0-83b13beaad45,0.9700000286102295,false,4000.0,MS1_Last_02,32b3bb19-c52a-4a19-890a-94a8918d38a9,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -8d1ee87d-73a7-46eb-b174-602683d702d9,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(28),012c9eee-86c2-494c-adcc-bbfc481e4a46,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -11bc6378-bb54-4ddb-846f-1488baaf1c00,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(4),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5ab2e1b6-7c4b-4cba-8528-94bda71c3dcd,0.9700000286102295,false,4000.0,MS1_Last_03,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -2a9149a4-4778-41d8-8865-090499833016,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(1),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -79a2d93b-3583-4e90-bc40-9e7ff84bf0a2,0.949999988079071,false,4000.0,NS_NET146_L_F2_(15),d82fae59-844a-4c85-997e-326dd876137c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -95be2f70-bd5a-4785-983c-2aa7eba6546b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(26),bd288184-99d8-4233-bb3d-484f3922200a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f3168cab-a847-4314-9bf9-4dbe269c1c3c,0.949999988079071,false,4000.0,NS_NET146_L_F3_(8),6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2eca146b-7c7e-47fa-a0be-807b7fc72fd5,0.949999988079071,false,4000.0,NS_NET126_L_F3_(4),bf7e7268-2fb6-4948-ace6-9037ae148fa3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -89971afc-919e-4153-92b2-f0a43ad0e535,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(27),c81d6099-66b2-45d8-b8a4-c19ceb862f6e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -a8e26f05-54f0-4da7-abfa-228661833e03,0.949999988079071,false,4000.0,NS_NET126_L_F3_(18),9502fd3e-c00f-48fa-8b56-c72d21f80f3c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -72d00bfa-4967-485a-b5a3-519a6826fa9c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(4),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -de2b452a-9eee-4481-b0f0-72d9ab56a4b5,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(1),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -924dbbfa-abb0-42b2-83a9-15897bf5806e,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(5),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8d326225-ff42-40ab-b58e-adc0cb32c9ff,0.949999988079071,false,4000.0,NS_NET146_L_F3_(9),6570535c-0d2e-4846-9951-21559902f67a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -dd893829-b4af-4cf1-9d70-79ae68b91bf0,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(6),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ab476579-7fb3-408f-a065-73f6d2140fb2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(5),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7b8abd75-9967-4505-b919-3accd78908e4,0.949999988079071,false,4000.0,NS_NET146_L_F3_(19),810bebb0-0d5c-4899-b213-3207be661248,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -58b9f934-f7c4-4335-9894-3c80d9e6b852,0.949999988079071,false,4000.0,HS_NET1_L_S3,33f29587-f63e-45b7-960b-037bda37a3cb,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -b8ad6547-aa55-4fca-ad0c-b5a0078b2203,0.949999988079071,false,4000.0,NS_NET126_L_F1_(14),b7baa286-cbe2-4143-a08f-4e025af47529,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7e337720-59f5-4d3f-bf95-71c6228587f3,0.949999988079071,false,4000.0,NS_NET146_L_F1_(17),0d94a5ea-3a13-48ba-a27f-b2903841c334,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d4d3ea3e-cce2-480b-9a7c-bbdd1a7c96ad,0.949999988079071,false,4000.0,NS_NET126_L_F1_(8),f717b05b-f4e7-43d9-af9e-638e2badee5a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3b51a0c6-060f-40ce-b207-6146fde8e724,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(8),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -89f93344-8dc3-46ea-805b-8c43bffc7577,0.949999988079071,false,4000.0,NS_NET126_L_F4_(15),55b3d03f-2204-4ab3-84cc-a28476868c9d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -dc65cd27-84a2-49a6-aa22-d9c1968a72b4,0.949999988079071,false,4000.0,NS_NET126_L_F4_(8),75f2dfb9-75a0-496d-9c44-79e7df54c1df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ff0b995a-86ff-4f4d-987e-e475a64f2180,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(1),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7c03d124-df4a-46c3-9b74-66bd888f750e,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(7),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7a17120f-8522-4eca-95aa-f6b5d985103b,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(7),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -86cbef43-bde0-41a6-a684-f42fdb4ba527,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(4),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f880a0dd-991c-4646-a0a4-c6c877171870,0.9700000286102295,false,4000.0,MS4_Last_04,890f2162-b4cb-49e7-a16f-4b552c5e245c,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -c7a0e7d2-276f-41e7-bfbc-f11fac26a0e1,0.9700000286102295,false,4000.0,MS3_Last_05,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -32be027e-1ee2-41bc-9fe5-18daa3613efa,0.949999988079071,false,4000.0,NS_NET126_L_F1_(2),a7ebd30b-b843-405f-9fae-ca6b489601f9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5f1b7472-2a01-4203-8318-878b1a4460c5,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(5),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cb65c2bc-fb36-4338-9a13-34bd999f4fa5,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(8),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a12570e4-afeb-4af8-a86c-9e804eea4886,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(1),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3ce5abcb-0eb1-403f-9fca-90d255619cc5,0.949999988079071,false,4000.0,NS_NET146_L_F2_(13),49e14db3-a4bc-464a-b606-653ac8a604dd,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1308b834-4b0c-4c91-b5fc-8529368005ea,0.949999988079071,false,4000.0,NS_NET146_L_F2_(25),011e3794-3341-4376-839c-3f5a452e15ab,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9f0d4b5f-7563-40bc-b20e-bc54a96e9019,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(30),9f95c733-71e2-4bf0-a27a-70144518ea2c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -8f0150c7-b217-43ca-85d5-c1e4d2e903d0,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(2),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -67379832-1cfb-4015-ac96-0fe499463c42,0.949999988079071,false,4000.0,NS_NET126_L_F4_(3),1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -12c58b41-2ebb-4bc0-8ca2-a3693d5d5f8b,0.949999988079071,false,4000.0,NS_NET126_L_F3_(1),2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0610df61-bdb9-45d1-ab48-a72dca4079c4,0.949999988079071,false,4000.0,NS_NET146_L_F1_(1),4f28e734-5148-4caf-ac64-270231740cbf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -28a6872b-abf5-412e-b887-b0503addaa7a,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(5),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -599e7b5f-7a78-4bb4-a3c3-e6f2779bbda2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(2),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0944b3b6-15e3-4704-b50d-fa1e407ade7e,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(7),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3a5e7e35-53ad-48da-89b9-98342a9875ac,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(7),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c3434742-e4f0-49e5-baa7-c1e3045c732c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(1),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -eed8fa68-08b5-49f3-a6d7-2632fe7b13b9,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(3),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3e3225f9-2dd9-402d-9a0d-1d8cde60b1f6,0.949999988079071,false,4000.0,NS_NET126_L_F2_(4),cdda8fa5-9a18-4f3e-951d-1ec0009191b4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -245666cd-881b-44ca-9b47-536c96e15bce,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(2),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9b4f4a8b-3aaa-4b77-afdb-049d2b83869b,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(6),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d95c7612-af94-4ac4-94a0-a1dca839f33a,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(4),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5c3fb165-f374-44fa-802e-e82e5a2538f0,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(4),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -550f9346-fe14-46ef-bd54-00980834e0d6,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(34),17f7a477-d9c7-4f58-8ba0-1a2694dcc874,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -be985e5e-19b6-49c4-bb64-f37a627be13b,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(35),c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -9e5845cb-9ad1-42c6-8630-724375a4e323,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(8),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -10963efb-44d7-49bf-b926-c2d29239de60,0.949999988079071,false,4000.0,NS_NET126_L_F2_(3),8f422111-67d7-42f0-9f80-fbd0ec64c4fc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -11e776fa-ecc1-4332-821f-d7e56758b988,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(1),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -689527be-31a0-4791-970d-8542e367401c,0.949999988079071,false,4000.0,NS_NET126_L_F2_(23),9b509c7d-4647-40fd-b03e-7ab919215cc6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a610a50c-de39-46e6-b53b-95e3868d1072,0.949999988079071,false,4000.0,NS_NET126_L_F2_(11),6678c226-c5d2-4ce3-9728-dc1163be799f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3857ce77-a630-4b43-a1a1-6bebc0817e1d,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(2),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -63fb1af5-91e5-472b-b798-b2846cf701ba,0.949999988079071,false,4000.0,NS_NET146_L_F2_(16),8f2ba96f-a47a-46d3-b5a1-d19de0a32419,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1a88ba6f-9005-432d-9a8f-54a48c90015a,0.9700000286102295,false,4000.0,MS4_Last_05,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -6bd61b8c-2b53-4fc8-8e35-b17ed81ba8c9,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(7),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d5e593f1-727e-4983-8abe-92a328aa203b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(2),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b52b4bea-014e-4aad-8481-2f2761957f69,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(4),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ef07774d-107b-4536-8d1d-45c28f755a80,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(6),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -46644e3e-b00c-4707-ae8d-94fed9f0adcd,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(38),06b7f21a-d6d7-4ec0-94c6-141845f14986,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -f2284780-6019-4864-bf29-915330717f5b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(5),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8c2ea045-0890-4ee5-8d66-0ce5f5eba7d1,0.949999988079071,false,4000.0,NS_NET146_L_F4_(12),f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -598f0d53-7c8f-435b-b333-95b6f4d359f2,0.949999988079071,false,4000.0,NS_NET126_L_F3_(31),67af7db0-0fd8-4657-bb4f-43a2141b9f73,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -520e2b61-ef52-406a-bc3d-83fd47da2696,0.949999988079071,false,4000.0,NS_NET146_L_F4_(13),b608d71e-3ede-4156-a015-3f6e1d22242a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8bad5752-c9c1-4669-802d-b1c4c7bbb909,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(5),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3df803d8-4af6-426e-a51a-4b736ff06d51,0.949999988079071,false,4000.0,NS_NET146_L_F2_(20),2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -59f1999e-008d-47f0-b99d-1305fcb8f525,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(7),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -deb6456a-d472-4f1e-8698-006e8cd51dfc,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(5),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0290a7de-8c73-44d4-9a06-cf469d20c90c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(3),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ea515ef0-c8e1-4e3f-9420-577ba394c7dc,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(7),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -666ac620-2151-430e-a9a1-624be6c61cb8,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(5),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2f4df67a-e33a-4a1b-9caa-41bfb4408b8c,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(8),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8d50a47b-95ce-4a8e-84a3-80d5781dcc53,0.9700000286102295,false,4000.0,MS4_Last_01,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -4cbcffbf-d9c8-463a-8f11-6990fbda235e,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(2),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -63374b45-aa28-4e06-85c2-704c00754ba8,0.949999988079071,false,4000.0,NS_NET146_L_F1_(20),7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -16f7000e-1f95-4003-bbbf-8c73cfd02763,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(2),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3ad0235e-751b-4682-89a5-b359aef0dd98,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(2),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2b02fad4-245d-4ada-ae5f-0252f2aa59f1,0.949999988079071,false,4000.0,NS_NET146_L_F2_(11),f26b5511-3c50-42d5-97c2-be408330eb84,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -62b0b771-b773-4b25-af1d-bbd8a7ad68d4,0.949999988079071,false,4000.0,NS_NET126_L_F2_(8),366a70fb-8d7f-4201-9eca-0fcbc839239d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -aff03ab3-9595-499f-931c-8730b1350a2c,0.949999988079071,false,4000.0,NS_NET146_L_F2_(12),8254d91b-e5da-4402-bb8f-301eafa09d28,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -81a6ed8d-f29e-4478-bbf3-ccb6514922f2,0.949999988079071,false,4000.0,NS_NET146_L_F4_(7),bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a7de4997-eddc-4306-b1ac-982c1872863b,0.949999988079071,false,4000.0,NS_NET146_L_F1_(6),e3c3c6a3-c383-4dbb-9b3f-a14125615386,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4642d648-b0dd-4597-a3bd-2cc1fce74f27,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(1),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1fb9be59-d27c-4748-a090-db5a58063d82,0.949999988079071,false,4000.0,NS_NET126_L_F4_(6),e3a40690-d085-4796-9fcb-48d776e58594,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d957a9c6-500e-457d-918b-7f6c4e560bbc,0.949999988079071,false,4000.0,NS_NET146_L_F1_(15),00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5aeaccc2-f9cd-4292-9b9a-2e05d5c63fe4,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(6),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -209cebb3-6706-49d0-af2c-b2ae23ca3873,0.9700000286102295,false,4000.0,MS4_Last_03,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -17a02ab8-32b2-436d-8aab-04fbd3809c87,0.949999988079071,false,4000.0,NS_NET146_L_F3_(25),c6c177b0-5004-4db0-8cde-6293330a4757,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1fbefcb1-57ec-4b86-8b7e-c892f0e6b179,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(6),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fd2e19b6-d5e3-4776-9456-8787a2160d9d,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(1),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2ab66e57-dd5f-4295-a6f5-f017fb4db8b1,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(8),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c7834ac4-2f72-483e-8ecf-1d0ce715716b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(6),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b89b8560-b729-46d5-8aa1-3c678dd30be4,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(5),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3b63c80f-a5c6-439b-97be-4e1efda58ccd,0.949999988079071,false,4000.0,NS_NET146_L_F2_(22),5862f526-783a-4218-a463-3cbf5de8dade,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5f2d65fc-7e92-497e-8c51-ead1985d66fa,0.949999988079071,false,4000.0,NS_NET126_L_F2_(24),625bdd2c-a75f-46ef-850c-ca4704d56e55,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c27ac6bb-5227-42d4-832f-985d69bc9c4e,0.949999988079071,false,4000.0,NS_NET146_L_F3_(1),22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f1804def-a6f6-4603-bfd3-52968a2de732,0.9700000286102295,false,4000.0,MS2_Last_07,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -bcb5abf4-7b31-4860-af53-78ec457f21a2,0.949999988079071,false,4000.0,NS_NET146_L_F3_(30),7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c58dc7e4-f6c5-47e1-a914-e566b8aa6385,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(1),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ee726dbd-8a70-4d50-8cc3-cdda596166c7,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(3),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c9689bd8-6717-49d5-90d9-a6245b5116e6,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(3),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c3df03ac-0dff-4304-b327-3e88d023f692,0.949999988079071,false,4000.0,NS_NET126_L_F1_(25),3a2f199c-2966-4b9a-939b-3a6c9924341c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -72e4504c-0362-4fe0-a6be-43870f627f7f,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(8),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b3ce3d49-d4d5-4b76-a589-02d0c7faf5a5,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(6),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -de3eef0c-2f09-4f57-a04b-dae5011fac7a,0.949999988079071,false,4000.0,NS_NET126_L_F4_(12),6a4547a8-630b-46e4-8144-9cd649e67c07,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ab0d8c5c-fc68-4ae0-87a9-8edfa3b25339,0.949999988079071,false,4000.0,NS_NET126_L_F1_(4),ff947647-b551-41ae-bcfd-6af228250c96,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7b040b43-011a-4402-a176-9b9b41ce0c37,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(1),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b47f1063-12e8-4b1f-a015-6c5be821a24e,0.949999988079071,false,4000.0,NS_NET126_L_F3_(22),61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -af4c1bfe-4e4c-437d-9eff-42060aaf4027,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(7),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4c7ee262-a021-408a-aada-27677feeeec9,0.949999988079071,false,4000.0,NS_NET126_L_F1_(17),5fe9c522-37d0-48f8-b3b8-e91b956e39f6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3c9a2f9a-8cd0-42f2-9d16-f6314c741aa3,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(4),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -93128545-6977-41fa-8e20-5d7a930d80c9,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(3),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -759ff1e6-5ad6-4701-bbe1-059c08a1781d,0.949999988079071,false,4000.0,NS_NET146_L_F4_(15),576840db-7d3c-417b-b587-28b222e740e1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b16bea09-e042-4bd1-837e-78125b0085dc,0.949999988079071,false,4000.0,NS_NET126_L_F1_(13),847fd5fc-b515-4a9d-8a6f-66df1e71ded2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7cee8d98-be5b-400c-9655-409e1eae9f6d,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(6),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0c62dc7f-45a7-44e3-9240-f9ff9d62e4a0,0.949999988079071,false,4000.0,NS_NET126_L_F4_(13),da79c960-d35a-4193-9b06-2d4d57051706,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -bee4283a-0d36-4f98-a837-23d0667a6675,0.949999988079071,false,4000.0,NS_NET126_L_F3_(9),bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a82e1da2-1af2-40d8-b8f9-b4027118d029,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(5),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ef6f6592-1b85-4204-82e1-c33a6ed3d582,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(1),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -66f30a61-7722-48a7-a527-99ff55e12754,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(8),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3f37f3bc-f9cf-4a55-96e4-ee4be9f22a63,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(2),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -388ecdb9-b7e1-429e-990b-b5124fac12cf,0.949999988079071,false,4000.0,NS_NET146_L_F2_(6),5071dd8c-bbc1-4c8d-a180-4492f80e183d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5012a529-b7d2-4f9e-a2d4-90641470cba2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(8),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3f903ef1-047f-4f28-9d9f-c35b2c440315,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(8),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5f56df23-f5b3-42d0-9896-85015f7b1274,0.949999988079071,false,4000.0,NS_NET126_L_F2_(28),5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a265d035-d8ea-41e0-ad10-04e064b9a968,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(5),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -95a1e026-be40-4209-9752-fbab3a626b87,0.949999988079071,false,4000.0,NS_NET146_L_F1_(2),ab3645a7-af26-480d-b1bd-5b0fa00dc83f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -e9660cc3-b2b6-4b8d-8673-dd3bcb6305fe,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(2),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fd17352b-b2ad-4e77-92cf-08b48a1ba757,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(2),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -080e6ab5-8021-43c0-bf9f-2424ec0a1de8,0.949999988079071,false,4000.0,NS_NET126_L_F3_(30),443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0ccf950e-a9bf-4de8-ac3f-5ca04a3f0b60,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(6),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -62a4a30c-7bf2-4813-a00e-7002b8c56832,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(3),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3feb112d-8a47-49eb-b719-d7226b6fe7a0,0.949999988079071,false,4000.0,NS_NET146_L_F2_(18),21359dd1-7a23-4932-b656-c196fbffe751,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -94203400-1579-4cc0-9395-ac67f94c6c01,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(3),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7b6cd13c-8f54-421e-b2e9-5888f181737b,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(27),9baae5ff-40e3-48cb-9ddf-de6d1c133e13,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -3f47dbb5-8254-43d1-83a8-21385cb666dd,0.949999988079071,false,4000.0,NS_NET126_L_F2_(25),1dcddd06-f41a-405b-9686-7f7942852196,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4dca3b1d-5d24-444a-b4df-f4fa23b9ef1b,0.949999988079071,false,4000.0,HS_NET1_L_S1,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -12c85bfd-a5a1-4812-b168-86b94f624f18,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(8),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3c309ec9-42a4-441d-8c0e-e29cefa6bf18,0.949999988079071,false,4000.0,NS_NET126_L_F1_(5),eb21d716-1b54-4dba-bdc2-d1f6752aef85,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8bee3a68-8990-46eb-9230-067111caceb5,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(3),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b9fb3d41-bb0e-4c4c-bff5-1b50d40efc33,0.949999988079071,false,4000.0,NS_NET126_L_F1_(3),04f29760-9e52-4943-8563-62e1fbd5ed52,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -36d59a0a-17a5-4955-996b-e3aafb86f4f1,0.949999988079071,false,4000.0,NS_NET126_L_F3_(23),33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9b0cca4d-f27f-4190-b35f-a84fa09ac157,0.949999988079071,false,4000.0,NS_NET146_L_F1_(14),b73208dd-f4a8-4e90-bf2d-7ea67a89525a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ea51cb96-068f-4359-b1d0-27438ce87b49,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(31),5e213f42-d93e-45c5-a295-adbe09105746,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -7513eb4a-3244-40fb-b500-0132947a02e0,0.9700000286102295,false,4000.0,MS3_Last_02,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -8a5a7de2-d61c-4172-b917-7404a2aba038,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(3),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0cdea42f-57da-4a8a-bd83-c4252b7868bf,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(8),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9d2c5b78-ad86-4055-b74b-e5b24f89a75b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(4),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2efedcfd-4972-4d13-9d62-180f1b9a76ad,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(1),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5d4b96bf-a6ad-4026-b97a-4e6d77896480,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(4),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -aaa0a903-46f7-4109-adb3-9f43398fc932,0.949999988079071,false,4000.0,NS_NET126_L_F4_(11),95ced3b5-69fd-4171-9c34-f18802064e22,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -04c0cbcf-4e9d-4608-bb92-6ab97e59ece7,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(4),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1a2d5842-96f6-452f-aa82-6064618d5f49,0.949999988079071,false,4000.0,NS_NET126_L_F3_(29),f0f8f187-5dbf-46ab-8a43-d6169ab5042d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5d930bf2-0b63-4821-bd6c-02383e3b4220,0.9700000286102295,false,4000.0,MS1_Last_04,1396cb4c-cee7-4116-97c9-290f98785719,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -24de669f-4786-4388-ae36-aaef1ce40ffa,0.949999988079071,false,4000.0,NS_NET126_L_F3_(27),d5b861a6-2a5b-4dec-a66e-adbfc6d62873,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -860a37f7-7add-4613-bef4-326ee5ea328b,0.949999988079071,false,4000.0,NS_NET146_L_F1_(25),2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -00a6de01-2304-484b-90f2-5abb044167a3,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(2),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8e9debcb-ce25-450c-b016-170bb7622008,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(4),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2550ae33-6540-4602-b59a-a46c49747c97,0.949999988079071,false,4000.0,NS_NET146_L_F4_(9),9b889b73-c108-4b38-b6eb-3377841e0c83,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -692728c7-5ecf-4c0a-8ead-ae19fc029ba4,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(6),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -09a47013-bac7-4879-9b8a-9dd854ea9786,0.949999988079071,false,4000.0,NS_NET126_L_F1_(23),94713e6c-c47e-422c-8ab3-2a2903b7dcd2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c3d643d1-1b2d-4f9f-838d-5b1ce270fc33,0.949999988079071,false,4000.0,NS_NET126_L_F2_(9),a286f73a-20ee-4056-8129-c7963b34ecd9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -099f4cde-75ca-4928-904d-37717b5b1b02,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(3),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9ae56e43-54fc-4ab7-8989-abbc14596fd3,0.949999988079071,false,4000.0,NS_NET146_L_F3_(20),0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1469946c-101e-42e9-9e48-28801e9610af,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(28),0c266541-6235-4d01-8258-e763c58af6c7,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -02e0c339-6dfd-4cbc-bebf-56b850053a7c,0.949999988079071,false,4000.0,NS_NET146_L_F1_(3),b237dd88-bcba-4a7c-aee6-c0c3e151e14e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a0147111-39c4-465a-8a10-48d1de1d349c,0.949999988079071,false,4000.0,NS_NET126_L_F3_(19),922a6375-b97c-412e-a6c9-b0ea55a23f76,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b03db97b-06ef-406c-a5b3-7e9ca9f7bf66,0.949999988079071,false,4000.0,NS_NET146_L_F4_(17),155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,"cosPhiFixed:{(0.00,1.00)}",0.10000000149011612,h0 -000e54d4-cf92-4cdb-9777-3d40d320d2b6,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(6),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -6c4c7e65-4598-4855-b057-25773ffdf5f2,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(6),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9d19bae7-6fa1-4620-8ec2-38cae5596b9e,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(7),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -076b9055-3329-4e88-a1a0-93ad904e72a2,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(8),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3fed7598-a77e-4929-9bb3-687e51346cfd,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(3),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ef94c79c-ade7-4215-ba16-0bb14d558aab,0.949999988079071,false,4000.0,NS_NET146_L_F1_(13),f1e55c8b-357f-45a7-9d57-e299f9b207f3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ff5bf65c-e880-4a49-a286-fd51ce1f48b7,0.9700000286102295,false,4000.0,MS2_Last_03,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -5cffadab-94f6-4d98-a804-9d74189982cc,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(7),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a08a45bb-552f-435d-b614-aed657073527,0.949999988079071,false,4000.0,NS_NET126_L_F2_(15),2645e336-b0df-4d1e-a0ea-375444488f06,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2dcdb711-8872-4e51-ab4c-ef23c685674d,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(35),f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -d4004ab6-3b00-4eeb-b62a-4ec28dc9cec6,0.949999988079071,false,4000.0,NS_NET126_L_F2_(14),9ce9d92c-5583-4b16-bec6-9f67834663cb,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -61314082-488b-4045-8c90-dad4629be04c,0.949999988079071,false,4000.0,NS_NET126_L_F2_(10),3d81adf5-73d1-4708-b03b-3afc7db017f4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -573a3f21-49d8-4e2b-bca0-d546d77bb143,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(3),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c2446989-6050-49f9-ab98-d8cfb8058709,0.949999988079071,false,4000.0,NS_NET126_L_F2_(26),5545d21b-bdc8-495f-bd28-d22ffcc0fafc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d12ce59d-2cf8-4186-9174-46a8b7f7c9cf,0.949999988079071,false,4000.0,NS_NET146_L_F4_(10),ffcaf979-d707-4d25-8f46-f436f9792d7f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -35414e99-525f-455a-b4ef-137b6e48ff87,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(8),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cdf650f2-8200-482a-b5b4-6f96e7f9e0f9,0.949999988079071,false,4000.0,NS_NET126_L_F1_(10),f6a31362-8b0d-4926-b0d0-10bb61db20df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1a08b0a0-ae75-4ff8-b28b-643ca2dbca1a,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(5),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1f901bde-3ada-4e30-8a4c-a264df5b2f38,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(5),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e65cd082-dd8f-45d6-895c-e14357e76ac8,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(2),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3a278137-bf5c-4e2d-96c5-4779bcf947c0,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(2),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ca863e7f-1e42-4716-a214-e79fa91b3222,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(8),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -742de2f0-f057-47d0-83a3-9f57f84eb314,0.949999988079071,false,4000.0,NS_NET126_L_F4_(1),3f63be7c-7f1a-4e7e-87ee-90ada222f64a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f971674c-7f11-4e9d-b701-1736b2effb65,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(4),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0045a53f-8f38-4239-8109-073a768cc593,0.949999988079071,false,4000.0,NS_NET146_L_F4_(1),ead38a50-b8f7-4bbb-b65d-f54350825e8e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3e94ff28-fd2e-4028-a188-58ce85136fdf,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(5),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -98c1a2ab-bd09-4c77-a389-d088aed894b1,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(1),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -916670c1-1575-4fe8-acb0-1dcf1c218386,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(6),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b2789995-79a1-4859-8d1c-70107b83c18b,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(2),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -be63473d-a375-4ce7-9970-80358e5c54bd,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(3),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4384a56f-5b34-430c-89d8-354f367fa7ff,0.949999988079071,false,4000.0,NS_NET146_L_F3_(29),15345698-c319-461f-b969-37d50fb84220,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -89aeade0-ac58-4120-a743-577afdb72b5b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(7),f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0d983289-2ff2-4f2c-b38a-bab3ec967c76,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(4),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f630b338-5685-424d-bfbe-338bf94a0e01,0.949999988079071,false,4000.0,NS_NET126_L_F3_(6),e018b95e-fca5-40f7-8550-b05a619169dc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d7f49aa5-ab62-4148-911b-086e8a848af4,0.949999988079071,false,4000.0,NS_NET146_L_F3_(15),d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -10b5f3d3-60c9-45b9-a70e-fa75140e9a9d,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(3),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -dd53cc4e-93a6-47f1-afa0-a46f82e3b371,0.949999988079071,false,4000.0,NS_NET146_L_F4_(11),8b3e3802-5213-46d0-a498-15eb6e5852b5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3f5718ca-fc58-4b00-b634-1aa6307c6cfa,0.949999988079071,false,4000.0,NS_NET146_L_F2_(1),2c520ab6-507e-4dcf-ab05-8f238e9b9385,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b47d3f0a-f480-49ef-ba7e-7979c81b0f70,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(32),033d0230-4aee-47cf-91f9-81f5f40e60b0,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -1aeeacdc-e61b-4d44-ac76-699c7b459325,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(2),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a34932f7-012c-4a27-aa5f-4dd043028d5e,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(8),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -35408c17-cd77-4115-8357-9fb0e8f76532,0.949999988079071,false,4000.0,NS_NET146_L_F2_(9),a5c73608-5a85-495d-bea0-df77b6ce66ea,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7194cc61-5445-43a9-9039-ddde7ab2be55,0.949999988079071,false,4000.0,NS_NET126_L_F3_(11),4258f215-5b22-446f-a260-e8cdaa7c95d1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9985e8e1-d8fa-4fdc-86aa-70f5b0ab70fc,0.949999988079071,false,4000.0,NS_NET126_L_F1_(11),270c7266-45dc-4e45-829f-c04f6b631cad,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f8a76852-55d7-4a20-99a7-cf1fb5a5b1b0,0.949999988079071,false,4000.0,NS_NET146_L_F2_(17),40537c84-c812-4231-bd23-0ba81922e937,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3052ef96-e3f1-4469-a64e-059f09306044,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(2),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a94ba026-b4fc-40d2-a20f-c8201996d717,0.9700000286102295,false,4000.0,MS2_Last_04,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -99a1fb27-fa7c-440b-9f25-74237b4e0279,0.949999988079071,false,4000.0,NS_NET126_L_F3_(24),97ae0aa4-bf05-4b88-8020-83cbda415d22,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -fe429426-1884-4ad7-8d50-69237e4a6a1b,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(34),fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -7388e938-85cb-495b-bb00-30a050b18327,0.9700000286102295,false,4000.0,MS1_Last_01,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -8221a6b1-eff3-48fe-88ab-0685a9f59cce,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(8),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a3bcf5fc-5937-4182-8a54-180f9810d21d,0.949999988079071,false,4000.0,NS_NET126_L_F1_(1),4303784e-7193-454a-9be4-3591400b4eeb,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9219bda4-01ce-4067-92b1-595b86e9bbdf,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(5),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2596f43d-e805-46b6-a79a-adf9f21fee96,0.949999988079071,false,4000.0,NS_NET126_L_F3_(2),285a4caa-2da8-4bd2-8a60-7d04f168f378,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -40550e1d-7453-4f20-a5e5-8839d17c2fdf,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(7),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -bd4fa1dc-a73a-4aa4-ac9f-d263a45a6cce,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(6),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7e875803-7e9d-4808-8d8c-a722d46fb6af,0.949999988079071,false,4000.0,NS_NET126_L_F3_(20),732f83b0-b9c5-4b8e-86fe-753c26f40e78,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -33dfa920-da94-44b2-8be9-85a0eeafa626,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(1),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e2795c9b-dddb-4012-b56c-e24c3d1c3cdf,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(6),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fd1a8de9-722a-4304-8799-e1e976d9979c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(1),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a4145b3e-7143-4618-99f1-16b43aec3c9e,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(5),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8a535e63-ff09-4236-ac68-fb6a21bb0516,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(5),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -47878ba6-7b08-4af8-a7ab-c859d0ac3415,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(5),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d5a1a95f-e2b8-402c-86e6-617489ca865d,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(3),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cd65e476-ba5b-46be-b87d-a689b79269eb,0.949999988079071,false,4000.0,NS_NET126_L_F3_(3),69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5535881c-50ec-4a74-a67e-5b963aec5b38,0.949999988079071,false,4000.0,NS_NET146_L_F1_(5),bd8c7d3d-e830-4a46-bf78-0086ce24909f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4924a294-0f71-4f0d-a058-447a1a74de6c,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(8),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4d3af2ae-7637-46bc-a492-1bca70d3bc56,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(37),450426ac-a560-4d17-b1fc-9e169530a655,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -ae21cb77-4f17-4996-89f3-b2172f479bcc,0.949999988079071,false,4000.0,NS_NET126_L_F2_(16),d8c35123-b389-4199-84f9-d417d24bb78d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2ba29ae5-8b0a-4fee-be31-c6d0cc83f97e,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(6),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4cf4c2ac-3c96-456e-858b-5000f183230c,0.949999988079071,false,4000.0,NS_NET126_L_F2_(7),4db634e5-3eb8-4c17-bc44-eb224667580c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cc08fc6e-1932-4daa-af04-f0376c8be6e2,0.949999988079071,false,4000.0,NS_NET126_L_F3_(7),50164699-2018-4b17-b3f1-74b082f27403,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3e0d4895-f0c4-4b4d-8eeb-8c8e24e3e610,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(7),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cad1c678-6e76-430f-bf7c-db12c6f06239,0.949999988079071,false,4000.0,NS_NET126_L_F4_(7),98072ded-726f-4f0b-8bbc-4fb6d5086a7b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cc470184-d4ce-468a-b7ef-ed2cb84debfd,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(4),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -db87c6cf-7673-4e25-b510-50086de5d4b8,0.949999988079071,false,4000.0,NS_NET126_L_F1_(24),4f2402e8-664a-40f2-970a-abc098a2a0d1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -e25c3969-7e44-48f5-860c-03ff67a65284,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(29),27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -6a4d97c2-3c6b-4fb8-91a6-2c9a2f9523b1,0.949999988079071,false,4000.0,NS_NET126_L_F3_(21),5af425fa-6ed7-43e1-8898-7af1315128c5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -fe02ae6f-bb61-4ab9-83db-43a41f32b0c8,0.9700000286102295,false,4000.0,MS2_Last_02,535843a3-cf93-412f-b4d7-585337791ba8,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -cec8879b-a90b-4e15-b664-a7ed0739ae0a,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(6),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -791307b1-d235-4df9-9400-e6c2af8b3825,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(2),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -996313f2-93af-477c-92dc-2011a43afd7c,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(5),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -87fb203a-6cbb-4598-8172-8cdef6b04a63,0.949999988079071,false,4000.0,NS_NET146_L_F2_(26),86af5351-87ef-49c6-bd17-673dceecee5b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6e260432-2b25-444f-8e37-5300eee5a89e,0.949999988079071,false,4000.0,NS_NET146_L_F2_(2),69efeb2d-9845-49ac-8500-5e017a7a64ef,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6ad26a2b-9139-4008-bd91-ba2c8918e1e3,0.949999988079071,false,4000.0,NS_NET126_L_F3_(10),e25387d0-ab9a-406d-bcb4-555414b88b1b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -32d607eb-c3a1-4906-af14-9e7bf12e5a20,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(36),8f80e777-ccbd-4630-b10e-238e824113fd,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -b334c8b6-0f65-4891-a761-5208a39aa9d0,0.949999988079071,false,4000.0,NS_NET126_L_F3_(8),6dcdc87b-a719-416f-9da1-21a701048f3a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cde58a33-fc7e-4fc6-8843-e0c372234be0,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(1),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8c9dbef2-bf3d-4f5b-bc9f-6c867f016c89,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(1),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -08bb3387-aaf3-4005-894b-c195849fcad0,0.949999988079071,false,4000.0,NS_NET146_L_F1_(12),3b879239-20c8-4adf-bd51-92924327ee71,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d3c547e1-cf64-4993-9b55-5ae1b1d4601c,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(7),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3cec8f8c-5a69-4813-a788-11cfbd48f718,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(37),3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -7ebc343e-c3a4-4f6c-a1f8-e81d2ee35d08,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(3),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ae80f9a2-151c-4f24-99bf-928032df3383,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(6),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1610169b-0870-40d0-bc26-259e443b30db,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(4),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -528616f2-81a9-44ad-b103-e36cf5c585d9,0.949999988079071,false,4000.0,NS_NET146_L_F2_(28),ca438ab9-3abc-4416-91d1-df01d1c5fa5a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d28f1e85-c5ff-41c9-93b7-ba4ea62eb56d,0.949999988079071,false,4000.0,NS_NET126_L_F4_(14),d40a1a85-40f2-4ad3-ba58-720d5ba02268,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -60492496-1ab3-4b51-b2c4-245f44a4ce45,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(5),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d7a977d9-d95f-46f1-b993-2ba120bcd366,0.949999988079071,false,4000.0,NS_NET146_L_F1_(23),1a1e63f7-6196-4856-9f4e-876a44bdf2f8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0d6b1569-0276-4f4b-9831-9a99821ff240,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(5),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e8443260-ac5c-4210-9f84-4f40cec0b63b,0.949999988079071,false,4000.0,NS_NET126_L_F2_(13),b32c5f5e-b6b8-41ed-a192-078e1aed05ac,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c79513d2-7d86-45be-ab44-3bd13f502a5b,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(1),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fae24064-659b-4f3b-80f9-c3ecf337cb25,0.949999988079071,false,4000.0,NS_NET146_L_F2_(7),f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9a751f29-69b8-4ca0-b019-3001e50922d3,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(2),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e81df4d7-0935-40d7-be0b-5b696b24d220,0.949999988079071,false,4000.0,NS_NET146_L_F1_(21),92cb5065-2e57-4099-8e29-75cbc0c80370,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -571ee907-5b24-46df-872d-560c5f119800,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(5),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -bfb7a7c2-6426-4392-9070-85dd5210a5cf,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(4),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -20f3da7f-110c-48d6-b6f0-9df6f6dfecbc,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(3),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2848033f-54ed-4507-8d9c-59ec3eb5c3a9,0.949999988079071,false,4000.0,NS_NET126_L_F1_(19),d2aff632-fc26-4595-931c-92e266247ac8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a194f9a2-1380-412b-8285-80ca7ba3a538,0.949999988079071,false,4000.0,NS_NET126_L_F3_(15),ae234bc5-b751-41f2-95ee-b78de124c583,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b925ad8d-edb2-4f59-a302-9b33d21d900c,0.949999988079071,false,4000.0,NS_NET126_L_F3_(16),6232b760-b2e0-485e-9c61-f9721a366a81,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9c5991bc-24df-496b-b4ce-5ec27657454c,0.949999988079071,false,4000.0,HS_NET1_L_S2,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -68ca017a-8327-4a88-a2ab-0c7c20383a3e,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(7),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3eac1fa7-99ba-4f3e-bc50-c7b88a022734,0.949999988079071,false,4000.0,NS_NET126_L_F1_(12),9d10a92f-576d-4777-99ff-59d145924fea,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -477fdcdc-1983-4190-8f83-3f32ce95d1df,0.949999988079071,false,4000.0,NS_NET146_L_F3_(28),c72a08bc-4685-49b1-b8ef-803aebc8c388,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f817f48f-b565-44a8-9cf9-6824c9bbd012,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(6),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8f6178ef-fc51-431e-a91a-1b1802a7373c,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(5),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7063fecf-8601-4a03-8dfe-410b2419133b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(32),fd3b7bb8-3976-4441-9211-745243afd80f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c2402412-97fa-4ca4-aa66-e6e04d010001,0.9700000286102295,4000.0,NS_NET126_L_F1_(36),ca3391eb-ca94-4945-ac72-e116f396f82c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +fa8ef266-5b15-4fdd-a145-71ba95e3463d,0.949999988079071,4000.0,NS_NET146_L_F3_(17),0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +4dd0785a-482c-47e3-bb82-e315083684d1,0.9700000286102295,4000.0,NS_NET116_L_S3_2(6),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9b027eb7-abfa-43ef-8eae-b20b47a631e6,0.949999988079071,4000.0,NS_NET146_L_F3_(18),85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7bbb2c62-36f7-4aab-8802-e3ddf478adf2,0.949999988079071,4000.0,NS_NET146_L_F3_(14),3dec12fd-3dc6-481d-be05-8df9df7f0c5d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ec035312-7214-4060-a502-71cbe819f32a,0.9700000286102295,4000.0,NS_NET136_L_S2_1(1),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +40ddb9cf-46f1-4ee6-8feb-432affbc95bf,0.9700000286102295,4000.0,NS_NET116_L_S2_4(1),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3b9ae1ad-11e5-4fb5-ba03-9027e39c33b4,0.9700000286102295,4000.0,NS_NET116_L_S1_3(8),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +16cd0d9b-bbaa-4d71-ad87-b8e834cf478d,0.9700000286102295,4000.0,MS2_Last_01,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +c806a93a-5f1c-47ba-9c67-31a86ae2658c,0.9700000286102295,4000.0,NS_NET126_L_F1_(39),60173008-809d-4d8f-b06a-3c4a838dd989,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +5b821f32-64d4-436f-9840-40d04872f20f,0.949999988079071,4000.0,NS_NET126_L_F3_(12),eb125953-31d3-4207-adf7-aba3a3790d6f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +dcaeda6e-2dfc-4b53-9c25-cf51d486bb34,0.949999988079071,4000.0,NS_NET126_L_F2_(21),1dee13af-e638-4858-9c69-0069190cd577,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c78b87bd-855b-4741-9e82-c9d814dc5a7c,0.9700000286102295,4000.0,NS_NET116_L_S2_1(7),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +aef6783d-889c-48a2-bdf5-7a9086a73548,0.9700000286102295,4000.0,NS_NET116_L_S1_2(7),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9cc70cc7-642f-4fb1-9782-20a446368645,0.9700000286102295,4000.0,NS_NET136_L_S3_4(1),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2de16d4b-e4e0-41e0-ae33-105930964fcd,0.9700000286102295,4000.0,NS_NET126_L_F1_(31),80d8252b-045f-471a-9638-416ed3f86120,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +07ac3307-90a9-4d74-9434-b977741a8858,0.949999988079071,4000.0,NS_NET126_L_F4_(4),a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +590108ac-416d-44fe-b574-4069cea1dbb1,0.9700000286102295,4000.0,MS3_Last_04,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +df1ebc6d-1252-4496-98bc-50f6ff46a085,0.949999988079071,4000.0,NS_NET126_L_F1_(18),2f64bf67-cee9-44bb-8c13-ff96878932af,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a850c129-beef-48d6-9543-1e217a5349ce,0.9700000286102295,4000.0,NS_NET136_L_S1_2(8),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ceec9e98-5303-4df3-99e8-592509c19d74,0.9700000286102295,4000.0,NS_NET136_L_S1_5(7),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +984470e3-f117-4b8c-932f-caeacf10ff2c,0.9700000286102295,4000.0,NS_NET116_L_S3_1(2),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +94ef12cc-d3bc-42b1-b8b0-6177b93bb25c,0.9700000286102295,4000.0,NS_NET116_L_S3_5(4),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e87a4990-0f33-44dc-bb98-ca7dd38e2493,0.949999988079071,4000.0,NS_NET146_L_F1_(18),2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5fa8b3e6-ed79-4804-997b-4c6eb2c7727b,0.9700000286102295,4000.0,NS_NET136_L_S1_1(5),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +716dc985-7e6d-4681-b4d8-aa9c039a347e,0.9700000286102295,4000.0,MS1_Last_07,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 +c9576364-4a47-450d-a25d-864dd12ef7fa,0.9700000286102295,4000.0,NS_NET136_L_S1_1(3),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a8f50827-29eb-4c27-a60c-fb74c3a5f3fd,0.9700000286102295,4000.0,NS_NET136_L_S3_4(2),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9c4f5e8d-b780-4e31-9bb0-37e975066beb,0.9700000286102295,4000.0,NS_NET116_L_S2_5(8),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3d297678-497c-4620-ad5e-1e70cea8119d,0.949999988079071,4000.0,NS_NET146_L_F3_(5),ce71377d-63ea-462a-9290-67e51946a098,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +895edb06-282c-4965-acab-36c8b86f8f65,0.9700000286102295,4000.0,NS_NET116_L_S2_3(5),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8d84639d-d746-49c5-bc46-33a2aae666e7,0.949999988079071,4000.0,NS_NET126_L_F1_(16),4f78fe6d-3cb2-4d99-8c67-4f14cb626813,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8cd07c7c-1264-4141-b90e-e2b6f39c44be,0.949999988079071,4000.0,NS_NET126_L_F4_(9),119d270a-ff22-4fdb-8214-cb5b336790bf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0c5d8e98-e059-4768-be56-73e0e8914092,0.9700000286102295,4000.0,NS_NET136_L_S3_1(3),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +06747e73-c108-40d5-8ce6-6538e38b4ef2,0.949999988079071,4000.0,NS_NET126_L_F1_(6),99e26ef8-75e2-46f3-aafc-6287bf5e3905,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5d09da2a-e37c-4cca-93fd-0bf61918a2b2,0.9700000286102295,4000.0,NS_NET136_L_S2_3(4),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7ce95168-5af2-4274-943d-601176146ce8,0.9700000286102295,4000.0,NS_NET116_L_S1_5(8),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +188c5841-af7d-48ea-95ac-7178dc7407c9,0.9700000286102295,4000.0,NS_NET116_L_S1_1(8),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1d96cdde-d9d3-4d47-b3a4-60474b9caa92,0.9700000286102295,4000.0,MS2_Last_05,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +130b7cb2-f379-4d6c-b71d-404d87260133,0.949999988079071,4000.0,NS_NET146_L_F2_(19),636dec7c-4242-46e8-b7ae-db7e5a28c39c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +b4b07036-0d49-4f8f-9194-0181e11d0470,0.9700000286102295,4000.0,NS_NET116_L_S2_3(7),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0442c234-22f8-4022-8daa-2f191e4a6bf3,0.949999988079071,4000.0,NS_NET146_L_F1_(24),205fcee1-928c-4374-950c-34575f07fa49,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +29a47779-6c11-490f-a0b2-e33c6c7a06b3,0.949999988079071,4000.0,NS_NET126_L_F3_(25),1bf26b4d-03cc-4490-8c33-d3db8597d807,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +2b20b17c-774b-4b41-a1e8-ef9d8f39b0e3,0.9700000286102295,4000.0,NS_NET136_L_S2_5(8),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +70fcdefd-49c1-455f-9ceb-013dcbf26887,0.9700000286102295,4000.0,NS_NET116_L_S1_3(1),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5d842fa6-eb7a-4f88-8dd3-f7eac01afaad,0.9700000286102295,4000.0,NS_NET146_L_F1_(29),867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +d7a1b657-6d15-45c7-8d04-d2eef97429b0,0.9700000286102295,4000.0,NS_NET116_L_S1_1(6),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e17786aa-4cf5-46d6-ad37-96f4d4502b1f,0.949999988079071,4000.0,NS_NET146_L_F4_(8),6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c22e9a91-f522-446d-8dc8-ae3e720a5053,0.949999988079071,4000.0,NS_NET126_L_F2_(19),52e15712-2572-442a-b22c-add48af95115,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1ec03866-9e92-43b9-9c13-1501533c8e1e,0.949999988079071,4000.0,NS_NET146_L_F1_(26),154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +26bf78c9-48ea-4004-9148-eaee014d6f09,0.9700000286102295,4000.0,NS_NET116_L_S3_2(7),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0a8bf78c-1e57-44f1-baee-0a8d8383875c,0.9700000286102295,4000.0,NS_NET136_L_S3_3(1),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5f58fa15-aff8-4a9b-bfc0-8ef690d6dba3,0.949999988079071,4000.0,NS_NET146_L_F2_(27),b179c38b-5af0-4304-84b1-1dc03314fd80,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a9f8dce4-b664-4bbd-9e52-c2ca6aa669aa,0.949999988079071,4000.0,NS_NET146_L_F1_(19),1f040625-ad1d-409f-bd7e-944c4d805e46,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +e3e2d73e-3dfc-42ae-ad50-fadebdf38868,0.949999988079071,4000.0,NS_NET126_L_F1_(26),3802b603-d08d-4031-b7d7-e29734bcc122,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +62800519-5f5f-4081-ae89-9b2b0784a714,0.949999988079071,4000.0,NS_NET126_L_F2_(6),9d7038e9-5bcc-4676-bead-46c4f1291ba8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1100ef62-0d33-46df-8ac7-c949d843217c,0.949999988079071,4000.0,NS_NET146_L_F3_(22),616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +33cd1941-51f2-425a-8f4d-67e00d0b1876,0.9700000286102295,4000.0,NS_NET136_L_S3_1(6),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9cff3e75-4374-48fc-a20a-27968427dc1a,0.949999988079071,4000.0,NS_NET126_L_F3_(5),f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +2485a766-3e5c-4950-b598-0c3b84c747a7,0.949999988079071,4000.0,NS_NET146_L_F2_(4),369cffa5-bcee-4489-8193-1d9b10230eca,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5312d132-f5bc-4c34-98ca-16221a0111e2,0.949999988079071,4000.0,NS_NET146_L_F3_(2),0b2a3b46-5e43-4879-973e-d8fb96429d8a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8bd4fb73-bc7f-45c9-b1e6-916afd2e7359,0.9700000286102295,4000.0,NS_NET136_L_S1_5(4),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +05124256-80e0-43cf-a3c5-dc565ef38a07,0.949999988079071,4000.0,NS_NET146_L_F3_(27),55caf2ec-a21b-4afd-8830-1e4009cce396,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +283a1252-a774-4b04-bfcf-fe8879065982,0.949999988079071,4000.0,HS_NET1_L_S4,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 +09fb83df-cd0f-4dca-a5b6-edc18d662e93,0.9700000286102295,4000.0,NS_NET136_L_S2_5(7),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +f4536a0c-33d2-4c57-918c-0ebdf768265a,0.9700000286102295,4000.0,NS_NET116_L_S3_3(1),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +27f66b7b-f1ac-46e4-9c11-b9ff0d0f2990,0.949999988079071,4000.0,NS_NET146_L_F3_(31),b7a5be0d-2662-41b2-99c6-3b8121a75e9e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8df8d6b5-ef51-4901-aaed-bf29c912acd5,0.949999988079071,4000.0,NS_NET146_L_F3_(21),a4a44d93-48d6-4b87-8053-87fe0778e75c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d75d06ae-7ac0-491c-87ed-e1bb625e349a,0.9700000286102295,4000.0,NS_NET136_L_S2_4(3),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3ac82a59-756c-4ead-b34e-02957fc69ec4,0.949999988079071,4000.0,NS_NET126_L_F1_(21),14ae9865-cb9b-4518-9f2a-c0fda3455a42,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +96da3f13-3c72-4e9a-b433-a319a9018b40,0.949999988079071,4000.0,NS_NET146_L_F2_(21),bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +57d74ff0-f6c4-4932-93c5-9837d101297c,0.9700000286102295,4000.0,NS_NET136_L_S2_2(2),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a2d372db-d13c-4d3c-a987-ccf4138d43f2,0.9700000286102295,4000.0,MS4_Last_07,898d8295-bf35-4079-9374-99b059c2c956,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 +182f6157-58ea-4fe2-92a2-90845427fbd0,0.949999988079071,4000.0,NS_NET126_L_F3_(13),f29859be-c6e7-4cf9-84d7-239eb98a9e65,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ae603fbc-a262-47ab-bea7-251fd61f3964,0.9700000286102295,4000.0,NS_NET116_L_S2_5(4),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2e7dda3e-4bd4-4bb7-8e15-260f709ab92e,0.9700000286102295,4000.0,NS_NET136_L_S3_4(3),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b5c6af22-2d56-4bd1-8235-74db06106eba,0.949999988079071,4000.0,NS_NET146_L_F3_(23),ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7f642ba6-1492-4bf6-9857-113c60a18709,0.949999988079071,4000.0,NS_NET146_L_F3_(11),e2267696-669b-48e8-b43a-37d0db95011d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +497de722-6c3b-49a5-8f1c-125c76a4a9cd,0.9700000286102295,4000.0,NS_NET116_L_S1_5(5),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1b64ea94-b338-40aa-92c8-144c7caaa8c2,0.9700000286102295,4000.0,MS1_Last_05,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +086208d0-52d4-4198-9f3d-966aa7a5557e,0.9700000286102295,4000.0,NS_NET136_L_S3_5(7),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +fc5139da-5e61-44c5-8843-4f76df7c6e33,0.9700000286102295,4000.0,NS_NET146_L_F1_(39),904c7476-5f16-4ec2-9138-7d5e32d38a3b,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +abe6ade3-f1c5-41c0-a850-1292506f3837,0.949999988079071,4000.0,NS_NET146_L_F3_(10),4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +cbb8c279-5b80-4583-bec3-b878ab0c2755,0.9700000286102295,4000.0,NS_NET136_L_S1_5(1),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b431628f-bc6f-49ca-9f23-19fe41aadb53,0.9700000286102295,4000.0,NS_NET116_L_S3_3(2),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +6069eb20-4107-483f-8144-5bd479e32d98,0.949999988079071,4000.0,NS_NET126_L_F2_(12),9d02ea80-98d8-4cd0-a635-9104a14a56dd,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c81fa33a-1c21-4646-b43f-b9a93baf04ad,0.949999988079071,4000.0,NS_NET146_L_F2_(5),0228ffcd-f6bc-47c8-b26c-fcc0abacd963,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +660e69f8-cba2-45d0-9d0c-f7d5be09451d,0.9700000286102295,4000.0,NS_NET136_L_S2_2(6),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ee33524a-6c8e-4c12-8b40-7a116e386dbd,0.9700000286102295,4000.0,NS_NET116_L_S2_5(3),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +4c6e6e4f-d4cb-4de3-b406-ff3ec1d50280,0.949999988079071,4000.0,NS_NET146_L_F2_(3),0170837a-1876-45f9-a613-666f9991964d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d85bcbda-20fb-481b-bb8d-aead291aa3c1,0.9700000286102295,4000.0,NS_NET136_L_S3_1(7),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +86754cd3-ba74-49fb-bf3b-5702b4fd5928,0.9700000286102295,4000.0,NS_NET146_L_F1_(33),543f7e9f-b9be-486b-b365-2bae79010758,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +4dcec977-6c98-4bd2-b6f2-dc32d9c61cf2,0.9700000286102295,4000.0,NS_NET136_L_S3_3(4),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1a155e7e-9636-4760-a84d-430e293142cc,0.9700000286102295,4000.0,NS_NET116_L_S1_4(4),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e90dfb70-2372-40d3-9577-01d2145eb59d,0.9700000286102295,4000.0,NS_NET116_L_S2_5(7),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +85bfce37-1c9a-4e5a-84ec-47faf7b13821,0.9700000286102295,4000.0,MS4_Last_02,174fb4b2-4f9e-415c-bfee-d850ef751307,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +16b0791d-eeff-4b12-b1fe-2961bf0fd4c2,0.949999988079071,4000.0,NS_NET126_L_F4_(10),857c264a-7072-4bb7-af56-2f01539b2a2e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +aa1ce00f-1a17-4172-9040-9ba15b179a15,0.949999988079071,4000.0,NS_NET146_L_F4_(16),9f7599de-c488-46c5-b053-1279a511f7b9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +34671961-b8a8-49f9-a99e-c7b5a33c600e,0.9700000286102295,4000.0,NS_NET116_L_S3_4(2),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e4f045d6-7f37-4871-b357-621d97b9c2a8,0.9700000286102295,4000.0,NS_NET136_L_S3_4(8),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +58cb8168-7a34-41e2-9db6-88a67287c5e9,0.949999988079071,4000.0,NS_NET146_L_F2_(8),792b505c-87ab-4665-a31d-b6035c5ece70,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +35555bee-2634-45cb-888b-d850767955a6,0.9700000286102295,4000.0,NS_NET116_L_S1_1(3),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +6322878b-9db6-4481-858b-64dbd00dc091,0.949999988079071,4000.0,NS_NET126_L_F3_(26),dc022eec-16b0-4a64-a2f5-498d81aca71e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0cf1f5c4-996b-4422-b61b-b4fbc840d004,0.949999988079071,4000.0,NS_NET146_L_F3_(24),773aebe4-fc03-46be-8209-0213e2760a8e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8ef945c1-4586-4755-98a8-bff3ee581620,0.949999988079071,4000.0,NS_NET146_L_F1_(7),67c1746c-3af8-403f-983e-1c7c047383df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +61c9c21b-38a5-45b3-8a41-60df0bb698ee,0.949999988079071,4000.0,NS_NET146_L_F1_(22),1ee9de9a-0095-4b58-beeb-e56fb908844a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +81e75c16-c8a4-4328-bc97-635049829f57,0.949999988079071,4000.0,NS_NET146_L_F2_(24),970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +53ae546b-c94f-4619-a613-3291f26fb78b,0.949999988079071,4000.0,NS_NET146_L_F3_(4),f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c73800aa-9f9e-46da-83eb-82a88b2ab502,0.9700000286102295,4000.0,NS_NET136_L_S2_5(4),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8b9c12d1-5398-4c42-80a6-9604978de820,0.949999988079071,4000.0,NS_NET146_L_F4_(3),b5548457-5923-4d52-b3c9-fdb75a1df98e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +48ae1ea4-e001-4152-b54c-320fc9f35e92,0.949999988079071,4000.0,NS_NET126_L_F4_(5),de5ee252-ebb6-42b0-875c-77ae557ffbf6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9018c4d9-5b86-4c11-b5b3-2c26e756ad0e,0.949999988079071,4000.0,NS_NET126_L_F2_(20),de756ddb-793d-4b2d-959c-59d938a8f61f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3a2470e0-1d3f-4f33-990d-20c8b9611ac5,0.9700000286102295,4000.0,NS_NET136_L_S1_1(7),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1e79cec6-2546-4e64-92fc-c509d4eea216,0.9700000286102295,4000.0,NS_NET126_L_F1_(32),49b511fa-8cff-45f4-9a59-54faaaf90abf,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +a1af0e38-339c-491c-94d8-446cf662d89b,0.9700000286102295,4000.0,NS_NET116_L_S3_4(1),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +91d402b7-e8c7-4919-bdbd-93c1c8492920,0.949999988079071,4000.0,NS_NET146_L_F4_(14),f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +521d8738-0393-4519-8b31-52ed06c9ed18,0.9700000286102295,4000.0,NS_NET116_L_S3_1(6),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +038ee933-439a-4705-b526-0373a4b0b16a,0.9700000286102295,4000.0,NS_NET136_L_S3_1(1),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a964d9b8-a035-41df-86c0-4c5306af2158,0.9700000286102295,4000.0,NS_NET116_L_S2_4(7),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c67f5f1a-7adf-4715-a0ee-1bc0156b7bb9,0.9700000286102295,4000.0,NS_NET116_L_S3_3(6),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8decd09e-f82a-4f38-8946-14a9b437303f,0.949999988079071,4000.0,NS_NET126_L_F2_(18),e80aa2db-f32c-410d-96a1-a32e03222568,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8736f13d-fcf4-486a-8225-259bfd9bd206,0.9700000286102295,4000.0,NS_NET136_L_S1_3(8),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0211454c-9be4-470f-9cf5-cef9b87cb640,0.9700000286102295,4000.0,NS_NET116_L_S3_2(5),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9b12597e-619f-4953-86c6-21f8d262bfbd,0.949999988079071,4000.0,NS_NET146_L_F4_(6),49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +bedce1e8-d623-469a-b7ff-bb618588bb3e,0.949999988079071,4000.0,NS_NET126_L_F2_(2),5981fe65-3c92-4a78-af92-1461904046d0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +080cbc7e-6acf-434d-ae38-b693f19edc69,0.9700000286102295,4000.0,NS_NET116_L_S2_3(4),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7b187641-d6fa-49f2-afd6-b03125c1acea,0.949999988079071,4000.0,NS_NET126_L_F2_(22),177a20fe-83b1-46df-94a3-4faa54348d10,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +4336ad38-37d0-4bba-914e-b2ebec0cc8ab,0.9700000286102295,4000.0,NS_NET116_L_S1_5(2),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c098f9cd-09c8-4eef-8941-652cb8365992,0.9700000286102295,4000.0,NS_NET136_L_S3_1(4),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c9acf3dd-2d38-47f1-9449-421104c47171,0.9700000286102295,4000.0,NS_NET116_L_S3_1(8),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +f855cedf-e3f0-4c0f-addd-c57deb4f9e03,0.9700000286102295,4000.0,NS_NET116_L_S3_5(2),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +cb0661c0-15fb-4475-9e0b-fbcf734e19c7,0.949999988079071,4000.0,NS_NET146_L_F1_(4),dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +75b3f626-a1e0-47d6-9d2f-658500ac7630,0.9700000286102295,4000.0,NS_NET146_L_F1_(38),32507a10-1eed-4a3f-820c-bc187f3b052e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +d5b04d0c-bdda-450b-b939-aec8af923eea,0.9700000286102295,4000.0,NS_NET136_L_S3_2(5),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +040e8122-1873-4622-952d-87ddef148e7e,0.949999988079071,4000.0,NS_NET126_L_F2_(1),196fe620-d4a7-45f9-93ad-0579e2bcbb9a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8052a8a9-d5a5-481e-a772-87f71ee8fbb9,0.9700000286102295,4000.0,NS_NET116_L_S2_3(3),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +d3b5447b-a2ba-4f17-a10c-bd6354ab2338,0.9700000286102295,4000.0,NS_NET136_L_S1_2(5),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +08a60d08-3a12-4263-a831-274f3b374cbb,0.9700000286102295,4000.0,MS3_Last_03,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +bc54e624-8931-4188-9405-950e8deae723,0.9700000286102295,4000.0,NS_NET136_L_S1_3(6),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +62fad34c-a778-4140-a13d-dee5f0af255d,0.9700000286102295,4000.0,NS_NET126_L_F1_(33),b425b28e-48a8-4ec4-a15a-387fcfb79895,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +dc34b951-89f4-4e28-8f04-3e6522bfa0c9,0.9700000286102295,4000.0,NS_NET116_L_S1_4(7),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c1049c54-1558-4d61-b47f-004b17e38770,0.949999988079071,4000.0,NS_NET126_L_F4_(16),b8fa1f73-223c-4b08-a140-44f12484cce3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +07ba8eae-b76d-4034-b378-a3ef8134fc2b,0.949999988079071,4000.0,NS_NET126_L_F2_(27),daed3552-e382-4153-95be-97f17e2c53e5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9413bafe-4537-4247-ae22-8b3d03bf6309,0.949999988079071,4000.0,NS_NET146_L_F1_(16),09ac8949-2b79-41d7-b56f-a58f20036df2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ec81e030-4dc6-462a-9218-b5c791e82da7,0.949999988079071,4000.0,NS_NET146_L_F4_(5),d7023c15-adb7-4d56-9f86-b182611a47ef,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +2c90248b-ce63-492c-a2e1-2bd66a3f3287,0.9700000286102295,4000.0,NS_NET136_L_S3_5(8),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1107328f-3c13-4f0b-bde3-1d9580cf40db,0.949999988079071,4000.0,NS_NET146_L_F3_(12),f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8387b2f1-1e5f-4d85-8ca1-a78a44b09788,0.949999988079071,4000.0,NS_NET126_L_F2_(5),c8b1fd67-2f03-4153-8ed3-284e7a721ec5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +73c923b1-49ef-49b6-863f-8badb0915f70,0.9700000286102295,4000.0,NS_NET136_L_S1_5(2),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +f60efe06-32af-466f-9359-52cc8a59b985,0.949999988079071,4000.0,NS_NET126_L_F2_(17),c5457e35-ad81-4427-9d3a-99e4c44ccae8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +12f5a119-679c-4198-b133-a4596816f6d1,0.949999988079071,4000.0,NS_NET146_L_F2_(14),9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +acc82c39-9615-4a9b-83a5-76c4704cbee0,0.949999988079071,4000.0,NS_NET146_L_F3_(13),bdf97a4d-622c-4251-8183-8b1a696f376e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +66f54dc9-83dc-435d-9c21-3361838e88d6,0.949999988079071,4000.0,NS_NET126_L_F3_(14),df8df8d2-3494-4da9-8d1b-f913d15f520f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +f2f13d1d-3643-4d94-b519-94ea266b8816,0.9700000286102295,4000.0,NS_NET116_L_S3_5(3),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +180167d5-7277-407f-a269-da5d2f1e30f0,0.9700000286102295,4000.0,NS_NET136_L_S2_2(3),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +99a0a508-d25a-4136-8300-40a676832d35,0.9700000286102295,4000.0,NS_NET136_L_S2_3(2),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +146fba6b-bbbe-4f3b-ba51-2f3a2c31b118,0.949999988079071,4000.0,NS_NET126_L_F1_(22),c317a6cd-428b-4c36-8233-91d0c4e2717a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +96dbdf3b-98cd-45de-92e0-3743c609b08e,0.9700000286102295,4000.0,NS_NET136_L_S1_4(2),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2c970df7-5644-4665-835a-825b8df8aaf4,0.949999988079071,4000.0,NS_NET146_L_F4_(4),00d4a837-f09c-41df-bed1-dfdb78387116,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d24c0d3d-bfe6-4ae6-b707-eb781d7f7d2a,0.9700000286102295,4000.0,NS_NET136_L_S3_1(8),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9367b934-d77d-4f3b-b5e6-0692ec6789a3,0.9700000286102295,4000.0,NS_NET116_L_S2_2(7),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +397c7198-feee-4f46-9149-1ef9d31d9ba2,0.9700000286102295,4000.0,MS3_Last_01,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +6993add7-7f94-4f50-b87a-0b77dc41c421,0.9700000286102295,4000.0,NS_NET116_L_S1_3(6),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a9bb2858-c56d-4594-a364-fcfaf448d0e5,0.9700000286102295,4000.0,NS_NET116_L_S3_3(7),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +54f64be5-5966-4c66-8cfa-dd688e59e992,0.9700000286102295,4000.0,NS_NET116_L_S3_1(4),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +bc617ea3-3b85-4ba8-8b12-f243f077d6bb,0.9700000286102295,4000.0,NS_NET136_L_S2_4(4),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +513e31ea-560d-4e33-b1ec-c1aca5f63339,0.9700000286102295,4000.0,NS_NET116_L_S1_3(5),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5f825da0-bf7e-4846-9601-9049cac0f958,0.9700000286102295,4000.0,NS_NET136_L_S2_1(3),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +cdd0ae9a-c06e-4234-aea3-255f359dbe64,0.949999988079071,4000.0,NS_NET146_L_F3_(16),3ec2f2a0-36a3-4d11-88ee-cc4df001e876,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +50c89980-8da2-4e98-8602-e2f0b560e7c4,0.949999988079071,4000.0,NS_NET146_L_F1_(8),d5489e1b-0e7e-4ca9-a362-09c23576a622,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a00956d5-6648-484c-a485-b3491c5181c2,0.949999988079071,4000.0,NS_NET126_L_F1_(20),36cda100-86ae-4a20-ac71-20af603ac0cf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ab77ac85-7990-4b93-a4e7-6fb812ad345a,0.949999988079071,4000.0,NS_NET146_L_F3_(3),8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +6559c5f4-c9ed-4f01-af36-72d18f04ca9a,0.949999988079071,4000.0,NS_NET126_L_F1_(15),41c0087f-ce27-4da3-97d2-92d711b639b4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +bab50a41-657d-454b-91eb-3e64de845098,0.9700000286102295,4000.0,NS_NET136_L_S1_3(4),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +4958e21c-cf9d-4bae-ad3f-a1612171c398,0.949999988079071,4000.0,NS_NET126_L_F1_(7),fc7821d2-ac64-483e-b520-38d9971f4db0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3025fcc5-7a14-4bbe-93a1-0b2533306ea1,0.949999988079071,4000.0,NS_NET146_L_F1_(11),666757e2-292e-473c-ac9c-04c0786574bc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +53347503-af44-482a-8b97-d1b638bb3634,0.949999988079071,4000.0,NS_NET146_L_F2_(23),ce513b50-b57a-41e2-b744-4c0fd2ae97d0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0de47e33-a4fb-4a86-839d-ec9ad49a8414,0.9700000286102295,4000.0,NS_NET136_L_S2_1(6),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e035cc33-0a53-4dc4-b35d-f3f44764a5aa,0.9700000286102295,4000.0,NS_NET136_L_S2_4(1),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +903c6f31-7c78-4d1e-b4ee-bf0dcbb9e938,0.949999988079071,4000.0,NS_NET146_L_F1_(10),6c24b464-790a-4aae-bb11-766718f07cd5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +422a643a-04d2-480b-b107-e8582b36e641,0.9700000286102295,4000.0,NS_NET136_L_S2_4(7),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9993f48a-8ee2-49b7-af31-afbfa3690c45,0.9700000286102295,4000.0,MS3_Last_07,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 +f870937a-6644-4ef8-9bfd-15835471e775,0.9700000286102295,4000.0,NS_NET126_L_F1_(30),519ace7e-fd3f-4797-b14b-36c1694b00cd,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +ed173f7f-071e-4687-b7fe-b59616148ee3,0.949999988079071,4000.0,NS_NET126_L_F4_(17),7125de08-1d28-409a-8b23-023a0294def5,,,,"cosPhiFixed:{(0.00,1.00)}",0.10000000149011612,h0 +eb8622e3-0dd8-42e4-ab49-23b5cec0eb9c,0.9700000286102295,4000.0,NS_NET116_L_S3_4(8),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +038c506d-59b4-406b-88b0-7f74719c55e7,0.9700000286102295,4000.0,NS_NET136_L_S3_5(3),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +25be1a94-a0cc-4de5-acc4-097d9e8639ff,0.9700000286102295,4000.0,NS_NET116_L_S3_3(8),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +449eaff2-92ca-4075-ae9f-2d517e7f0642,0.9700000286102295,4000.0,NS_NET116_L_S2_3(6),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +d08a8e2d-0ab1-4d89-b111-6a8efe2a76af,0.9700000286102295,4000.0,NS_NET136_L_S1_1(1),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a1a11124-0e04-4a0c-bab9-eb68c9f20a9e,0.949999988079071,4000.0,NS_NET126_L_F3_(28),e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5596dd40-f34f-4ec4-bf80-17fcf122a67b,0.9700000286102295,4000.0,NS_NET136_L_S1_5(6),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7f6b1274-7b1b-4313-8027-6fc4a31f34e0,0.9700000286102295,4000.0,NS_NET116_L_S2_4(4),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9abc4242-f58f-474a-99fc-613e083e2589,0.9700000286102295,4000.0,NS_NET116_L_S1_3(4),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e733ea74-1c51-4592-9fb3-cc2d0a007450,0.9700000286102295,4000.0,NS_NET116_L_S2_4(3),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +04063357-c213-4cc9-a870-9cc11ac4ad92,0.9700000286102295,4000.0,NS_NET116_L_S1_1(7),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +f231c4e2-2872-4d83-b486-894d846dc4d7,0.949999988079071,4000.0,NS_NET146_L_F2_(10),41414318-73e3-4bdc-8147-570a96b28d37,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +6f97361f-d4e6-45b5-9bf2-d880d42eae25,0.949999988079071,4000.0,NS_NET126_L_F3_(17),462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7794309a-7ecd-436d-ae38-51bbdab5df11,0.949999988079071,4000.0,NS_NET146_L_F3_(6),01bdd8b2-145f-42b3-80e3-a2366dea1044,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a6ce4a93-174a-4ca0-92bb-f09abc579d81,0.9700000286102295,4000.0,NS_NET136_L_S3_2(1),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2d758bef-0a8a-4dac-aca6-556ace61ec84,0.949999988079071,4000.0,NS_NET126_L_F3_(32),7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +beb7a9e2-4394-4808-af58-d984ab871f98,0.9700000286102295,4000.0,NS_NET116_L_S2_2(3),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +66f00451-3542-41f2-adcf-24068c870afc,0.9700000286102295,4000.0,NS_NET136_L_S2_1(2),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +80d0b6a9-8d08-4262-81a0-83b13beaad45,0.9700000286102295,4000.0,MS1_Last_02,32b3bb19-c52a-4a19-890a-94a8918d38a9,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +8d1ee87d-73a7-46eb-b174-602683d702d9,0.9700000286102295,4000.0,NS_NET146_L_F1_(28),012c9eee-86c2-494c-adcc-bbfc481e4a46,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +11bc6378-bb54-4ddb-846f-1488baaf1c00,0.9700000286102295,4000.0,NS_NET116_L_S3_3(4),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5ab2e1b6-7c4b-4cba-8528-94bda71c3dcd,0.9700000286102295,4000.0,MS1_Last_03,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +2a9149a4-4778-41d8-8865-090499833016,0.9700000286102295,4000.0,NS_NET116_L_S2_1(1),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +79a2d93b-3583-4e90-bc40-9e7ff84bf0a2,0.949999988079071,4000.0,NS_NET146_L_F2_(15),d82fae59-844a-4c85-997e-326dd876137c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +95be2f70-bd5a-4785-983c-2aa7eba6546b,0.949999988079071,4000.0,NS_NET146_L_F3_(26),bd288184-99d8-4233-bb3d-484f3922200a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +f3168cab-a847-4314-9bf9-4dbe269c1c3c,0.949999988079071,4000.0,NS_NET146_L_F3_(8),6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +2eca146b-7c7e-47fa-a0be-807b7fc72fd5,0.949999988079071,4000.0,NS_NET126_L_F3_(4),bf7e7268-2fb6-4948-ace6-9037ae148fa3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +89971afc-919e-4153-92b2-f0a43ad0e535,0.9700000286102295,4000.0,NS_NET126_L_F1_(27),c81d6099-66b2-45d8-b8a4-c19ceb862f6e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +a8e26f05-54f0-4da7-abfa-228661833e03,0.949999988079071,4000.0,NS_NET126_L_F3_(18),9502fd3e-c00f-48fa-8b56-c72d21f80f3c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +72d00bfa-4967-485a-b5a3-519a6826fa9c,0.9700000286102295,4000.0,NS_NET116_L_S1_2(4),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +de2b452a-9eee-4481-b0f0-72d9ab56a4b5,0.9700000286102295,4000.0,NS_NET136_L_S2_3(1),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +924dbbfa-abb0-42b2-83a9-15897bf5806e,0.9700000286102295,4000.0,NS_NET136_L_S3_3(5),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8d326225-ff42-40ab-b58e-adc0cb32c9ff,0.949999988079071,4000.0,NS_NET146_L_F3_(9),6570535c-0d2e-4846-9951-21559902f67a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +dd893829-b4af-4cf1-9d70-79ae68b91bf0,0.9700000286102295,4000.0,NS_NET136_L_S1_4(6),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ab476579-7fb3-408f-a065-73f6d2140fb2,0.9700000286102295,4000.0,NS_NET136_L_S3_5(5),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7b8abd75-9967-4505-b919-3accd78908e4,0.949999988079071,4000.0,NS_NET146_L_F3_(19),810bebb0-0d5c-4899-b213-3207be661248,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +58b9f934-f7c4-4335-9894-3c80d9e6b852,0.949999988079071,4000.0,HS_NET1_L_S3,33f29587-f63e-45b7-960b-037bda37a3cb,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 +b8ad6547-aa55-4fca-ad0c-b5a0078b2203,0.949999988079071,4000.0,NS_NET126_L_F1_(14),b7baa286-cbe2-4143-a08f-4e025af47529,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7e337720-59f5-4d3f-bf95-71c6228587f3,0.949999988079071,4000.0,NS_NET146_L_F1_(17),0d94a5ea-3a13-48ba-a27f-b2903841c334,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d4d3ea3e-cce2-480b-9a7c-bbdd1a7c96ad,0.949999988079071,4000.0,NS_NET126_L_F1_(8),f717b05b-f4e7-43d9-af9e-638e2badee5a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3b51a0c6-060f-40ce-b207-6146fde8e724,0.9700000286102295,4000.0,NS_NET136_L_S2_1(8),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +89f93344-8dc3-46ea-805b-8c43bffc7577,0.949999988079071,4000.0,NS_NET126_L_F4_(15),55b3d03f-2204-4ab3-84cc-a28476868c9d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +dc65cd27-84a2-49a6-aa22-d9c1968a72b4,0.949999988079071,4000.0,NS_NET126_L_F4_(8),75f2dfb9-75a0-496d-9c44-79e7df54c1df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ff0b995a-86ff-4f4d-987e-e475a64f2180,0.9700000286102295,4000.0,NS_NET116_L_S1_2(1),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7c03d124-df4a-46c3-9b74-66bd888f750e,0.9700000286102295,4000.0,NS_NET116_L_S3_1(7),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7a17120f-8522-4eca-95aa-f6b5d985103b,0.9700000286102295,4000.0,NS_NET116_L_S3_4(7),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +86cbef43-bde0-41a6-a684-f42fdb4ba527,0.9700000286102295,4000.0,NS_NET136_L_S1_4(4),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +f880a0dd-991c-4646-a0a4-c6c877171870,0.9700000286102295,4000.0,MS4_Last_04,890f2162-b4cb-49e7-a16f-4b552c5e245c,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +c7a0e7d2-276f-41e7-bfbc-f11fac26a0e1,0.9700000286102295,4000.0,MS3_Last_05,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +32be027e-1ee2-41bc-9fe5-18daa3613efa,0.949999988079071,4000.0,NS_NET126_L_F1_(2),a7ebd30b-b843-405f-9fae-ca6b489601f9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5f1b7472-2a01-4203-8318-878b1a4460c5,0.9700000286102295,4000.0,NS_NET116_L_S3_4(5),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +cb65c2bc-fb36-4338-9a13-34bd999f4fa5,0.9700000286102295,4000.0,NS_NET116_L_S2_4(8),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a12570e4-afeb-4af8-a86c-9e804eea4886,0.9700000286102295,4000.0,NS_NET116_L_S3_5(1),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3ce5abcb-0eb1-403f-9fca-90d255619cc5,0.949999988079071,4000.0,NS_NET146_L_F2_(13),49e14db3-a4bc-464a-b606-653ac8a604dd,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1308b834-4b0c-4c91-b5fc-8529368005ea,0.949999988079071,4000.0,NS_NET146_L_F2_(25),011e3794-3341-4376-839c-3f5a452e15ab,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9f0d4b5f-7563-40bc-b20e-bc54a96e9019,0.9700000286102295,4000.0,NS_NET146_L_F1_(30),9f95c733-71e2-4bf0-a27a-70144518ea2c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +8f0150c7-b217-43ca-85d5-c1e4d2e903d0,0.9700000286102295,4000.0,NS_NET136_L_S3_1(2),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +67379832-1cfb-4015-ac96-0fe499463c42,0.949999988079071,4000.0,NS_NET126_L_F4_(3),1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +12c58b41-2ebb-4bc0-8ca2-a3693d5d5f8b,0.949999988079071,4000.0,NS_NET126_L_F3_(1),2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0610df61-bdb9-45d1-ab48-a72dca4079c4,0.949999988079071,4000.0,NS_NET146_L_F1_(1),4f28e734-5148-4caf-ac64-270231740cbf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +28a6872b-abf5-412e-b887-b0503addaa7a,0.9700000286102295,4000.0,NS_NET116_L_S3_3(5),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +599e7b5f-7a78-4bb4-a3c3-e6f2779bbda2,0.9700000286102295,4000.0,NS_NET136_L_S3_5(2),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0944b3b6-15e3-4704-b50d-fa1e407ade7e,0.9700000286102295,4000.0,NS_NET116_L_S1_3(7),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3a5e7e35-53ad-48da-89b9-98342a9875ac,0.9700000286102295,4000.0,NS_NET136_L_S1_3(7),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c3434742-e4f0-49e5-baa7-c1e3045c732c,0.9700000286102295,4000.0,NS_NET116_L_S1_5(1),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +eed8fa68-08b5-49f3-a6d7-2632fe7b13b9,0.9700000286102295,4000.0,NS_NET116_L_S3_1(3),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3e3225f9-2dd9-402d-9a0d-1d8cde60b1f6,0.949999988079071,4000.0,NS_NET126_L_F2_(4),cdda8fa5-9a18-4f3e-951d-1ec0009191b4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +245666cd-881b-44ca-9b47-536c96e15bce,0.9700000286102295,4000.0,NS_NET116_L_S2_3(2),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9b4f4a8b-3aaa-4b77-afdb-049d2b83869b,0.9700000286102295,4000.0,NS_NET136_L_S3_4(6),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +d95c7612-af94-4ac4-94a0-a1dca839f33a,0.9700000286102295,4000.0,NS_NET116_L_S3_2(4),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5c3fb165-f374-44fa-802e-e82e5a2538f0,0.9700000286102295,4000.0,NS_NET136_L_S2_2(4),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +550f9346-fe14-46ef-bd54-00980834e0d6,0.9700000286102295,4000.0,NS_NET126_L_F1_(34),17f7a477-d9c7-4f58-8ba0-1a2694dcc874,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +be985e5e-19b6-49c4-bb64-f37a627be13b,0.9700000286102295,4000.0,NS_NET126_L_F1_(35),c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +9e5845cb-9ad1-42c6-8630-724375a4e323,0.9700000286102295,4000.0,NS_NET136_L_S1_1(8),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +10963efb-44d7-49bf-b926-c2d29239de60,0.949999988079071,4000.0,NS_NET126_L_F2_(3),8f422111-67d7-42f0-9f80-fbd0ec64c4fc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +11e776fa-ecc1-4332-821f-d7e56758b988,0.9700000286102295,4000.0,NS_NET116_L_S2_2(1),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +689527be-31a0-4791-970d-8542e367401c,0.949999988079071,4000.0,NS_NET126_L_F2_(23),9b509c7d-4647-40fd-b03e-7ab919215cc6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a610a50c-de39-46e6-b53b-95e3868d1072,0.949999988079071,4000.0,NS_NET126_L_F2_(11),6678c226-c5d2-4ce3-9728-dc1163be799f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3857ce77-a630-4b43-a1a1-6bebc0817e1d,0.9700000286102295,4000.0,NS_NET136_L_S2_4(2),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +63fb1af5-91e5-472b-b798-b2846cf701ba,0.949999988079071,4000.0,NS_NET146_L_F2_(16),8f2ba96f-a47a-46d3-b5a1-d19de0a32419,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1a88ba6f-9005-432d-9a8f-54a48c90015a,0.9700000286102295,4000.0,MS4_Last_05,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +6bd61b8c-2b53-4fc8-8e35-b17ed81ba8c9,0.9700000286102295,4000.0,NS_NET136_L_S3_4(7),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +d5e593f1-727e-4983-8abe-92a328aa203b,0.9700000286102295,4000.0,NS_NET116_L_S2_5(2),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b52b4bea-014e-4aad-8481-2f2761957f69,0.9700000286102295,4000.0,NS_NET136_L_S3_4(4),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ef07774d-107b-4536-8d1d-45c28f755a80,0.9700000286102295,4000.0,NS_NET136_L_S3_3(6),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +46644e3e-b00c-4707-ae8d-94fed9f0adcd,0.9700000286102295,4000.0,NS_NET126_L_F1_(38),06b7f21a-d6d7-4ec0-94c6-141845f14986,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +f2284780-6019-4864-bf29-915330717f5b,0.9700000286102295,4000.0,NS_NET116_L_S2_5(5),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8c2ea045-0890-4ee5-8d66-0ce5f5eba7d1,0.949999988079071,4000.0,NS_NET146_L_F4_(12),f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +598f0d53-7c8f-435b-b333-95b6f4d359f2,0.949999988079071,4000.0,NS_NET126_L_F3_(31),67af7db0-0fd8-4657-bb4f-43a2141b9f73,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +520e2b61-ef52-406a-bc3d-83fd47da2696,0.949999988079071,4000.0,NS_NET146_L_F4_(13),b608d71e-3ede-4156-a015-3f6e1d22242a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8bad5752-c9c1-4669-802d-b1c4c7bbb909,0.9700000286102295,4000.0,NS_NET136_L_S3_1(5),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3df803d8-4af6-426e-a51a-4b736ff06d51,0.949999988079071,4000.0,NS_NET146_L_F2_(20),2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +59f1999e-008d-47f0-b99d-1305fcb8f525,0.9700000286102295,4000.0,NS_NET136_L_S1_4(7),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +deb6456a-d472-4f1e-8698-006e8cd51dfc,0.9700000286102295,4000.0,NS_NET136_L_S1_4(5),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0290a7de-8c73-44d4-9a06-cf469d20c90c,0.9700000286102295,4000.0,NS_NET116_L_S1_4(3),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ea515ef0-c8e1-4e3f-9420-577ba394c7dc,0.9700000286102295,4000.0,NS_NET136_L_S3_3(7),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +666ac620-2151-430e-a9a1-624be6c61cb8,0.9700000286102295,4000.0,NS_NET116_L_S3_5(5),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2f4df67a-e33a-4a1b-9caa-41bfb4408b8c,0.9700000286102295,4000.0,NS_NET116_L_S2_2(8),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8d50a47b-95ce-4a8e-84a3-80d5781dcc53,0.9700000286102295,4000.0,MS4_Last_01,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +4cbcffbf-d9c8-463a-8f11-6990fbda235e,0.9700000286102295,4000.0,NS_NET116_L_S1_1(2),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +63374b45-aa28-4e06-85c2-704c00754ba8,0.949999988079071,4000.0,NS_NET146_L_F1_(20),7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +16f7000e-1f95-4003-bbbf-8c73cfd02763,0.9700000286102295,4000.0,NS_NET116_L_S3_2(2),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3ad0235e-751b-4682-89a5-b359aef0dd98,0.9700000286102295,4000.0,NS_NET136_L_S1_3(2),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2b02fad4-245d-4ada-ae5f-0252f2aa59f1,0.949999988079071,4000.0,NS_NET146_L_F2_(11),f26b5511-3c50-42d5-97c2-be408330eb84,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +62b0b771-b773-4b25-af1d-bbd8a7ad68d4,0.949999988079071,4000.0,NS_NET126_L_F2_(8),366a70fb-8d7f-4201-9eca-0fcbc839239d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +aff03ab3-9595-499f-931c-8730b1350a2c,0.949999988079071,4000.0,NS_NET146_L_F2_(12),8254d91b-e5da-4402-bb8f-301eafa09d28,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +81a6ed8d-f29e-4478-bbf3-ccb6514922f2,0.949999988079071,4000.0,NS_NET146_L_F4_(7),bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a7de4997-eddc-4306-b1ac-982c1872863b,0.949999988079071,4000.0,NS_NET146_L_F1_(6),e3c3c6a3-c383-4dbb-9b3f-a14125615386,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +4642d648-b0dd-4597-a3bd-2cc1fce74f27,0.9700000286102295,4000.0,NS_NET116_L_S3_1(1),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1fb9be59-d27c-4748-a090-db5a58063d82,0.949999988079071,4000.0,NS_NET126_L_F4_(6),e3a40690-d085-4796-9fcb-48d776e58594,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d957a9c6-500e-457d-918b-7f6c4e560bbc,0.949999988079071,4000.0,NS_NET146_L_F1_(15),00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5aeaccc2-f9cd-4292-9b9a-2e05d5c63fe4,0.9700000286102295,4000.0,NS_NET116_L_S1_2(6),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +209cebb3-6706-49d0-af2c-b2ae23ca3873,0.9700000286102295,4000.0,MS4_Last_03,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +17a02ab8-32b2-436d-8aab-04fbd3809c87,0.949999988079071,4000.0,NS_NET146_L_F3_(25),c6c177b0-5004-4db0-8cde-6293330a4757,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1fbefcb1-57ec-4b86-8b7e-c892f0e6b179,0.9700000286102295,4000.0,NS_NET116_L_S3_4(6),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +fd2e19b6-d5e3-4776-9456-8787a2160d9d,0.9700000286102295,4000.0,NS_NET116_L_S1_4(1),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2ab66e57-dd5f-4295-a6f5-f017fb4db8b1,0.9700000286102295,4000.0,NS_NET136_L_S3_3(8),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c7834ac4-2f72-483e-8ecf-1d0ce715716b,0.9700000286102295,4000.0,NS_NET116_L_S2_1(6),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b89b8560-b729-46d5-8aa1-3c678dd30be4,0.9700000286102295,4000.0,NS_NET136_L_S2_4(5),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3b63c80f-a5c6-439b-97be-4e1efda58ccd,0.949999988079071,4000.0,NS_NET146_L_F2_(22),5862f526-783a-4218-a463-3cbf5de8dade,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5f2d65fc-7e92-497e-8c51-ead1985d66fa,0.949999988079071,4000.0,NS_NET126_L_F2_(24),625bdd2c-a75f-46ef-850c-ca4704d56e55,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c27ac6bb-5227-42d4-832f-985d69bc9c4e,0.949999988079071,4000.0,NS_NET146_L_F3_(1),22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +f1804def-a6f6-4603-bfd3-52968a2de732,0.9700000286102295,4000.0,MS2_Last_07,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 +bcb5abf4-7b31-4860-af53-78ec457f21a2,0.949999988079071,4000.0,NS_NET146_L_F3_(30),7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c58dc7e4-f6c5-47e1-a914-e566b8aa6385,0.9700000286102295,4000.0,NS_NET136_L_S2_2(1),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ee726dbd-8a70-4d50-8cc3-cdda596166c7,0.9700000286102295,4000.0,NS_NET136_L_S3_3(3),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c9689bd8-6717-49d5-90d9-a6245b5116e6,0.9700000286102295,4000.0,NS_NET116_L_S1_5(3),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c3df03ac-0dff-4304-b327-3e88d023f692,0.949999988079071,4000.0,NS_NET126_L_F1_(25),3a2f199c-2966-4b9a-939b-3a6c9924341c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +72e4504c-0362-4fe0-a6be-43870f627f7f,0.9700000286102295,4000.0,NS_NET136_L_S1_5(8),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b3ce3d49-d4d5-4b76-a589-02d0c7faf5a5,0.9700000286102295,4000.0,NS_NET136_L_S2_5(6),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +de3eef0c-2f09-4f57-a04b-dae5011fac7a,0.949999988079071,4000.0,NS_NET126_L_F4_(12),6a4547a8-630b-46e4-8144-9cd649e67c07,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ab0d8c5c-fc68-4ae0-87a9-8edfa3b25339,0.949999988079071,4000.0,NS_NET126_L_F1_(4),ff947647-b551-41ae-bcfd-6af228250c96,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7b040b43-011a-4402-a176-9b9b41ce0c37,0.9700000286102295,4000.0,NS_NET116_L_S2_3(1),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b47f1063-12e8-4b1f-a015-6c5be821a24e,0.949999988079071,4000.0,NS_NET126_L_F3_(22),61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +af4c1bfe-4e4c-437d-9eff-42060aaf4027,0.9700000286102295,4000.0,NS_NET136_L_S2_1(7),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +4c7ee262-a021-408a-aada-27677feeeec9,0.949999988079071,4000.0,NS_NET126_L_F1_(17),5fe9c522-37d0-48f8-b3b8-e91b956e39f6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3c9a2f9a-8cd0-42f2-9d16-f6314c741aa3,0.9700000286102295,4000.0,NS_NET136_L_S2_1(4),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +93128545-6977-41fa-8e20-5d7a930d80c9,0.9700000286102295,4000.0,NS_NET136_L_S1_2(3),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +759ff1e6-5ad6-4701-bbe1-059c08a1781d,0.949999988079071,4000.0,NS_NET146_L_F4_(15),576840db-7d3c-417b-b587-28b222e740e1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +b16bea09-e042-4bd1-837e-78125b0085dc,0.949999988079071,4000.0,NS_NET126_L_F1_(13),847fd5fc-b515-4a9d-8a6f-66df1e71ded2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7cee8d98-be5b-400c-9655-409e1eae9f6d,0.9700000286102295,4000.0,NS_NET136_L_S3_2(6),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0c62dc7f-45a7-44e3-9240-f9ff9d62e4a0,0.949999988079071,4000.0,NS_NET126_L_F4_(13),da79c960-d35a-4193-9b06-2d4d57051706,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +bee4283a-0d36-4f98-a837-23d0667a6675,0.949999988079071,4000.0,NS_NET126_L_F3_(9),bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a82e1da2-1af2-40d8-b8f9-b4027118d029,0.9700000286102295,4000.0,NS_NET116_L_S2_4(5),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ef6f6592-1b85-4204-82e1-c33a6ed3d582,0.9700000286102295,4000.0,NS_NET136_L_S1_2(1),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +66f30a61-7722-48a7-a527-99ff55e12754,0.9700000286102295,4000.0,NS_NET136_L_S1_4(8),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3f37f3bc-f9cf-4a55-96e4-ee4be9f22a63,0.9700000286102295,4000.0,NS_NET116_L_S2_4(2),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +388ecdb9-b7e1-429e-990b-b5124fac12cf,0.949999988079071,4000.0,NS_NET146_L_F2_(6),5071dd8c-bbc1-4c8d-a180-4492f80e183d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5012a529-b7d2-4f9e-a2d4-90641470cba2,0.9700000286102295,4000.0,NS_NET136_L_S3_2(8),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3f903ef1-047f-4f28-9d9f-c35b2c440315,0.9700000286102295,4000.0,NS_NET116_L_S1_4(8),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5f56df23-f5b3-42d0-9896-85015f7b1274,0.949999988079071,4000.0,NS_NET126_L_F2_(28),5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a265d035-d8ea-41e0-ad10-04e064b9a968,0.9700000286102295,4000.0,NS_NET136_L_S3_4(5),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +95a1e026-be40-4209-9752-fbab3a626b87,0.949999988079071,4000.0,NS_NET146_L_F1_(2),ab3645a7-af26-480d-b1bd-5b0fa00dc83f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +e9660cc3-b2b6-4b8d-8673-dd3bcb6305fe,0.9700000286102295,4000.0,NS_NET116_L_S2_1(2),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +fd17352b-b2ad-4e77-92cf-08b48a1ba757,0.9700000286102295,4000.0,NS_NET116_L_S1_2(2),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +080e6ab5-8021-43c0-bf9f-2424ec0a1de8,0.949999988079071,4000.0,NS_NET126_L_F3_(30),443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0ccf950e-a9bf-4de8-ac3f-5ca04a3f0b60,0.9700000286102295,4000.0,NS_NET136_L_S3_5(6),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +62a4a30c-7bf2-4813-a00e-7002b8c56832,0.9700000286102295,4000.0,NS_NET136_L_S1_3(3),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3feb112d-8a47-49eb-b719-d7226b6fe7a0,0.949999988079071,4000.0,NS_NET146_L_F2_(18),21359dd1-7a23-4932-b656-c196fbffe751,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +94203400-1579-4cc0-9395-ac67f94c6c01,0.9700000286102295,4000.0,NS_NET136_L_S1_4(3),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7b6cd13c-8f54-421e-b2e9-5888f181737b,0.9700000286102295,4000.0,NS_NET146_L_F1_(27),9baae5ff-40e3-48cb-9ddf-de6d1c133e13,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +3f47dbb5-8254-43d1-83a8-21385cb666dd,0.949999988079071,4000.0,NS_NET126_L_F2_(25),1dcddd06-f41a-405b-9686-7f7942852196,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +4dca3b1d-5d24-444a-b4df-f4fa23b9ef1b,0.949999988079071,4000.0,HS_NET1_L_S1,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 +12c85bfd-a5a1-4812-b168-86b94f624f18,0.9700000286102295,4000.0,NS_NET116_L_S2_3(8),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3c309ec9-42a4-441d-8c0e-e29cefa6bf18,0.949999988079071,4000.0,NS_NET126_L_F1_(5),eb21d716-1b54-4dba-bdc2-d1f6752aef85,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +8bee3a68-8990-46eb-9230-067111caceb5,0.9700000286102295,4000.0,NS_NET136_L_S2_3(3),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b9fb3d41-bb0e-4c4c-bff5-1b50d40efc33,0.949999988079071,4000.0,NS_NET126_L_F1_(3),04f29760-9e52-4943-8563-62e1fbd5ed52,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +36d59a0a-17a5-4955-996b-e3aafb86f4f1,0.949999988079071,4000.0,NS_NET126_L_F3_(23),33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9b0cca4d-f27f-4190-b35f-a84fa09ac157,0.949999988079071,4000.0,NS_NET146_L_F1_(14),b73208dd-f4a8-4e90-bf2d-7ea67a89525a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ea51cb96-068f-4359-b1d0-27438ce87b49,0.9700000286102295,4000.0,NS_NET146_L_F1_(31),5e213f42-d93e-45c5-a295-adbe09105746,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +7513eb4a-3244-40fb-b500-0132947a02e0,0.9700000286102295,4000.0,MS3_Last_02,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +8a5a7de2-d61c-4172-b917-7404a2aba038,0.9700000286102295,4000.0,NS_NET116_L_S3_4(3),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0cdea42f-57da-4a8a-bd83-c4252b7868bf,0.9700000286102295,4000.0,NS_NET136_L_S2_3(8),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9d2c5b78-ad86-4055-b74b-e5b24f89a75b,0.9700000286102295,4000.0,NS_NET116_L_S2_1(4),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2efedcfd-4972-4d13-9d62-180f1b9a76ad,0.9700000286102295,4000.0,NS_NET116_L_S2_5(1),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +5d4b96bf-a6ad-4026-b97a-4e6d77896480,0.9700000286102295,4000.0,NS_NET116_L_S2_2(4),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +aaa0a903-46f7-4109-adb3-9f43398fc932,0.949999988079071,4000.0,NS_NET126_L_F4_(11),95ced3b5-69fd-4171-9c34-f18802064e22,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +04c0cbcf-4e9d-4608-bb92-6ab97e59ece7,0.9700000286102295,4000.0,NS_NET116_L_S3_4(4),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1a2d5842-96f6-452f-aa82-6064618d5f49,0.949999988079071,4000.0,NS_NET126_L_F3_(29),f0f8f187-5dbf-46ab-8a43-d6169ab5042d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5d930bf2-0b63-4821-bd6c-02383e3b4220,0.9700000286102295,4000.0,MS1_Last_04,1396cb4c-cee7-4116-97c9-290f98785719,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +24de669f-4786-4388-ae36-aaef1ce40ffa,0.949999988079071,4000.0,NS_NET126_L_F3_(27),d5b861a6-2a5b-4dec-a66e-adbfc6d62873,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +860a37f7-7add-4613-bef4-326ee5ea328b,0.949999988079071,4000.0,NS_NET146_L_F1_(25),2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +00a6de01-2304-484b-90f2-5abb044167a3,0.9700000286102295,4000.0,NS_NET116_L_S2_2(2),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8e9debcb-ce25-450c-b016-170bb7622008,0.9700000286102295,4000.0,NS_NET136_L_S3_2(4),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2550ae33-6540-4602-b59a-a46c49747c97,0.949999988079071,4000.0,NS_NET146_L_F4_(9),9b889b73-c108-4b38-b6eb-3377841e0c83,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +692728c7-5ecf-4c0a-8ead-ae19fc029ba4,0.9700000286102295,4000.0,NS_NET116_L_S2_5(6),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +09a47013-bac7-4879-9b8a-9dd854ea9786,0.949999988079071,4000.0,NS_NET126_L_F1_(23),94713e6c-c47e-422c-8ab3-2a2903b7dcd2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c3d643d1-1b2d-4f9f-838d-5b1ce270fc33,0.949999988079071,4000.0,NS_NET126_L_F2_(9),a286f73a-20ee-4056-8129-c7963b34ecd9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +099f4cde-75ca-4928-904d-37717b5b1b02,0.9700000286102295,4000.0,NS_NET116_L_S2_1(3),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9ae56e43-54fc-4ab7-8989-abbc14596fd3,0.949999988079071,4000.0,NS_NET146_L_F3_(20),0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1469946c-101e-42e9-9e48-28801e9610af,0.9700000286102295,4000.0,NS_NET126_L_F1_(28),0c266541-6235-4d01-8258-e763c58af6c7,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +02e0c339-6dfd-4cbc-bebf-56b850053a7c,0.949999988079071,4000.0,NS_NET146_L_F1_(3),b237dd88-bcba-4a7c-aee6-c0c3e151e14e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a0147111-39c4-465a-8a10-48d1de1d349c,0.949999988079071,4000.0,NS_NET126_L_F3_(19),922a6375-b97c-412e-a6c9-b0ea55a23f76,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +b03db97b-06ef-406c-a5b3-7e9ca9f7bf66,0.949999988079071,4000.0,NS_NET146_L_F4_(17),155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,"cosPhiFixed:{(0.00,1.00)}",0.10000000149011612,h0 +000e54d4-cf92-4cdb-9777-3d40d320d2b6,0.9700000286102295,4000.0,NS_NET116_L_S1_4(6),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +6c4c7e65-4598-4855-b057-25773ffdf5f2,0.9700000286102295,4000.0,NS_NET116_L_S1_5(6),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +9d19bae7-6fa1-4620-8ec2-38cae5596b9e,0.9700000286102295,4000.0,NS_NET116_L_S1_5(7),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +076b9055-3329-4e88-a1a0-93ad904e72a2,0.9700000286102295,4000.0,NS_NET116_L_S3_2(8),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3fed7598-a77e-4929-9bb3-687e51346cfd,0.9700000286102295,4000.0,NS_NET116_L_S3_2(3),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ef94c79c-ade7-4215-ba16-0bb14d558aab,0.949999988079071,4000.0,NS_NET146_L_F1_(13),f1e55c8b-357f-45a7-9d57-e299f9b207f3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +ff5bf65c-e880-4a49-a286-fd51ce1f48b7,0.9700000286102295,4000.0,MS2_Last_03,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +5cffadab-94f6-4d98-a804-9d74189982cc,0.9700000286102295,4000.0,NS_NET116_L_S3_5(7),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a08a45bb-552f-435d-b614-aed657073527,0.949999988079071,4000.0,NS_NET126_L_F2_(15),2645e336-b0df-4d1e-a0ea-375444488f06,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +2dcdb711-8872-4e51-ab4c-ef23c685674d,0.9700000286102295,4000.0,NS_NET146_L_F1_(35),f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +d4004ab6-3b00-4eeb-b62a-4ec28dc9cec6,0.949999988079071,4000.0,NS_NET126_L_F2_(14),9ce9d92c-5583-4b16-bec6-9f67834663cb,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +61314082-488b-4045-8c90-dad4629be04c,0.949999988079071,4000.0,NS_NET126_L_F2_(10),3d81adf5-73d1-4708-b03b-3afc7db017f4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +573a3f21-49d8-4e2b-bca0-d546d77bb143,0.9700000286102295,4000.0,NS_NET116_L_S1_2(3),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +c2446989-6050-49f9-ab98-d8cfb8058709,0.949999988079071,4000.0,NS_NET126_L_F2_(26),5545d21b-bdc8-495f-bd28-d22ffcc0fafc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d12ce59d-2cf8-4186-9174-46a8b7f7c9cf,0.949999988079071,4000.0,NS_NET146_L_F4_(10),ffcaf979-d707-4d25-8f46-f436f9792d7f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +35414e99-525f-455a-b4ef-137b6e48ff87,0.9700000286102295,4000.0,NS_NET136_L_S2_2(8),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +cdf650f2-8200-482a-b5b4-6f96e7f9e0f9,0.949999988079071,4000.0,NS_NET126_L_F1_(10),f6a31362-8b0d-4926-b0d0-10bb61db20df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +1a08b0a0-ae75-4ff8-b28b-643ca2dbca1a,0.9700000286102295,4000.0,NS_NET136_L_S2_1(5),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1f901bde-3ada-4e30-8a4c-a264df5b2f38,0.9700000286102295,4000.0,NS_NET136_L_S2_2(5),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e65cd082-dd8f-45d6-895c-e14357e76ac8,0.9700000286102295,4000.0,NS_NET136_L_S1_2(2),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3a278137-bf5c-4e2d-96c5-4779bcf947c0,0.9700000286102295,4000.0,NS_NET136_L_S3_2(2),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ca863e7f-1e42-4716-a214-e79fa91b3222,0.9700000286102295,4000.0,NS_NET116_L_S3_5(8),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +742de2f0-f057-47d0-83a3-9f57f84eb314,0.949999988079071,4000.0,NS_NET126_L_F4_(1),3f63be7c-7f1a-4e7e-87ee-90ada222f64a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +f971674c-7f11-4e9d-b701-1736b2effb65,0.9700000286102295,4000.0,NS_NET136_L_S1_2(4),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +0045a53f-8f38-4239-8109-073a768cc593,0.949999988079071,4000.0,NS_NET146_L_F4_(1),ead38a50-b8f7-4bbb-b65d-f54350825e8e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3e94ff28-fd2e-4028-a188-58ce85136fdf,0.9700000286102295,4000.0,NS_NET116_L_S2_2(5),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +98c1a2ab-bd09-4c77-a389-d088aed894b1,0.9700000286102295,4000.0,NS_NET116_L_S3_2(1),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +916670c1-1575-4fe8-acb0-1dcf1c218386,0.9700000286102295,4000.0,NS_NET116_L_S2_2(6),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +b2789995-79a1-4859-8d1c-70107b83c18b,0.9700000286102295,4000.0,NS_NET136_L_S3_3(2),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +be63473d-a375-4ce7-9970-80358e5c54bd,0.9700000286102295,4000.0,NS_NET136_L_S3_2(3),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +4384a56f-5b34-430c-89d8-354f367fa7ff,0.949999988079071,4000.0,NS_NET146_L_F3_(29),15345698-c319-461f-b969-37d50fb84220,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +89aeade0-ac58-4120-a743-577afdb72b5b,0.949999988079071,4000.0,NS_NET146_L_F3_(7),f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0d983289-2ff2-4f2c-b38a-bab3ec967c76,0.9700000286102295,4000.0,NS_NET136_L_S1_1(4),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +f630b338-5685-424d-bfbe-338bf94a0e01,0.949999988079071,4000.0,NS_NET126_L_F3_(6),e018b95e-fca5-40f7-8550-b05a619169dc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d7f49aa5-ab62-4148-911b-086e8a848af4,0.949999988079071,4000.0,NS_NET146_L_F3_(15),d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +10b5f3d3-60c9-45b9-a70e-fa75140e9a9d,0.9700000286102295,4000.0,NS_NET136_L_S1_5(3),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +dd53cc4e-93a6-47f1-afa0-a46f82e3b371,0.949999988079071,4000.0,NS_NET146_L_F4_(11),8b3e3802-5213-46d0-a498-15eb6e5852b5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3f5718ca-fc58-4b00-b634-1aa6307c6cfa,0.949999988079071,4000.0,NS_NET146_L_F2_(1),2c520ab6-507e-4dcf-ab05-8f238e9b9385,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +b47d3f0a-f480-49ef-ba7e-7979c81b0f70,0.9700000286102295,4000.0,NS_NET146_L_F1_(32),033d0230-4aee-47cf-91f9-81f5f40e60b0,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +1aeeacdc-e61b-4d44-ac76-699c7b459325,0.9700000286102295,4000.0,NS_NET116_L_S1_3(2),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a34932f7-012c-4a27-aa5f-4dd043028d5e,0.9700000286102295,4000.0,NS_NET116_L_S2_1(8),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +35408c17-cd77-4115-8357-9fb0e8f76532,0.949999988079071,4000.0,NS_NET146_L_F2_(9),a5c73608-5a85-495d-bea0-df77b6ce66ea,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +7194cc61-5445-43a9-9039-ddde7ab2be55,0.949999988079071,4000.0,NS_NET126_L_F3_(11),4258f215-5b22-446f-a260-e8cdaa7c95d1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9985e8e1-d8fa-4fdc-86aa-70f5b0ab70fc,0.949999988079071,4000.0,NS_NET126_L_F1_(11),270c7266-45dc-4e45-829f-c04f6b631cad,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +f8a76852-55d7-4a20-99a7-cf1fb5a5b1b0,0.949999988079071,4000.0,NS_NET146_L_F2_(17),40537c84-c812-4231-bd23-0ba81922e937,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3052ef96-e3f1-4469-a64e-059f09306044,0.9700000286102295,4000.0,NS_NET136_L_S2_5(2),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a94ba026-b4fc-40d2-a20f-c8201996d717,0.9700000286102295,4000.0,MS2_Last_04,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 +99a1fb27-fa7c-440b-9f25-74237b4e0279,0.949999988079071,4000.0,NS_NET126_L_F3_(24),97ae0aa4-bf05-4b88-8020-83cbda415d22,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +fe429426-1884-4ad7-8d50-69237e4a6a1b,0.9700000286102295,4000.0,NS_NET146_L_F1_(34),fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +7388e938-85cb-495b-bb00-30a050b18327,0.9700000286102295,4000.0,MS1_Last_01,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +8221a6b1-eff3-48fe-88ab-0685a9f59cce,0.9700000286102295,4000.0,NS_NET116_L_S1_2(8),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a3bcf5fc-5937-4182-8a54-180f9810d21d,0.949999988079071,4000.0,NS_NET126_L_F1_(1),4303784e-7193-454a-9be4-3591400b4eeb,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9219bda4-01ce-4067-92b1-595b86e9bbdf,0.9700000286102295,4000.0,NS_NET116_L_S1_1(5),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2596f43d-e805-46b6-a79a-adf9f21fee96,0.949999988079071,4000.0,NS_NET126_L_F3_(2),285a4caa-2da8-4bd2-8a60-7d04f168f378,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +40550e1d-7453-4f20-a5e5-8839d17c2fdf,0.9700000286102295,4000.0,NS_NET136_L_S2_3(7),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +bd4fa1dc-a73a-4aa4-ac9f-d263a45a6cce,0.9700000286102295,4000.0,NS_NET116_L_S2_4(6),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7e875803-7e9d-4808-8d8c-a722d46fb6af,0.949999988079071,4000.0,NS_NET126_L_F3_(20),732f83b0-b9c5-4b8e-86fe-753c26f40e78,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +33dfa920-da94-44b2-8be9-85a0eeafa626,0.9700000286102295,4000.0,NS_NET136_L_S2_5(1),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e2795c9b-dddb-4012-b56c-e24c3d1c3cdf,0.9700000286102295,4000.0,NS_NET136_L_S1_1(6),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +fd1a8de9-722a-4304-8799-e1e976d9979c,0.9700000286102295,4000.0,NS_NET116_L_S1_1(1),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +a4145b3e-7143-4618-99f1-16b43aec3c9e,0.9700000286102295,4000.0,NS_NET136_L_S2_3(5),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8a535e63-ff09-4236-ac68-fb6a21bb0516,0.9700000286102295,4000.0,NS_NET116_L_S1_2(5),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +47878ba6-7b08-4af8-a7ab-c859d0ac3415,0.9700000286102295,4000.0,NS_NET136_L_S1_3(5),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +d5a1a95f-e2b8-402c-86e6-617489ca865d,0.9700000286102295,4000.0,NS_NET116_L_S3_3(3),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +cd65e476-ba5b-46be-b87d-a689b79269eb,0.949999988079071,4000.0,NS_NET126_L_F3_(3),69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +5535881c-50ec-4a74-a67e-5b963aec5b38,0.949999988079071,4000.0,NS_NET146_L_F1_(5),bd8c7d3d-e830-4a46-bf78-0086ce24909f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +4924a294-0f71-4f0d-a058-447a1a74de6c,0.9700000286102295,4000.0,NS_NET136_L_S2_4(8),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +4d3af2ae-7637-46bc-a492-1bca70d3bc56,0.9700000286102295,4000.0,NS_NET146_L_F1_(37),450426ac-a560-4d17-b1fc-9e169530a655,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +ae21cb77-4f17-4996-89f3-b2172f479bcc,0.949999988079071,4000.0,NS_NET126_L_F2_(16),d8c35123-b389-4199-84f9-d417d24bb78d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +2ba29ae5-8b0a-4fee-be31-c6d0cc83f97e,0.9700000286102295,4000.0,NS_NET136_L_S2_4(6),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +4cf4c2ac-3c96-456e-858b-5000f183230c,0.949999988079071,4000.0,NS_NET126_L_F2_(7),4db634e5-3eb8-4c17-bc44-eb224667580c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +cc08fc6e-1932-4daa-af04-f0376c8be6e2,0.949999988079071,4000.0,NS_NET126_L_F3_(7),50164699-2018-4b17-b3f1-74b082f27403,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +3e0d4895-f0c4-4b4d-8eeb-8c8e24e3e610,0.9700000286102295,4000.0,NS_NET136_L_S2_2(7),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +cad1c678-6e76-430f-bf7c-db12c6f06239,0.949999988079071,4000.0,NS_NET126_L_F4_(7),98072ded-726f-4f0b-8bbc-4fb6d5086a7b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +cc470184-d4ce-468a-b7ef-ed2cb84debfd,0.9700000286102295,4000.0,NS_NET116_L_S1_1(4),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +db87c6cf-7673-4e25-b510-50086de5d4b8,0.949999988079071,4000.0,NS_NET126_L_F1_(24),4f2402e8-664a-40f2-970a-abc098a2a0d1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +e25c3969-7e44-48f5-860c-03ff67a65284,0.9700000286102295,4000.0,NS_NET126_L_F1_(29),27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +6a4d97c2-3c6b-4fb8-91a6-2c9a2f9523b1,0.949999988079071,4000.0,NS_NET126_L_F3_(21),5af425fa-6ed7-43e1-8898-7af1315128c5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +fe02ae6f-bb61-4ab9-83db-43a41f32b0c8,0.9700000286102295,4000.0,MS2_Last_02,535843a3-cf93-412f-b4d7-585337791ba8,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 +cec8879b-a90b-4e15-b664-a7ed0739ae0a,0.9700000286102295,4000.0,NS_NET136_L_S1_2(6),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +791307b1-d235-4df9-9400-e6c2af8b3825,0.9700000286102295,4000.0,NS_NET136_L_S1_1(2),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +996313f2-93af-477c-92dc-2011a43afd7c,0.9700000286102295,4000.0,NS_NET136_L_S1_5(5),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +87fb203a-6cbb-4598-8172-8cdef6b04a63,0.949999988079071,4000.0,NS_NET146_L_F2_(26),86af5351-87ef-49c6-bd17-673dceecee5b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +6e260432-2b25-444f-8e37-5300eee5a89e,0.949999988079071,4000.0,NS_NET146_L_F2_(2),69efeb2d-9845-49ac-8500-5e017a7a64ef,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +6ad26a2b-9139-4008-bd91-ba2c8918e1e3,0.949999988079071,4000.0,NS_NET126_L_F3_(10),e25387d0-ab9a-406d-bcb4-555414b88b1b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +32d607eb-c3a1-4906-af14-9e7bf12e5a20,0.9700000286102295,4000.0,NS_NET146_L_F1_(36),8f80e777-ccbd-4630-b10e-238e824113fd,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +b334c8b6-0f65-4891-a761-5208a39aa9d0,0.949999988079071,4000.0,NS_NET126_L_F3_(8),6dcdc87b-a719-416f-9da1-21a701048f3a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +cde58a33-fc7e-4fc6-8843-e0c372234be0,0.9700000286102295,4000.0,NS_NET136_L_S1_4(1),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8c9dbef2-bf3d-4f5b-bc9f-6c867f016c89,0.9700000286102295,4000.0,NS_NET136_L_S3_5(1),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +08bb3387-aaf3-4005-894b-c195849fcad0,0.949999988079071,4000.0,NS_NET146_L_F1_(12),3b879239-20c8-4adf-bd51-92924327ee71,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d3c547e1-cf64-4993-9b55-5ae1b1d4601c,0.9700000286102295,4000.0,NS_NET136_L_S3_2(7),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3cec8f8c-5a69-4813-a788-11cfbd48f718,0.9700000286102295,4000.0,NS_NET126_L_F1_(37),3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 +7ebc343e-c3a4-4f6c-a1f8-e81d2ee35d08,0.9700000286102295,4000.0,NS_NET136_L_S2_5(3),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +ae80f9a2-151c-4f24-99bf-928032df3383,0.9700000286102295,4000.0,NS_NET116_L_S3_5(6),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +1610169b-0870-40d0-bc26-259e443b30db,0.9700000286102295,4000.0,NS_NET136_L_S3_5(4),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +528616f2-81a9-44ad-b103-e36cf5c585d9,0.949999988079071,4000.0,NS_NET146_L_F2_(28),ca438ab9-3abc-4416-91d1-df01d1c5fa5a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +d28f1e85-c5ff-41c9-93b7-ba4ea62eb56d,0.949999988079071,4000.0,NS_NET126_L_F4_(14),d40a1a85-40f2-4ad3-ba58-720d5ba02268,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +60492496-1ab3-4b51-b2c4-245f44a4ce45,0.9700000286102295,4000.0,NS_NET136_L_S2_5(5),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +d7a977d9-d95f-46f1-b993-2ba120bcd366,0.949999988079071,4000.0,NS_NET146_L_F1_(23),1a1e63f7-6196-4856-9f4e-876a44bdf2f8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +0d6b1569-0276-4f4b-9831-9a99821ff240,0.9700000286102295,4000.0,NS_NET116_L_S3_1(5),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e8443260-ac5c-4210-9f84-4f40cec0b63b,0.949999988079071,4000.0,NS_NET126_L_F2_(13),b32c5f5e-b6b8-41ed-a192-078e1aed05ac,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +c79513d2-7d86-45be-ab44-3bd13f502a5b,0.9700000286102295,4000.0,NS_NET136_L_S1_3(1),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +fae24064-659b-4f3b-80f9-c3ecf337cb25,0.949999988079071,4000.0,NS_NET146_L_F2_(7),f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9a751f29-69b8-4ca0-b019-3001e50922d3,0.9700000286102295,4000.0,NS_NET116_L_S1_4(2),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +e81df4d7-0935-40d7-be0b-5b696b24d220,0.949999988079071,4000.0,NS_NET146_L_F1_(21),92cb5065-2e57-4099-8e29-75cbc0c80370,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +571ee907-5b24-46df-872d-560c5f119800,0.9700000286102295,4000.0,NS_NET116_L_S1_4(5),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +bfb7a7c2-6426-4392-9070-85dd5210a5cf,0.9700000286102295,4000.0,NS_NET116_L_S1_5(4),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +20f3da7f-110c-48d6-b6f0-9df6f6dfecbc,0.9700000286102295,4000.0,NS_NET116_L_S1_3(3),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +2848033f-54ed-4507-8d9c-59ec3eb5c3a9,0.949999988079071,4000.0,NS_NET126_L_F1_(19),d2aff632-fc26-4595-931c-92e266247ac8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +a194f9a2-1380-412b-8285-80ca7ba3a538,0.949999988079071,4000.0,NS_NET126_L_F3_(15),ae234bc5-b751-41f2-95ee-b78de124c583,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +b925ad8d-edb2-4f59-a302-9b33d21d900c,0.949999988079071,4000.0,NS_NET126_L_F3_(16),6232b760-b2e0-485e-9c61-f9721a366a81,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +9c5991bc-24df-496b-b4ce-5ec27657454c,0.949999988079071,4000.0,HS_NET1_L_S2,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 +68ca017a-8327-4a88-a2ab-0c7c20383a3e,0.9700000286102295,4000.0,NS_NET136_L_S1_2(7),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +3eac1fa7-99ba-4f3e-bc50-c7b88a022734,0.949999988079071,4000.0,NS_NET126_L_F1_(12),9d10a92f-576d-4777-99ff-59d145924fea,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +477fdcdc-1983-4190-8f83-3f32ce95d1df,0.949999988079071,4000.0,NS_NET146_L_F3_(28),c72a08bc-4685-49b1-b8ef-803aebc8c388,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +f817f48f-b565-44a8-9cf9-6824c9bbd012,0.9700000286102295,4000.0,NS_NET136_L_S2_3(6),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +8f6178ef-fc51-431e-a91a-1b1802a7373c,0.9700000286102295,4000.0,NS_NET116_L_S2_1(5),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 +7063fecf-8601-4a03-8dfe-410b2419133b,0.949999988079071,4000.0,NS_NET146_L_F3_(32),fd3b7bb8-3976-4441-9211-745243afd80f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv index dba0c338a..4a2d97e37 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/load_input.csv @@ -1,2 +1,2 @@ uuid,cos_phi_rated,e_cons_annual,id,node,operates_from,operates_until,operator,q_characteristics,s_rated,load_profile,em -eaf77f7e-9001-479f-94ca-7fb657766f5f,0.95,false,4000.0,test_loadInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,h0,977157f4-25e5-4c72-bf34-440edc778792 +eaf77f7e-9001-479f-94ca-7fb657766f5f,0.95,4000.0,test_loadInput,4ca90220-74c2-4369-9afa-a18bf068840d,2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,"cosPhiFixed:{(0.00,0.95)}",25.0,h0,977157f4-25e5-4c72-bf34-440edc778792 From 1e7afd121c2491383b3181cd7c50203bc4fd788b Mon Sep 17 00:00:00 2001 From: Marvin Heintze Date: Tue, 14 Jan 2025 15:37:14 +0100 Subject: [PATCH 210/310] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46eee80bc..6f7ed8f6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changed ThermalUnitValidation: Ensure that thermal boundaries of thermal house are not the same [#1186](https://github.com/ie3-institute/PowerSystemDataModel/issues/1186) - Converted `MappingEntry` into a normal class [#1087](https://github.com/ie3-institute/PowerSystemDataModel/issues/1087) - Renamed timeseries mapping `participant` column to `asset` [#1191](https://github.com/ie3-institute/PowerSystemDataModel/issues/1191) +- Removed attribute `dsm` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195) ## [5.1.0] - 2024-06-24 From 2235fdd8600094114d3bd1fe6fd4b4697a4861a3 Mon Sep 17 00:00:00 2001 From: Daniel Feismann <98817556+danielfeismann@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:36:12 +0100 Subject: [PATCH 211/310] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f7ed8f6b..8bd30cd83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changed ThermalUnitValidation: Ensure that thermal boundaries of thermal house are not the same [#1186](https://github.com/ie3-institute/PowerSystemDataModel/issues/1186) - Converted `MappingEntry` into a normal class [#1087](https://github.com/ie3-institute/PowerSystemDataModel/issues/1087) - Renamed timeseries mapping `participant` column to `asset` [#1191](https://github.com/ie3-institute/PowerSystemDataModel/issues/1191) -- Removed attribute `dsm` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195) +- Removed attribute `dsm` from `LoadInput` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195) ## [5.1.0] - 2024-06-24 From 6d8e4252714dd9e4c1ad69d77649b985a14dcc8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 08:52:08 +0000 Subject: [PATCH 212/310] Bump com.diffplug.spotless from 7.0.1 to 7.0.2 (#1211) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c8f4345d7..1a08754bc 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { id 'maven-publish' id 'signing' id 'pmd' // code check, working on source code - id 'com.diffplug.spotless' version '7.0.1' //code format + id 'com.diffplug.spotless' version '7.0.2' //code format id 'com.github.spotbugs' version '6.1.0' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation From 04e0c49956da08e8e21a14b58663edf274147f75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:25:03 +0000 Subject: [PATCH 213/310] Bump org.postgresql:postgresql from 42.7.4 to 42.7.5 (#1212) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1a08754bc..3fb7f2c1f 100644 --- a/build.gradle +++ b/build.gradle @@ -91,7 +91,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' implementation 'com.couchbase.client:java-client:3.7.7' - runtimeOnly 'org.postgresql:postgresql:42.7.4' // postgresql jdbc driver required during runtime + runtimeOnly 'org.postgresql:postgresql:42.7.5' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.18.0' // I/O functionalities implementation 'commons-codec:commons-codec:1.17.2' // needed by commons-compress From 74c36735a4433c52f942fb2c95b219cb2462fb74 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 22 Jan 2025 17:24:47 +0100 Subject: [PATCH 214/310] Extend ValidationUtils for validating ThermalGrids --- CHANGELOG.md | 1 + .../ThermalUnitValidationUtils.java | 42 +++++++++++++++++++ .../utils/validation/ValidationUtils.java | 5 +++ .../ThermalUnitValidationUtilsTest.groovy | 28 +++++++++++++ 4 files changed, 76 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16400f306..228090ea0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) - Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) +- Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) ### Fixed diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 9edcd6171..106c407a9 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -7,12 +7,14 @@ import edu.ie3.datamodel.exceptions.InvalidEntityException; import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.models.input.container.ThermalGrid; import edu.ie3.datamodel.models.input.thermal.*; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.stream.Stream; import javax.measure.Quantity; public class ThermalUnitValidationUtils extends ValidationUtils { @@ -58,6 +60,46 @@ private ThermalUnitValidationUtils() { return exceptions; } + /** + * Validates a thermal grid if: + * + *

      + *
    • it is not null + *
    + * + * A "distribution" method, that forwards the check request to specific implementations to fulfill + * the checking task, based on the class of the given object. + * + * @param thermalGrid ThermalGrid to validate + * @return a list of try objects either containing an {@link ValidationException} or an empty + * Success + */ + protected static List> check(ThermalGrid thermalGrid) { + Try isNull = checkNonNull(thermalGrid, "a thermal grid"); + + if (isNull.isFailure()) { + return List.of(isNull); + } + + List> exceptions = new ArrayList<>(); + + // Validate houses + for (ThermalHouseInput house : thermalGrid.houses()) { + exceptions.addAll(checkThermalHouse(house)); + } + + // Validate storages + for (ThermalStorageInput storage : + Stream.concat( + thermalGrid.heatStorages().stream(), + thermalGrid.domesticHotWaterStorages().stream()) + .toList()) { + exceptions.addAll(check(storage)); + } + + return exceptions; + } + /** * Validates a thermalSinkInput if: * diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java index cc04e8489..2859a8b8f 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; import edu.ie3.datamodel.models.input.container.GridContainer; +import edu.ie3.datamodel.models.input.container.ThermalGrid; import edu.ie3.datamodel.models.input.graphics.GraphicInput; import edu.ie3.datamodel.models.input.system.SystemParticipantInput; import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; @@ -68,6 +69,8 @@ public static void check(Object obj) throws ValidationException { exceptions.addAll(GraphicValidationUtils.check((GraphicInput) obj)); } else if (AssetTypeInput.class.isAssignableFrom(obj.getClass())) { exceptions.addAll(checkAssetType((AssetTypeInput) obj)); + } else if (ThermalGrid.class.isAssignableFrom(obj.getClass())) { + exceptions.addAll(ThermalUnitValidationUtils.check((ThermalGrid) obj)); } else { logNotImplemented(obj); } @@ -152,6 +155,8 @@ else if (SystemParticipantInput.class.isAssignableFrom(assetInput.getClass())) SystemParticipantValidationUtils.check((SystemParticipantInput) assetInput)); else if (ThermalUnitInput.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); + else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass())) + exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); else { logNotImplemented(assetInput); } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy index 9f0b2c976..373ac2a6f 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy @@ -10,6 +10,7 @@ import edu.ie3.datamodel.exceptions.ValidationException import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.container.ThermalGrid import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput @@ -139,4 +140,31 @@ class ThermalUnitValidationUtilsTest extends Specification { new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidDomesticHotWaterStorage) new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidDomesticHotWaterStorage) } + + def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { + when: + def thermalBus = ThermalUnitInputTestData.thermalBus + def domesticHotWaterStorageInput = [ + ThermalUnitInputTestData.domesticHotWaterStorageInput + ] + def cylindricalStorageInput = [ + ThermalUnitInputTestData.cylindricalStorageInput + ] + + ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) + + + List> exceptions = ThermalUnitValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() + + then: + exceptions.size() == expectedSize + Exception ex = exceptions.get(0).exception.get() + ex.class == expectedException.class + ex.message == expectedException.message + + + where: + thermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) + } } From 957bf4990e6efe0ebc71bb480c3fcabbc50ce2ee Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 22 Jan 2025 17:24:47 +0100 Subject: [PATCH 215/310] Extend ValidationUtils for validating ThermalGrids --- CHANGELOG.md | 1 + .../ThermalUnitValidationUtils.java | 43 +++++++++++++++++++ .../utils/validation/ValidationUtils.java | 5 +++ .../ThermalUnitValidationUtilsTest.groovy | 28 ++++++++++++ 4 files changed, 77 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd30cd83..2ea285c5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) - Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) +- Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) ### Fixed diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 36c89c8a5..97fdbfbd5 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -7,11 +7,14 @@ import edu.ie3.datamodel.exceptions.InvalidEntityException; import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.models.input.container.ThermalGrid; import edu.ie3.datamodel.models.input.thermal.*; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.stream.Stream; import javax.measure.Quantity; public class ThermalUnitValidationUtils extends ValidationUtils { @@ -57,6 +60,46 @@ private ThermalUnitValidationUtils() { return exceptions; } + /** + * Validates a thermal grid if: + * + *
      + *
    • it is not null + *
    + * + * A "distribution" method, that forwards the check request to specific implementations to fulfill + * the checking task, based on the class of the given object. + * + * @param thermalGrid ThermalGrid to validate + * @return a list of try objects either containing an {@link ValidationException} or an empty + * Success + */ + protected static List> check(ThermalGrid thermalGrid) { + Try isNull = checkNonNull(thermalGrid, "a thermal grid"); + + if (isNull.isFailure()) { + return List.of(isNull); + } + + List> exceptions = new ArrayList<>(); + + // Validate houses + for (ThermalHouseInput house : thermalGrid.houses()) { + exceptions.addAll(checkThermalHouse(house)); + } + + // Validate storages + for (ThermalStorageInput storage : + Stream.concat( + thermalGrid.heatStorages().stream(), + thermalGrid.domesticHotWaterStorages().stream()) + .toList()) { + exceptions.addAll(check(storage)); + } + + return exceptions; + } + /** * Validates a thermalSinkInput if: * diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java index cc04e8489..2859a8b8f 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; import edu.ie3.datamodel.models.input.container.GridContainer; +import edu.ie3.datamodel.models.input.container.ThermalGrid; import edu.ie3.datamodel.models.input.graphics.GraphicInput; import edu.ie3.datamodel.models.input.system.SystemParticipantInput; import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; @@ -68,6 +69,8 @@ public static void check(Object obj) throws ValidationException { exceptions.addAll(GraphicValidationUtils.check((GraphicInput) obj)); } else if (AssetTypeInput.class.isAssignableFrom(obj.getClass())) { exceptions.addAll(checkAssetType((AssetTypeInput) obj)); + } else if (ThermalGrid.class.isAssignableFrom(obj.getClass())) { + exceptions.addAll(ThermalUnitValidationUtils.check((ThermalGrid) obj)); } else { logNotImplemented(obj); } @@ -152,6 +155,8 @@ else if (SystemParticipantInput.class.isAssignableFrom(assetInput.getClass())) SystemParticipantValidationUtils.check((SystemParticipantInput) assetInput)); else if (ThermalUnitInput.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); + else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass())) + exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); else { logNotImplemented(assetInput); } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy index 61c9bf571..382a26821 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy @@ -10,6 +10,7 @@ import edu.ie3.datamodel.exceptions.ValidationException import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.container.ThermalGrid import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.utils.Try @@ -112,4 +113,31 @@ class ThermalUnitValidationUtilsTest extends Specification { new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(100, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) } + + def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { + when: + def thermalBus = ThermalUnitInputTestData.thermalBus + def domesticHotWaterStorageInput = [ + ThermalUnitInputTestData.domesticHotWaterStorageInput + ] + def cylindricalStorageInput = [ + ThermalUnitInputTestData.cylindricalStorageInput + ] + + ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) + + + List> exceptions = ThermalUnitValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() + + then: + exceptions.size() == expectedSize + Exception ex = exceptions.get(0).exception.get() + ex.class == expectedException.class + ex.message == expectedException.message + + + where: + thermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) + } } From d761a9267042f51579f513f53a993a919e096f7d Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 23 Jan 2025 17:55:46 +0100 Subject: [PATCH 216/310] fix thermalStorages inside ThermalUnitValidationUtils --- .../utils/validation/ThermalUnitValidationUtils.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java index 97fdbfbd5..73d5a5a4a 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java @@ -89,11 +89,7 @@ private ThermalUnitValidationUtils() { } // Validate storages - for (ThermalStorageInput storage : - Stream.concat( - thermalGrid.heatStorages().stream(), - thermalGrid.domesticHotWaterStorages().stream()) - .toList()) { + for (ThermalStorageInput storage : thermalGrid.storages()) { exceptions.addAll(check(storage)); } From dd88d2fb64bb504bcca9badb5c9e90d00930c4cc Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 23 Jan 2025 17:56:41 +0100 Subject: [PATCH 217/310] rename ThermalUnitValidationUtils to ThermalValidationUtils --- ...itValidationUtils.java => ThermalValidationUtils.java} | 6 ++---- .../ie3/datamodel/utils/validation/ValidationUtils.java | 6 +++--- ...UtilsTest.groovy => ThermalValidationUtilsTest.groovy} | 8 ++++---- 3 files changed, 9 insertions(+), 11 deletions(-) rename src/main/java/edu/ie3/datamodel/utils/validation/{ThermalUnitValidationUtils.java => ThermalValidationUtils.java} (98%) rename src/test/groovy/edu/ie3/datamodel/utils/validation/{ThermalUnitValidationUtilsTest.groovy => ThermalValidationUtilsTest.groovy} (96%) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java similarity index 98% rename from src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java rename to src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java index 73d5a5a4a..15cc20d2f 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java @@ -13,14 +13,12 @@ import edu.ie3.datamodel.utils.Try.Failure; import java.util.ArrayList; import java.util.List; -import java.util.Set; -import java.util.stream.Stream; import javax.measure.Quantity; -public class ThermalUnitValidationUtils extends ValidationUtils { +public class ThermalValidationUtils extends ValidationUtils { /** Private Constructor as this class is not meant to be instantiated */ - private ThermalUnitValidationUtils() { + private ThermalValidationUtils() { throw new IllegalStateException("Don't try and instantiate a Utility class."); } diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java index 2859a8b8f..80006953b 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java @@ -70,7 +70,7 @@ public static void check(Object obj) throws ValidationException { } else if (AssetTypeInput.class.isAssignableFrom(obj.getClass())) { exceptions.addAll(checkAssetType((AssetTypeInput) obj)); } else if (ThermalGrid.class.isAssignableFrom(obj.getClass())) { - exceptions.addAll(ThermalUnitValidationUtils.check((ThermalGrid) obj)); + exceptions.addAll(ThermalValidationUtils.check((ThermalGrid) obj)); } else { logNotImplemented(obj); } @@ -154,9 +154,9 @@ else if (SystemParticipantInput.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll( SystemParticipantValidationUtils.check((SystemParticipantInput) assetInput)); else if (ThermalUnitInput.class.isAssignableFrom(assetInput.getClass())) - exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); + exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput)); else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass())) - exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); + exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput)); else { logNotImplemented(assetInput); } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy similarity index 96% rename from src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy rename to src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index 382a26821..baf8314ef 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalUnitValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -27,7 +27,7 @@ import tech.units.indriya.quantity.Quantities import javax.measure.quantity.Temperature import javax.measure.quantity.Volume -class ThermalUnitValidationUtilsTest extends Specification { +class ThermalValidationUtilsTest extends Specification { // General data private static final UUID thermalUnitUuid = UUID.fromString("717af017-cc69-406f-b452-e022d7fb516a") @@ -66,7 +66,7 @@ class ThermalUnitValidationUtilsTest extends Specification { def "ThermalUnitValidationUtils.checkThermalHouse() recognizes all potential errors for a thermal house"() { when: - List> exceptions = ThermalUnitValidationUtils.check(invalidThermalHouse).stream().filter { it -> it.failure }.toList() + List> exceptions = ThermalValidationUtils.check(invalidThermalHouse).stream().filter { it -> it.failure }.toList() then: exceptions.size() == expectedSize @@ -99,7 +99,7 @@ class ThermalUnitValidationUtilsTest extends Specification { def "ThermalUnitValidationUtils.checkCylindricalStorage() recognizes all potential errors for a thermal cylindrical storage"() { when: - List> exceptions = ThermalUnitValidationUtils.check(invalidCylindricalStorage).stream().filter { it -> it.failure }.toList() + List> exceptions = ThermalValidationUtils.check(invalidCylindricalStorage).stream().filter { it -> it.failure }.toList() then: exceptions.size() == expectedSize @@ -127,7 +127,7 @@ class ThermalUnitValidationUtilsTest extends Specification { ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) - List> exceptions = ThermalUnitValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() + List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() then: exceptions.size() == expectedSize From 0b6efc29f5e2d456686ec35d4bb78cf0ddfd0208 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 23 Jan 2025 18:39:24 +0100 Subject: [PATCH 218/310] fix changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 228090ea0..a95ecf36e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) +- Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) +- Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) +- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) ### Fixed @@ -32,9 +35,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ConnectorValidationUtils` checks if parallel devices is > 0 [#1077](https://github.com/ie3-institute/PowerSystemDataModel/issues/1077) - `GridContainerValidationUtils` checks the connectivity for all defined operation time intervals [#1091](https://github.com/ie3-institute/PowerSystemDataModel/issues/1091) - Implemented a `CongestionResult` [#1097](https://github.com/ie3-institute/PowerSystemDataModel/issues/1097) -- Attribute `pThermalRated` for `ThermalStorage`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) -- Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) -- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) ### Fixed - Fixed `MappingEntryies` not getting processed by adding `Getter` methods for record fields [#1084](https://github.com/ie3-institute/PowerSystemDataModel/issues/1084) From 1bd251839c08e5a55b4d6483c0040ac8693d52ab Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 28 Jan 2025 12:00:46 +0100 Subject: [PATCH 219/310] Removing opened switches during connectivity check --- CHANGELOG.md | 1 + docs/readthedocs/io/ValidationUtils.md | 2 +- .../GridContainerValidationUtils.java | 5 ++--- .../GridContainerValidationUtilsTest.groovy | 21 +++++++++++++++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd30cd83..8485dda60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) ### Fixed +- Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) ### Changed - Storage minimum level parameter removed from cylindrical thermal storage [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1123) diff --git a/docs/readthedocs/io/ValidationUtils.md b/docs/readthedocs/io/ValidationUtils.md index 8dc2ce73d..7937ac204 100644 --- a/docs/readthedocs/io/ValidationUtils.md +++ b/docs/readthedocs/io/ValidationUtils.md @@ -11,7 +11,7 @@ The methods in ValidationUtils and subclasses can be used to check that objects The general validation checks: - if assigned values are valid, e.g. lines are not allowed to have negative lengths or the rated power factor of any unit must be between 0 and 1 - furthermore, several connections are checked, e.g. that lines only connect nodes of the same voltage level or that the voltage levels indicated for the transformer sides match the voltage levels of the nodes they are connected to. -- the connectivity of the given grid for all defined operation intervals +- the connectivity of the given grid for all defined operation intervals, if a switch is opened, it is filtered out for the connectivity check The uniqueness validation checks if a collection of given objects are unique in either: - a specific field diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/GridContainerValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/GridContainerValidationUtils.java index 2b0245466..7d9e9b26b 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/GridContainerValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/GridContainerValidationUtils.java @@ -16,9 +16,7 @@ import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.MeasurementUnitInput; import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.connector.ConnectorInput; -import edu.ie3.datamodel.models.input.connector.LineInput; -import edu.ie3.datamodel.models.input.connector.Transformer3WInput; +import edu.ie3.datamodel.models.input.connector.*; import edu.ie3.datamodel.models.input.container.*; import edu.ie3.datamodel.models.input.graphics.GraphicInput; import edu.ie3.datamodel.models.input.system.SystemParticipantInput; @@ -241,6 +239,7 @@ protected static Try checkConnectivity( graph.addEdge(connector.getNodeA().getUuid(), connector.getNodeB().getUuid())); rawGridElements.getSwitches().stream() .filter(isInOperation) + .filter(SwitchInput::isClosed) .forEach( connector -> graph.addEdge(connector.getNodeA().getUuid(), connector.getNodeB().getUuid())); diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/GridContainerValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/GridContainerValidationUtilsTest.groovy index 013bad1a4..3bab7238b 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/GridContainerValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/GridContainerValidationUtilsTest.groovy @@ -103,4 +103,25 @@ class GridContainerValidationUtilsTest extends Specification { GTD.nodeG.uuid ]) } + + def "The GridContainerValidationUtils should return an exception if the grid is not properly connected, because a switch is open"() { + given: + def nodeA = GTD.nodeA.copy().operationTime(OperationTime.notLimited()).build() + def nodeB = GTD.nodeB.copy().operationTime(OperationTime.notLimited()).build() + + def switchAtoB = GTD.switchAtoB.copy() + .nodeA(nodeA) + .nodeB(nodeB) + .operationTime(OperationTime.notLimited()) + .closed(false) + .build() + + def rawGrid = new RawGridElements([nodeA, nodeB] as Set, [] as Set, [] as Set, [] as Set, [switchAtoB] as Set, [] as Set) + + when: + def actual = GridContainerValidationUtils.checkConnectivity(rawGrid, Optional.of(start) as Optional) + + then: + actual.exception.get().message == "The grid contains unconnected elements for time "+start+": [47d29df0-ba2d-4d23-8e75-c82229c5c758]" + } } From 7269164e6978c86b1cee418cc0d99b576bddeec2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 11:56:46 +0000 Subject: [PATCH 220/310] Bump com.github.spotbugs from 6.1.0 to 6.1.3 (#1219) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3fb7f2c1f..ec9a131ee 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '7.0.2' //code format - id 'com.github.spotbugs' version '6.1.0' // code check, working on byte code + id 'com.github.spotbugs' version '6.1.3' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From ad3788dddd0a08ebcce01c20b8f71785a9164c9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 12:33:45 +0000 Subject: [PATCH 221/310] Bump net.bytebuddy:byte-buddy from 1.15.11 to 1.16.1 (#1215) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ec9a131ee..d44e5ea63 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.15.11' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.16.1' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From ec40c48e4260bff6d7a06087a822faeb9e778645 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 13:32:49 +0000 Subject: [PATCH 222/310] Bump commons-codec:commons-codec from 1.17.2 to 1.18.0 (#1220) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d44e5ea63..f172e27c2 100644 --- a/build.gradle +++ b/build.gradle @@ -94,7 +94,7 @@ dependencies { runtimeOnly 'org.postgresql:postgresql:42.7.5' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.18.0' // I/O functionalities - implementation 'commons-codec:commons-codec:1.17.2' // needed by commons-compress + implementation 'commons-codec:commons-codec:1.18.0' // needed by commons-compress implementation 'org.apache.commons:commons-compress:1.27.1' // I/O functionalities } From 7f1d312eec741ad207d7c645974d6992d4738e03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 13:53:36 +0000 Subject: [PATCH 223/310] Bump org.apache.groovy:groovy from 4.0.24 to 4.0.25 (#1218) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f172e27c2..351dea7c6 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ ext { //version (changing these should be considered thoroughly!) javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" - groovyBinaryVersion = "4.0.24" + groovyBinaryVersion = "4.0.25" testcontainersVersion = '1.20.4' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins From 452b91354f2cedfece396bc409e58034d6b361f9 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 29 Jan 2025 08:08:15 +0100 Subject: [PATCH 224/310] fix ThermalUnitValidationUtilsTest --- .../ThermalValidationUtilsTest.groovy | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index baf8314ef..1b8297545 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -45,7 +45,7 @@ class ThermalValidationUtilsTest extends Specification { private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) - // Specific data for thermal cylindric storage input + // Specific data for thermal cylindrical storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) @@ -108,23 +108,19 @@ class ThermalValidationUtilsTest extends Specification { ex.message == expectedException.message where: - invalidCylindricalStorage || expectedSize || expectedException - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(100, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) + invalidCylindricalStorage || expectedSize || expectedException + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(100, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) } def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { when: def thermalBus = ThermalUnitInputTestData.thermalBus - def domesticHotWaterStorageInput = [ - ThermalUnitInputTestData.domesticHotWaterStorageInput - ] - def cylindricalStorageInput = [ - ThermalUnitInputTestData.cylindricalStorageInput - ] + def cylindricalStorageInput = [ThermalUnitInputTestData.cylindricStorageInput] - ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) + + ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput) List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() @@ -137,7 +133,7 @@ class ThermalValidationUtilsTest extends Specification { where: - thermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) + thermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } } From 40a4174af231b3fc38d77fc57c446183686faf1a Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 29 Jan 2025 08:14:16 +0100 Subject: [PATCH 225/310] fmt --- .../utils/validation/ThermalValidationUtilsTest.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index 1b8297545..aee73fe73 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -117,7 +117,9 @@ class ThermalValidationUtilsTest extends Specification { def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { when: def thermalBus = ThermalUnitInputTestData.thermalBus - def cylindricalStorageInput = [ThermalUnitInputTestData.cylindricStorageInput] + def cylindricalStorageInput = [ + ThermalUnitInputTestData.cylindricStorageInput + ] ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput) From db08939cf9633bef159902d181f0d9beae96cd3d Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 29 Jan 2025 08:17:41 +0100 Subject: [PATCH 226/310] Fix spotless deprecations --- CHANGELOG.md | 1 + gradle/scripts/spotless.gradle | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd30cd83..b0547a2c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Converted `MappingEntry` into a normal class [#1087](https://github.com/ie3-institute/PowerSystemDataModel/issues/1087) - Renamed timeseries mapping `participant` column to `asset` [#1191](https://github.com/ie3-institute/PowerSystemDataModel/issues/1191) - Removed attribute `dsm` from `LoadInput` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195) +- Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223) ## [5.1.0] - 2024-06-24 diff --git a/gradle/scripts/spotless.gradle b/gradle/scripts/spotless.gradle index 7d547fb29..e0871f80b 100644 --- a/gradle/scripts/spotless.gradle +++ b/gradle/scripts/spotless.gradle @@ -22,21 +22,21 @@ spotless { // the Groovy Eclipse formatter extends the Java Eclipse formatter, // so it formats Java files by default (unless `excludeJava` is used). greclipse().configFile('greclipse.properties') - indentWithSpaces 2 + leadingTabsToSpaces 2 } groovyGradle { // same as groovy, but for .gradle (defaults to '*.gradle') target '*.gradle', 'gradle/scripts/*.gradle' greclipse() - indentWithSpaces 2 + leadingTabsToSpaces 2 } // removes unnecessary whitespace, indents with tabs and ends on new line for gradle, md and gitignore files and config-XMLs format 'misc', { target '**/.gitignore', 'configs/**' trimTrailingWhitespace() - indentWithTabs() + leadingSpacesToTabs() endWithNewline() } } From 264383160e2a5a942eeb5a1512d1bba89b073e93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2025 08:46:27 +0000 Subject: [PATCH 227/310] Bump net.bytebuddy:byte-buddy from 1.16.1 to 1.17.0 (#1225) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 351dea7c6..c70b1bbec 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.16.1' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.17.0' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From 7bb1b23294170f27325efd50233a4f1ce628fc0c Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 12:10:09 +0100 Subject: [PATCH 228/310] Adding some tests. --- .../BdewLoadProfileFactoryTest.groovy | 20 +++++++++++++++++++ .../RandomLoadProfileFactoryTest.groovy | 20 +++++++++++++++++++ .../models/profile/LoadProfileTest.groovy | 2 +- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index 80a2f5300..db4e2849a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -9,8 +9,10 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared import spock.lang.Specification +import tech.units.indriya.quantity.Quantities class BdewLoadProfileFactoryTest extends Specification { @Shared @@ -140,4 +142,22 @@ class BdewLoadProfileFactoryTest extends Specification { lpts.loadProfile == BdewStandardLoadProfile.G0 lpts.entries.size() == 3 } + + def "A BDEWLoadProfileFactory does return the max power correctly"() { + when: + def maxPower = factory.calculateMaxPower(BdewStandardLoadProfile.G0, allEntries) + + then: + maxPower.isPresent() + maxPower.get() == Quantities.getQuantity(77.7, PowerSystemUnits.WATT) + } + + def "A BDEWLoadProfileFactory does return an energy scaling correctly"() { + when: + def energyScaling = factory.getLoadProfileEnergyScaling(BdewStandardLoadProfile.G0) + + then: + energyScaling.isPresent() + energyScaling.get() == Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR) + } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 514fb598a..22cb08121 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -9,8 +9,10 @@ import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.models.profile.LoadProfile import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.load.RandomLoadValues +import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared import spock.lang.Specification +import tech.units.indriya.quantity.Quantities class RandomLoadProfileFactoryTest extends Specification { @Shared @@ -140,4 +142,22 @@ class RandomLoadProfileFactoryTest extends Specification { lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE lpts.entries.size() == 3 } + + def "A RandomLoadProfileFactory does return the max power correctly"() { + when: + def maxPower = factory.calculateMaxPower(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE, allEntries) + + then: + maxPower.isPresent() + maxPower.get() == Quantities.getQuantity(159d, PowerSystemUnits.WATT) + } + + def "A RandomLoadProfileFactory does return an energy scaling correctly"() { + when: + def energyScaling = factory.getLoadProfileEnergyScaling(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE) + + then: + energyScaling.isPresent() + energyScaling.get() == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) + } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy index d7fb77e5c..0265d24c4 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy @@ -110,7 +110,7 @@ class LoadProfileTest extends Specification { "H_0" || BdewStandardLoadProfile.H0 } - def "Tempearture dependent load profiles can be parsed correctly"() { + def "Temperature dependent load profiles can be parsed correctly"() { when: TemperatureDependantLoadProfile actual = TemperatureDependantLoadProfile.parse(key) From 8ec5faacedecca18a494e0b463386e9be2c44a42 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 12:38:45 +0100 Subject: [PATCH 229/310] Replaced `LoadProfileInput` with `LoadProfileTimeSeries` --- CHANGELOG.md | 1 + .../io/connectors/CsvFileConnector.java | 3 +- .../datamodel/io/csv/CsvFileDefinition.java | 2 +- .../TimeSeriesMetaInformationFactory.java | 21 +++- .../io/naming/DatabaseNamingStrategy.java | 22 ++-- .../io/naming/DefaultDirectoryHierarchy.java | 5 +- .../EntityPersistenceNamingStrategy.java | 35 ++---- .../io/naming/FileNamingStrategy.java | 14 ++- ...n.java => LoadProfileMetaInformation.java} | 11 +- .../io/processor/ProcessorProvider.java | 4 +- .../processor/input/InputEntityProcessor.java | 1 - .../timeseries/TimeSeriesProcessor.java | 10 +- .../ie3/datamodel/io/sink/CsvFileSink.java | 4 +- .../edu/ie3/datamodel/io/sink/DataSink.java | 2 +- .../ie3/datamodel/io/sink/InfluxDbSink.java | 11 +- .../edu/ie3/datamodel/io/sink/SqlSink.java | 59 +++++++--- .../SqlTimeSeriesMetaInformationSource.java | 5 +- .../models/timeseries/TimeSeries.java | 2 +- .../repetitive/LoadProfileEntry.java | 40 +++---- .../repetitive/LoadProfileInput.java | 87 -------------- .../repetitive/LoadProfileTimeSeries.java | 108 ++++++++++++++++++ .../repetitive/RepetitiveTimeSeries.java | 28 +++-- .../models/value/load/LoadValues.java | 23 ++++ .../ie3/datamodel/utils/TimeSeriesUtils.java | 10 ++ ...EntityPersistenceNamingStrategyTest.groovy | 63 ++-------- .../io/naming/FileNamingStrategyTest.groovy | 80 ++++--------- .../io/processor/ProcessorProviderTest.groovy | 4 - .../input/InputEntityProcessorTest.groovy | 38 ------ .../timeseries/TimeSeriesProcessorTest.groovy | 13 --- .../datamodel/io/sink/CsvFileSinkTest.groovy | 1 - .../ie3/test/common/TimeSeriesTestData.groovy | 43 ------- 31 files changed, 329 insertions(+), 421 deletions(-) rename src/main/java/edu/ie3/datamodel/io/naming/timeseries/{LoadProfileTimeSeriesMetaInformation.java => LoadProfileMetaInformation.java} (76%) delete mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 3abd7d730..50384ec7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed timeseries mapping `participant` column to `asset` [#1191](https://github.com/ie3-institute/PowerSystemDataModel/issues/1191) - Removed attribute `dsm` from `LoadInput` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195) - Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223) +- Replaced `LoadProfileInput` with `LoadProfileTimeSeries` [#1228](https://github.com/ie3-institute/PowerSystemDataModel/issues/1228) ## [5.1.0] - 2024-06-24 diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 7628bf3b2..358b60739 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -63,7 +63,8 @@ public synchronized BufferedCsvWriter getOrInitWriter( } } - public synchronized , E extends TimeSeriesEntry, V extends Value> + public synchronized < + T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> BufferedCsvWriter getOrInitWriter(T timeSeries, CsvFileDefinition fileDefinition) throws ConnectorException { /* Try to the right writer */ diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java index 6afe95a39..f220f537a 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java @@ -68,7 +68,7 @@ public CsvFileDefinition( * @param fileNamingStrategy that should be used * @throws FileException If the definition cannot be determined */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> CsvFileDefinition( T timeSeries, String[] headLineElements, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index 327f920eb..71c64cbd8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -7,8 +7,10 @@ import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import java.util.Collections; import java.util.List; import java.util.Set; @@ -21,12 +23,13 @@ * mappings */ public class TimeSeriesMetaInformationFactory - extends EntityFactory { + extends EntityFactory { private static final String TIME_SERIES = "timeSeries"; private static final String COLUMN_SCHEME = "columnScheme"; + private static final String LOAD_PROFILE = "loadProfile"; public TimeSeriesMetaInformationFactory() { - super(IndividualTimeSeriesMetaInformation.class); + super(IndividualTimeSeriesMetaInformation.class, LoadProfileMetaInformation.class); } @Override @@ -36,9 +39,15 @@ protected List> getFields(Class entityClass) { } @Override - protected IndividualTimeSeriesMetaInformation buildModel(EntityData data) { - UUID timeSeries = data.getUUID(TIME_SERIES); - ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); - return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); + protected TimeSeriesMetaInformation buildModel(EntityData data) { + if (LoadProfileMetaInformation.class.isAssignableFrom(data.getTargetClass())) { + String profile = data.getField(LOAD_PROFILE); + return new LoadProfileMetaInformation(profile); + } else { + UUID timeSeries = data.getUUID(TIME_SERIES); + + ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); + return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); + } } } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index b3b35172b..03a9a32d2 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -12,7 +12,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; import java.util.Optional; @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy { private static final String TIME_SERIES_PREFIX = "time_series_"; - private static final String LOAD_PROFILE_PREFIX = "load_profile_"; + private static final String LOAD_PROFILE = "load_profiles"; private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy; @@ -42,6 +42,11 @@ public String getTimeSeriesPrefix() { return TIME_SERIES_PREFIX; } + /** Returns the String of the load profile table */ + public String getLoadProfileTableName() { + return LOAD_PROFILE; + } + /** * Provides the name of a time series table given a column scheme * @@ -53,13 +58,12 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) { } /** - * Provides the name of a load profile given by the load profile key + * Provides the name of the load profile table. * - * @param lpKey Load profile key * @return the table name */ - private String getLoadProfileEntityName(String lpKey) { - return LOAD_PROFILE_PREFIX + lpKey; + public String getLoadProfileEntityName() { + return getLoadProfileTableName(); } /** @@ -78,7 +82,7 @@ public Optional getEntityName(Class cls) { * @param timeSeries to be named TimeSeries * @return the table name */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) { Optional maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst(); @@ -89,8 +93,8 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { - return Optional.of(getLoadProfileEntityName(loadProfileInput.getType().getKey())); + } else if (timeSeries instanceof LoadProfileTimeSeries) { + return Optional.of(getLoadProfileEntityName()); } else { logger.error("There is no naming strategy defined for {}", timeSeries); return Optional.empty(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java b/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java index 5964b2433..fff633bbe 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DefaultDirectoryHierarchy.java @@ -30,7 +30,6 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult; import edu.ie3.datamodel.models.timeseries.TimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -250,9 +249,7 @@ private enum SubDirectories { StorageTypeInput.class, WecTypeInput.class, OperatorInput.class, - WecCharacteristicInput.class, - RandomLoadParameters.class, - LoadProfileInput.class) + WecCharacteristicInput.class) .collect(Collectors.toSet())), PARTICIPANTS_INPUT( Constants.INPUT_SUB_TREE.resolve("participants"), diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 208fa0b81..37a070aa3 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -7,7 +7,7 @@ import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.input.*; @@ -17,7 +17,7 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.*; import edu.ie3.util.StringUtils; import java.util.Optional; @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy { * profile is accessible via the named capturing group "profile", the uuid by the group "uuid" */ private static final String LOAD_PROFILE_TIME_SERIES = - "lpts_(?[a-zA-Z][0-9])_(?" + UUID_STRING + ")"; + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})"; /** * Pattern to identify load profile time series in this instance of the naming strategy (takes @@ -156,15 +156,13 @@ public IndividualTimeSeriesMetaInformation individualTimesSeriesMetaInformation( * @param fileName File name to extract information from * @return Meta information form load profile time series file name */ - public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformation( - String fileName) { + public LoadProfileMetaInformation loadProfileTimesSeriesMetaInformation(String fileName) { Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName); if (!matcher.matches()) throw new IllegalArgumentException( "Cannot extract meta information on load profile time series from '" + fileName + "'."); - return new LoadProfileTimeSeriesMetaInformation( - UUID.fromString(matcher.group("uuid")), matcher.group("profile")); + return new LoadProfileMetaInformation(matcher.group("profile")); } /** @@ -215,8 +213,6 @@ public Optional getInputEntityName(Class cls) { return getTypeEntityName(cls.asSubclass(AssetTypeInput.class)); if (AssetInput.class.isAssignableFrom(cls)) return getAssetInputEntityName(cls.asSubclass(AssetInput.class)); - if (RandomLoadParameters.class.isAssignableFrom(cls)) - return getRandomLoadParametersEntityName(cls.asSubclass(RandomLoadParameters.class)); if (GraphicInput.class.isAssignableFrom(cls)) return getGraphicsInputEntityName(cls.asSubclass(GraphicInput.class)); if (OperatorInput.class.isAssignableFrom(cls)) @@ -274,19 +270,6 @@ public Optional getAssetCharacteristicsEntityName( return Optional.of(addPrefixAndSuffix(assetCharString)); } - /** - * Get the entity name for all {@link RandomLoadParameters} - * - * @param randomLoadParamClass the random load parameters class an entity name string should be - * generated from - * @return the entity name string - */ - public Optional getRandomLoadParametersEntityName( - Class randomLoadParamClass) { - String loadParamString = camelCaseToSnakeCase(randomLoadParamClass.getSimpleName()); - return Optional.of(addPrefixAndSuffix(loadParamString.concat("_input"))); - } - /** * Converts a given camel case string to its snake case representation * @@ -359,7 +342,7 @@ public Optional getTimeSeriesMappingEntityName() { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries) { Optional maybeFirstElement = timeSeries.getEntries().stream().findFirst(); @@ -383,14 +366,12 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileInput loadProfileInput) { + } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileTimeSeries) { return Optional.of( prefix .concat("lpts") .concat("_") - .concat(loadProfileInput.getType().getKey()) - .concat("_") - .concat(loadProfileInput.getUuid().toString()) + .concat(loadProfileTimeSeries.getLoadProfile().getKey()) .concat(suffix)); } else { logger.error("There is no naming strategy defined for {}", timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 8aadbc0be..dc3e8dc66 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -7,11 +7,12 @@ import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; import edu.ie3.datamodel.utils.FileUtils; import java.nio.file.Path; @@ -136,7 +137,7 @@ public Optional getDirectoryPath(Class cls) { * @param timeSeries Time series to derive naming information from * @return An optional sub directory path */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getDirectoryPath(T timeSeries) { Optional maybeDirectoryName = fileHierarchy.getSubDirectory(timeSeries.getClass()); if (maybeDirectoryName.isEmpty()) { @@ -180,7 +181,7 @@ public Pattern getIndividualTimeSeriesPattern() { * @return A load profile time series pattern */ public Pattern getLoadProfileTimeSeriesPattern() { - Optional subDirectory = fileHierarchy.getSubDirectory(LoadProfileInput.class); + Optional subDirectory = fileHierarchy.getSubDirectory(LoadProfileTimeSeries.class); if (subDirectory.isEmpty()) { return entityPersistenceNamingStrategy.getLoadProfileTimeSeriesPattern(); @@ -237,6 +238,11 @@ public IndividualTimeSeriesMetaInformation individualTimeSeriesMetaInformation(S removeFileNameEnding(fileName)); } + public LoadProfileMetaInformation loadProfileTimeSeriesMetaInformation(String fileName) { + return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation( + removeFileNameEnding(fileName)); + } + public static String removeFileNameEnding(String fileName) { return fileName.replaceAll("(?:\\.[^.\\\\/\\s]{1,255}){1,2}$", ""); } @@ -274,7 +280,7 @@ public Optional getEntityName(Class cls) { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { return entityPersistenceNamingStrategy.getEntityName(timeSeries); } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java similarity index 76% rename from src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java index d1e319668..875c881e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileMetaInformation.java @@ -10,10 +10,15 @@ import java.util.UUID; /** Specific meta information, that can be derived from a load profile time series file */ -public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation { +public class LoadProfileMetaInformation extends TimeSeriesMetaInformation { private final String profile; - public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { + public LoadProfileMetaInformation(String profile) { + super(UUID.randomUUID()); + this.profile = profile; + } + + public LoadProfileMetaInformation(UUID uuid, String profile) { super(uuid); this.profile = profile; } @@ -25,7 +30,7 @@ public String getProfile() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof LoadProfileTimeSeriesMetaInformation that)) return false; + if (!(o instanceof LoadProfileMetaInformation that)) return false; if (!super.equals(o)) return false; return profile.equals(that.profile); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 58cad7354..8fc1a538a 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -122,7 +122,7 @@ private EntityProcessor getEntityProcessor(Class Type of the value inside the time series entries * @return A set of mappings from field name to value */ - public , E extends TimeSeriesEntry, V extends Value> + public , E extends TimeSeriesEntry, V extends Value> Set> handleTimeSeries(T timeSeries) throws ProcessorProviderException { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -145,7 +145,7 @@ Set> handleTimeSeries(T timeSeries) * @throws ProcessorProviderException If no fitting processor can be found */ @SuppressWarnings("unchecked cast") - private , E extends TimeSeriesEntry, V extends Value> + private , E extends TimeSeriesEntry, V extends Value> TimeSeriesProcessor getTimeSeriesProcessor(TimeSeriesProcessorKey processorKey) throws ProcessorProviderException { TimeSeriesProcessor processor = diff --git a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java index d21212531..18c6a723f 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/input/InputEntityProcessor.java @@ -35,7 +35,6 @@ public class InputEntityProcessor extends EntityProcessor { List.of( /* InputEntity */ OperatorInput.class, - RandomLoadParameters.class, TimeSeriesMappingSource.MappingEntry.class, IdCoordinateInput.class, /* - AssetInput */ diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 52f1a602a..65edd5980 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -13,8 +13,6 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput; import edu.ie3.datamodel.models.value.*; import java.lang.reflect.Method; import java.util.*; @@ -22,7 +20,7 @@ import java.util.stream.Stream; public class TimeSeriesProcessor< - T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> + T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> extends EntityProcessor { /** * List of all combinations of time series class, entry class and value class, this processor is @@ -49,8 +47,7 @@ public class TimeSeriesProcessor< new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, SValue.class), new TimeSeriesProcessorKey( - IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), - new TimeSeriesProcessorKey(LoadProfileInput.class, LoadProfileEntry.class, PValue.class)); + IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class)); /** * Specific combination of time series class, entry class and value class, this processor is @@ -110,7 +107,8 @@ private SortedMap buildFieldToSource( throws EntityProcessorException { /* Get the mapping from field name to getter method ignoring the getter for returning all entries */ Map timeSeriesMapping = - mapFieldNameToGetter(timeSeriesClass, Arrays.asList("entries", "uuid", "type")) + mapFieldNameToGetter( + timeSeriesClass, Arrays.asList("entries", "uuid", "type", "loadProfile")) .entrySet() .stream() .collect( diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 8635534a7..26f0801ac 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -243,7 +243,7 @@ public void shutdown() { } @Override - public , V extends Value> void persistTimeSeries( + public , V extends Value> void persistTimeSeries( TimeSeries timeSeries) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -264,7 +264,7 @@ public , V extends Value> void persistTimeSeries( } } - private , V extends Value> void persistTimeSeries( + private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, BufferedCsvWriter writer) throws ProcessorProviderException { try { Set> entityFieldData = diff --git a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java index 1d45320dc..d4dca754e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java @@ -62,6 +62,6 @@ public interface DataSink { * @param Type of entry in the time series * @param Type of actual value, that is inside the entry */ - , V extends Value> void persistTimeSeries( + , V extends Value> void persistTimeSeries( TimeSeries timeSeries) throws ProcessorProviderException; } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 5730a1585..85255f916 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -85,7 +85,7 @@ public void persistAll(Collection entities) } @Override - public , V extends Value> void persistTimeSeries( + public , V extends Value> void persistTimeSeries( TimeSeries timeSeries) throws ProcessorProviderException { Set points = transformToPoints(timeSeries); writeAll(points); @@ -146,8 +146,8 @@ private Point transformToPoint(ResultEntity entity, String measurementName) * * @param timeSeries the time series to transform */ - private , V extends Value> Set transformToPoints( - TimeSeries timeSeries) throws ProcessorProviderException { + private , V extends Value> + Set transformToPoints(TimeSeries timeSeries) throws ProcessorProviderException { if (timeSeries.getEntries().isEmpty()) return Collections.emptySet(); Optional measurementName = entityPersistenceNamingStrategy.getEntityName(timeSeries); @@ -169,8 +169,9 @@ private , V extends Value> Set transformToPo * @param timeSeries the time series to transform * @param measurementName equivalent to the name of a relational table */ - private , V extends Value> Set transformToPoints( - TimeSeries timeSeries, String measurementName) throws ProcessorProviderException { + private , V extends Value> + Set transformToPoints(TimeSeries timeSeries, String measurementName) + throws ProcessorProviderException { Set points = new HashSet<>(); Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 907322b1f..35cdf3b9e 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -5,10 +5,12 @@ */ package edu.ie3.datamodel.io.sink; -import static edu.ie3.datamodel.io.SqlUtils.*; +import static edu.ie3.datamodel.io.SqlUtils.quote; import static java.util.stream.Collectors.groupingBy; -import edu.ie3.datamodel.exceptions.*; +import edu.ie3.datamodel.exceptions.EntityProcessorException; +import edu.ie3.datamodel.exceptions.ExtractorException; +import edu.ie3.datamodel.exceptions.ProcessorProviderException; import edu.ie3.datamodel.io.DbGridMetadata; import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.extractor.Extractor; @@ -18,17 +20,22 @@ import edu.ie3.datamodel.io.processor.ProcessorProvider; import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey; import edu.ie3.datamodel.models.Entity; -import edu.ie3.datamodel.models.input.*; -import edu.ie3.datamodel.models.input.connector.*; +import edu.ie3.datamodel.models.input.AssetTypeInput; +import edu.ie3.datamodel.models.input.InputEntity; +import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.connector.ConnectorInput; import edu.ie3.datamodel.models.input.container.JointGridContainer; import edu.ie3.datamodel.models.input.graphics.GraphicInput; -import edu.ie3.datamodel.models.input.system.*; +import edu.ie3.datamodel.models.input.system.SystemParticipantInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput; import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; import edu.ie3.datamodel.models.value.Value; +import edu.ie3.datamodel.utils.TriFunction; import edu.ie3.util.StringUtils; import java.sql.SQLException; import java.util.*; @@ -47,6 +54,7 @@ public class SqlSink { private final String schemaName; private static final String TIME_SERIES = "time_series"; + private static final String LOAD_PROFILE = "load_profile"; public SqlSink( String schemaName, DatabaseNamingStrategy databaseNamingStrategy, SqlConnector connector) @@ -109,12 +117,12 @@ public void persistAll(Collection entities, DbGridMetadata } /** - * Persist an entity. By default this method takes care of the extraction process of nested + * Persist an entity. By default, this method takes care of the extraction process of nested * entities (if any) * * @param entity the entity that should be persisted * @param identifier identifier of the grid - * @throws SQLException + * @throws SQLException if an error occurred */ public void persist(C entity, DbGridMetadata identifier) throws SQLException { if (entity instanceof InputEntity inputEntity) { @@ -178,7 +186,7 @@ private void persistMixedList(List entities, DbGridMetadat * Persist a list of entities with same types. To minimize the number of queries, the entities * will be grouped by their class. */ - private , V extends Value> void persistList( + private , V extends Value> void persistList( List entities, Class cls, DbGridMetadata identifier) throws SQLException { // Check if there are only elements of the same class Class firstClass = entities.get(0).getClass(); @@ -222,7 +230,7 @@ private void insertListIgnoreNested( } /** Persist one time series. */ - protected , V extends Value> void persistTimeSeries( + protected , V extends Value> void persistTimeSeries( TimeSeries timeSeries, DbGridMetadata identifier) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); @@ -234,17 +242,30 @@ protected , V extends Value> void persistTimeSeries } } - private , V extends Value> void persistTimeSeries( + private , V extends Value> void persistTimeSeries( TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { try { + + TriFunction queryBuilder; + String timeSeriesIdentifier; + + if (timeSeries instanceof LoadProfileTimeSeries lpts) { + timeSeriesIdentifier = lpts.getLoadProfile().getKey(); + queryBuilder = this::basicInsertQueryValuesLPTS; + } else { + timeSeriesIdentifier = timeSeries.getUuid().toString(); + queryBuilder = this::basicInsertQueryValuesITS; + } + String query = - basicInsertQueryValuesITS( + queryBuilder.apply( schemaName, databaseNamingStrategy.getEntityName(timeSeries).orElseThrow(), headerElements); Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); + query = query + entityFieldData.stream() @@ -254,7 +275,7 @@ private , V extends Value> void persistTimeSeries( sqlEntityFieldData(data), headerElements, identifier, - timeSeries.getUuid().toString())) + timeSeriesIdentifier)) .collect(Collectors.joining(",\n", "", ";")); executeQueryToPersist(query); } catch (ProcessorProviderException e) { @@ -352,13 +373,13 @@ private String queryTimeSeriesValueLine( Map entityFieldData, String[] headerElements, DbGridMetadata identifier, - String tsUuid) { + String timeSeriesIdentifier) { return writeOneLine( Stream.concat( Stream.concat( Arrays.stream(headerElements).map(entityFieldData::get), identifier.getStreamForQuery()), - Stream.of(quote(tsUuid, "'")))); + Stream.of(quote(timeSeriesIdentifier, "'")))); } private LinkedHashMap sqlEntityFieldData( @@ -397,6 +418,16 @@ private String basicInsertQueryValuesITS( + "\nVALUES\n"; } + /** Provides the insert, column names, grid identifier, and the VALUES statement for a query. */ + private String basicInsertQueryValuesLPTS( + String schemaName, String tableName, String[] headerElements) { + String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN, LOAD_PROFILE}; + return basicInsertQuery(schemaName, tableName) + + " " + + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) + + "\nVALUES\n"; + } + /** Converts a stream of strings into an one line string with brackets. */ private String writeOneLine(Stream entries) { return "(" + entries.collect(Collectors.joining(",")) + ")"; diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index f0144b986..ad372d2fd 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -94,6 +94,9 @@ private Optional createEntity( Map fieldToValues) { EntityData entityData = new EntityData(fieldToValues, IndividualTimeSeriesMetaInformation.class); - return mappingFactory.get(entityData).getData(); + return mappingFactory + .get(entityData) + .map(meta -> (IndividualTimeSeriesMetaInformation) meta) + .getData(); } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java index 279c100d9..62593b0ae 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java @@ -17,7 +17,7 @@ * @param Type of the entries, the time series is foreseen to contain * @param Type of the values, the entries will have */ -public abstract class TimeSeries, V extends Value> +public abstract class TimeSeries, V extends Value> extends UniqueEntity { private final Set entries; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java index 2e0359967..10f90d632 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileEntry.java @@ -6,27 +6,20 @@ package edu.ie3.datamodel.models.timeseries.repetitive; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; +import edu.ie3.datamodel.models.value.load.LoadValues; import java.util.Objects; -/** Unique entry to a {@link LoadProfileInput} */ -public class LoadProfileEntry extends TimeSeriesEntry { - private final DayOfWeek dayOfWeek; - private final int quarterHourOfDay; +/** Unique entry to a {@link LoadProfileTimeSeries} */ +public class LoadProfileEntry extends TimeSeriesEntry { + private final int quarterHour; - public LoadProfileEntry(PValue value, DayOfWeek dayOfWeek, int quarterHourOfDay) { - super(value); - this.dayOfWeek = dayOfWeek; - this.quarterHourOfDay = quarterHourOfDay; + public LoadProfileEntry(L values, int quarterHour) { + super(values); + this.quarterHour = quarterHour; } - public DayOfWeek getDayOfWeek() { - return dayOfWeek; - } - - public int getQuarterHourOfDay() { - return quarterHourOfDay; + public int getQuarterHour() { + return quarterHour; } @Override @@ -34,24 +27,17 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - LoadProfileEntry that = (LoadProfileEntry) o; - return quarterHourOfDay == that.quarterHourOfDay && dayOfWeek == that.dayOfWeek; + LoadProfileEntry that = (LoadProfileEntry) o; + return quarterHour == that.quarterHour; } @Override public int hashCode() { - return Objects.hash(super.hashCode(), dayOfWeek, quarterHourOfDay); + return Objects.hash(super.hashCode(), quarterHour); } @Override public String toString() { - return "LoadProfileEntry{" - + "dayOfWeek=" - + dayOfWeek - + ", quarterHourOfDay=" - + quarterHourOfDay - + ", value=" - + value - + '}'; + return "LoadProfileEntry{" + "quarterHour=" + quarterHour + ", value=" + value + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java deleted file mode 100644 index 017e28c02..000000000 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileInput.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.timeseries.repetitive; - -import edu.ie3.datamodel.models.profile.StandardLoadProfile; -import edu.ie3.datamodel.models.value.PValue; -import java.time.DayOfWeek; -import java.time.ZonedDateTime; -import java.util.*; -import java.util.stream.Collectors; - -// TODO This is a sample implementation, please implement a real scenario -public class LoadProfileInput extends RepetitiveTimeSeries { - private final StandardLoadProfile type; - private final Map> dayOfWeekToHourlyValues; - - public LoadProfileInput(UUID uuid, StandardLoadProfile type, Set values) { - super(uuid, values); - this.type = type; - this.dayOfWeekToHourlyValues = - getEntries().stream() - .collect( - Collectors.groupingBy( - LoadProfileEntry::getDayOfWeek, - Collectors.toMap( - LoadProfileEntry::getQuarterHourOfDay, LoadProfileEntry::getValue))); - } - - public LoadProfileInput(StandardLoadProfile type, Set values) { - this(UUID.randomUUID(), type, values); - } - - @Override - public PValue calc(ZonedDateTime time) { - // dummy value - return dayOfWeekToHourlyValues.get(time.getDayOfWeek()).get(time.getHour()); - } - - @Override - protected Optional getPreviousDateTime(ZonedDateTime time) { - // dummy value - return Optional.of(time.minusMinutes(15)); - } - - @Override - protected Optional getNextDateTime(ZonedDateTime time) { - // dummy value - return Optional.of(time.plusMinutes(15)); - } - - @Override - public List getTimeKeysAfter(ZonedDateTime time) { - // dummy value - return List.of(time.plusHours(1)); - } - - public StandardLoadProfile getType() { - return type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - LoadProfileInput that = (LoadProfileInput) o; - return type.equals(that.type) && dayOfWeekToHourlyValues.equals(that.dayOfWeekToHourlyValues); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), type, dayOfWeekToHourlyValues); - } - - @Override - public String toString() { - return "LoadProfileInput{" - + "type=" - + type - + ", dayOfWeekToHourlyValues=" - + dayOfWeekToHourlyValues - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java new file mode 100644 index 000000000..6a14a863c --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -0,0 +1,108 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.value.load.LoadValues; +import edu.ie3.datamodel.utils.TimeSeriesUtils; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.stream.Collectors; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; + +/** + * Describes a load profile time series with repetitive values that can be calculated from a pattern + */ +public class LoadProfileTimeSeries + extends RepetitiveTimeSeries, PValue> { + private final LoadProfile loadProfile; + private final Map valueMapping; + + /** + * The maximum average power consumption per quarter-hour for a given calculated over all seasons + * and weekday types of given load profile. + */ + public final Optional> maxPower; + + /** The profile energy scaling in kWh. */ + public final Optional> profileEnergyScaling; + + public LoadProfileTimeSeries( + UUID uuid, + LoadProfile loadProfile, + Set> entries, + Optional> maxPower, + Optional> profileEnergyScaling) { + super(uuid, entries); + this.loadProfile = loadProfile; + this.valueMapping = + entries.stream() + .collect( + Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); + + this.maxPower = maxPower; + this.profileEnergyScaling = profileEnergyScaling; + } + + /** Returns the {@link LoadProfile}. */ + public LoadProfile getLoadProfile() { + return loadProfile; + } + + @Override + public Set> getEntries() { + // to ensure that the entries are ordered by their quarter-hour + TreeSet> set = + new TreeSet<>(Comparator.comparing(LoadProfileEntry::getQuarterHour)); + set.addAll(super.getEntries()); + return set; + } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + return List.of(time.plusMinutes(15)); // dummy value that will return next quarter-hour value + } + + /** Returns the value mapping. */ + protected Map getValueMapping() { + return valueMapping; + } + + @Override + protected PValue calc(ZonedDateTime time) { + int quarterHour = TimeSeriesUtils.calculateQuarterHourOfDay(time); + return valueMapping.get(quarterHour).getValue(time, loadProfile); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; + return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "LoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index 672ee5589..c26f951f1 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -9,16 +9,12 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.value.Value; import java.time.ZonedDateTime; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; +import java.util.*; /** Describes a TimeSeries with repetitive values that can be calculated from a pattern */ -public abstract class RepetitiveTimeSeries, V extends Value> +public abstract class RepetitiveTimeSeries< + E extends TimeSeriesEntry, V extends Value> extends TimeSeries { - protected RepetitiveTimeSeries(Set entries) { - super(entries); - } protected RepetitiveTimeSeries(UUID uuid, Set entries) { super(uuid, entries); @@ -34,6 +30,22 @@ protected RepetitiveTimeSeries(UUID uuid, Set entries) { @Override public Optional getValue(ZonedDateTime time) { - return Optional.of(calc(time)); + return Optional.ofNullable(calc(time)); + } + + @Override + protected Optional getPreviousDateTime(ZonedDateTime time) { + return Optional.of(time.minusHours(1)); + } + + @Override + protected Optional getNextDateTime(ZonedDateTime time) { + return Optional.of(time.plusHours(1)); + } + + @Override + public List getTimeKeysAfter(ZonedDateTime time) { + // dummy value + return getNextDateTime(time).map(List::of).orElseGet(Collections::emptyList); } } diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java new file mode 100644 index 000000000..ae7fc4e26 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/LoadValues.java @@ -0,0 +1,23 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import edu.ie3.datamodel.models.value.Value; +import java.time.ZonedDateTime; + +/** Interface for load values. */ +public interface LoadValues extends Value { + + /** + * Method to calculate an actual load power value for the given time. + * + * @param time given time + * @return a new {@link PValue} + */ + PValue getValue(ZonedDateTime time, LoadProfile loadProfile); +} diff --git a/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java b/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java index 16fdcb24f..c7cb56b24 100644 --- a/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/TimeSeriesUtils.java @@ -69,4 +69,14 @@ public static Set getAcceptedColumnSchemes() { public static boolean isSchemeAccepted(ColumnScheme scheme) { return ACCEPTED_COLUMN_SCHEMES.contains(scheme); } + + /** + * Method to calculate the quarter-hour of a day from a given time. + * + * @param time given time + * @return the quarter-hour + */ + public static int calculateQuarterHourOfDay(ZonedDateTime time) { + return time.getHour() * 4 + time.getMinute() / 15; + } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index f34873c24..7986a3774 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -9,7 +9,6 @@ import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -19,22 +18,8 @@ import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.BmInput -import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.EvInput -import edu.ie3.datamodel.models.input.system.EvcsInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import edu.ie3.datamodel.models.input.system.HpInput -import edu.ie3.datamodel.models.input.system.LoadInput -import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.datamodel.models.input.system.WecInput -import edu.ie3.datamodel.models.input.system.type.BmTypeInput -import edu.ie3.datamodel.models.input.system.type.ChpTypeInput -import edu.ie3.datamodel.models.input.system.type.EvTypeInput -import edu.ie3.datamodel.models.input.system.type.HpTypeInput -import edu.ie3.datamodel.models.input.system.type.StorageTypeInput -import edu.ie3.datamodel.models.input.system.type.WecTypeInput +import edu.ie3.datamodel.models.input.system.* +import edu.ie3.datamodel.models.input.system.type.* import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile @@ -43,23 +28,13 @@ import edu.ie3.datamodel.models.result.connector.LineResult import edu.ie3.datamodel.models.result.connector.SwitchResult import edu.ie3.datamodel.models.result.connector.Transformer2WResult import edu.ie3.datamodel.models.result.connector.Transformer3WResult -import edu.ie3.datamodel.models.result.system.BmResult -import edu.ie3.datamodel.models.result.system.ChpResult -import edu.ie3.datamodel.models.result.system.EmResult -import edu.ie3.datamodel.models.result.system.EvResult -import edu.ie3.datamodel.models.result.system.EvcsResult -import edu.ie3.datamodel.models.result.system.FixedFeedInResult -import edu.ie3.datamodel.models.result.system.FlexOptionsResult -import edu.ie3.datamodel.models.result.system.LoadResult -import edu.ie3.datamodel.models.result.system.PvResult -import edu.ie3.datamodel.models.result.system.StorageResult -import edu.ie3.datamodel.models.result.system.WecResult +import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.RepetitiveTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits @@ -105,7 +80,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "The pattern for a repetitive load profile time series file name actually matches a valid file name and extracts the correct groups"() { given: def ens = new EntityPersistenceNamingStrategy() - def validFileName = "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" + def validFileName = "lpts_g3" when: def matcher = ens.loadProfileTimeSeriesPattern.matcher(validFileName) @@ -114,11 +89,9 @@ class EntityPersistenceNamingStrategyTest extends Specification { matcher.matches() then: "it also has correct capturing groups" - matcher.groupCount() == 2 + matcher.groupCount() == 1 matcher.group(1) == "g3" - matcher.group(2) == "bee0a8b6-4788-4f18-bf72-be52035f7304" matcher.group("profile") == "g3" - matcher.group("uuid") == "bee0a8b6-4788-4f18-bf72-be52035f7304" } def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() { @@ -344,22 +317,6 @@ class EntityPersistenceNamingStrategyTest extends Specification { WecTypeInput || "wec_type_input" } - def "A EntityPersistenceNamingStrategy without pre- or suffixes should return valid strings for a Load Parameter Model"() { - given: "a naming strategy without pre- or suffixes" - EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - - when: - Optional res = strategy.getEntityName(modelClass) - - then: - res.present - res.get() == expectedString - - where: - modelClass || expectedString - RandomLoadParameters || "random_load_parameters_input" - } - def "A EntityPersistenceNamingStrategy without pre- or suffixes should return valid strings for a graphic input Model"() { given: "a naming strategy without pre- or suffixes" EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() @@ -455,9 +412,9 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile input" () { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - LoadProfileInput timeSeries = Mock(LoadProfileInput) + LoadProfileTimeSeries timeSeries = Mock(LoadProfileTimeSeries) timeSeries.uuid >> uuid - timeSeries.type >> type + timeSeries.loadProfile >> type when: Optional actual = strategy.getEntityName(timeSeries) @@ -467,8 +424,8 @@ class EntityPersistenceNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" + clazz | uuid | type || expectedFileName + LoadProfileTimeSeries | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || "lpts_g3" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index fceb34480..528529532 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -7,12 +7,11 @@ package edu.ie3.datamodel.io.naming import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation -import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -61,7 +60,7 @@ import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits import spock.lang.Shared @@ -199,7 +198,7 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffix should return valid directory path for load profile time series"() { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) when: def actual = strategy.getDirectoryPath(timeSeries) @@ -210,7 +209,7 @@ class FileNamingStrategyTest extends Specification { where: clazz || expected - LoadProfileInput || Path.of("test_grid", "input", "global") + LoadProfileTimeSeries || Path.of("test_grid", "input", "participants", "time_series") } def "A FileNamingStrategy with DefaultHierarchy and should return valid directory path for individual time series"() { @@ -335,38 +334,6 @@ class FileNamingStrategyTest extends Specification { WecTypeInput || Path.of("test_grid", "input", "global", "wec_type_input") } - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for a Load Parameter Model"() { - given: "a file naming strategy without pre- or suffixes" - def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - - when: - def res = strategy.getDirectoryPath(modelClass) - - then: - res.present - res.get() == expectedPath - - where: - modelClass || expectedPath - RandomLoadParameters || Path.of("test_grid", "input", "global") - } - - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid file path for a Load Parameter Model"() { - given: "a file naming strategy without pre- or suffixes" - def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - - when: - def res = strategy.getFilePath(modelClass) - - then: - res.present - res.get() == expectedPath - - where: - modelClass || expectedPath - RandomLoadParameters || Path.of("test_grid", "input", "global", "random_load_parameters_input") - } - def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid file paths for a graphic input Model"() { given: "a file naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) @@ -431,9 +398,8 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffix should return valid file path for load profile time series"() { given: def strategy = new FileNamingStrategy(simpleEntityNaming, defaultHierarchy) - def timeSeries = Mock(LoadProfileInput) - timeSeries.uuid >> uuid - timeSeries.type >> type + def timeSeries = Mock(LoadProfileTimeSeries) + timeSeries.loadProfile >> type when: def actual = strategy.getFilePath(timeSeries) @@ -443,8 +409,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "global", "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304") + clazz | type || expectedFileName + LoadProfileTimeSeries | BdewStandardLoadProfile.G3 || Path.of("test_grid", "input", "participants", "time_series", "lpts_g3") } def "A FileNamingStrategy with DefaultHierarchy and without pre- or suffixes should return valid directory path for time series mapping"() { @@ -601,14 +567,13 @@ class FileNamingStrategyTest extends Specification { where: modelClass || expected - RandomLoadParameters || Optional.empty() TimeSeriesMappingSource.MappingEntry || Optional.empty() } def "A FileNamingStrategy with FlatHierarchy does return empty sub directory path for load profile time series"() { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def timeSeries = Mock(LoadProfileInput) + def timeSeries = Mock(LoadProfileTimeSeries) when: def actual = strategy.getDirectoryPath(timeSeries) @@ -739,9 +704,8 @@ class FileNamingStrategyTest extends Specification { def "A FileNamingStrategy with FlatHierarchy does return valid file path for load profile time series"() { given: "a naming strategy without pre- or suffixes" def strategy = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def timeSeries = Mock(LoadProfileInput) - timeSeries.uuid >> uuid - timeSeries.type >> type + def timeSeries = Mock(LoadProfileTimeSeries) + timeSeries.loadProfile >> type when: def actual = strategy.getFilePath(timeSeries) @@ -751,8 +715,8 @@ class FileNamingStrategyTest extends Specification { actual.get() == expectedFilePath where: - clazz | uuid | type || expectedFilePath - LoadProfileInput | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || Path.of("lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304") + clazz | type || expectedFilePath + LoadProfileTimeSeries | BdewStandardLoadProfile.G3 || Path.of("lpts_g3") } def "A FileNamingStrategy with FlatHierarchy does return valid file path for individual time series"() { @@ -798,7 +762,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "global" + escapedFileSeparator + "lpts_(?[a-zA-Z][0-9])_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "test_grid" + escapedFileSeparator + "input" + escapedFileSeparator + "participants" + escapedFileSeparator + "time_series" + escapedFileSeparator + "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})" } def "A FileNamingStrategy with FlatHierarchy returns correct individual time series file name pattern"() { @@ -820,7 +784,7 @@ class FileNamingStrategyTest extends Specification { def actual = strategy.loadProfileTimeSeriesPattern.pattern() then: - actual == "lpts_(?[a-zA-Z][0-9])_(?[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12})" + actual == "lpts_(?[a-zA-Z]{1,11}[0-9]{0,3})" } def "Trying to extract time series meta information throws an Exception, if it is provided a malformed string"() { @@ -942,15 +906,14 @@ class FileNamingStrategyTest extends Specification { def "The FileNamingStrategy extracts correct meta information from a valid load profile time series file name"() { given: def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy) - def path = Path.of("/bla/foo/lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304.csv") + def path = Path.of("/bla/foo/lpts_g3.csv") when: def metaInformation = fns.timeSeriesMetaInformation(path) then: - LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) - (metaInformation as LoadProfileTimeSeriesMetaInformation).with { - assert uuid == UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") + LoadProfileMetaInformation.isAssignableFrom(metaInformation.getClass()) + (metaInformation as LoadProfileMetaInformation).with { assert profile == "g3" } } @@ -958,15 +921,14 @@ class FileNamingStrategyTest extends Specification { def "The FileNamingStrategy extracts correct meta information from a valid load profile time series file name with pre- and suffix"() { given: def fns = new FileNamingStrategy(new EntityPersistenceNamingStrategy("prefix", "suffix"), flatHierarchy) - def path = Path.of("/bla/foo/prefix_lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304_suffix.csv") + def path = Path.of("/bla/foo/prefix_lpts_g3_suffix.csv") when: def metaInformation = fns.timeSeriesMetaInformation(path) then: - LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) - (metaInformation as LoadProfileTimeSeriesMetaInformation).with { - assert uuid == UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") + LoadProfileMetaInformation.isAssignableFrom(metaInformation.getClass()) + (metaInformation as LoadProfileMetaInformation).with { assert profile == "g3" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index b5e145799..aa65e1c84 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -40,8 +40,6 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput import edu.ie3.datamodel.models.value.* import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData @@ -60,7 +58,6 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData List knownEntityProcessors = [ /* InputEntity */ OperatorInput, - RandomLoadParameters, TimeSeriesMappingSource.MappingEntry, IdCoordinateInput, /* - AssetInput */ @@ -142,7 +139,6 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndPValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), - new TimeSeriesProcessorKey(LoadProfileInput, LoadProfileEntry, PValue) ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index 2dece01b2..e22ff1a99 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -13,7 +13,6 @@ import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.RandomLoadParameters import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput @@ -362,43 +361,6 @@ class InputEntityProcessorTest extends Specification { actual == expected } - def "The InputEntityProcessor should serialize a provided RandomLoadParameters correctly"() { - given: - InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) - RandomLoadParameters parameters = new RandomLoadParameters( - UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), - 4, - 1.2, - 2.3, - 3.4, - 4.5, - 5.6, - 6.7, - 7.8, - 8.9, - 9.10 - ) - Map expected = [ - "uuid" : "a5b0f432-27b5-4b3e-b87a-61867b9edd79", - "quarterHour": "4", - "kWd" : "1.2", - "kSa" : "2.3", - "kSu" : "3.4", - "myWd" : "4.5", - "mySa" : "5.6", - "mySu" : "6.7", - "sigmaWd" : "7.8", - "sigmaSa" : "8.9", - "sigmaSu" : "9.1" - ] - - when: - Map actual = processor.handleEntity(parameters) - - then: - actual == expected - } - def "The InputEntityProcessor should serialize a provided WecTypeInput correctly"() { given: InputEntityProcessor processor = new InputEntityProcessor(WecTypeInput) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 671482420..8c782715e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -10,8 +10,6 @@ import edu.ie3.datamodel.io.processor.Processor import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput import edu.ie3.datamodel.models.value.* import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification @@ -209,15 +207,4 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat then: actual == individualHeatAndSTimeSeriesProcessed } - - def "A TimeSeriesProcessors handles a complete LoadProfileInput correctly"() { - given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(LoadProfileInput, LoadProfileEntry, PValue) - - when: - Set> actual = processor.handleTimeSeries(loadProfileInput) - - then: - actual == loadProfileInputProcessed - } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index c7d18de70..e6b03240c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -236,7 +236,6 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("its_ph_56c20b88-c001-4225-8dac-cd13a75c6b48.csv").toFile().exists() testBaseFolderPath.resolve("its_pqh_83b577cc-06b1-47a1-bfff-ad648a00784b.csv").toFile().exists() testBaseFolderPath.resolve("its_c_a4bbcb77-b9d0-4b88-92be-b9a14a3e332b.csv").toFile().exists() - testBaseFolderPath.resolve("lpts_g2_b56853fe-b800-4c18-b324-db1878b22a28.csv").toFile().exists() testBaseFolderPath.resolve("its_weather_4fcbdfcd-4ff0-46dd-b0df-f3af7ae3ed98.csv").toFile().exists() } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 18e5030d3..efa2ccdea 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -18,7 +18,6 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput import edu.ie3.datamodel.models.value.* import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory @@ -26,7 +25,6 @@ import org.locationtech.jts.geom.Point import org.locationtech.jts.geom.PrecisionModel import tech.units.indriya.quantity.Quantities -import java.time.DayOfWeek import java.time.ZoneId import java.time.ZonedDateTime @@ -401,46 +399,6 @@ trait TimeSeriesTestData { ] as LinkedHashMap ] as Set - LoadProfileInput loadProfileInput = new LoadProfileInput( - UUID.fromString("b56853fe-b800-4c18-b324-db1878b22a28"), - BdewStandardLoadProfile.G2, - [ - new LoadProfileEntry( - new PValue(Quantities.getQuantity(5d, KILOWATT)), - DayOfWeek.MONDAY, - 0 - ), - new LoadProfileEntry( - new PValue(Quantities.getQuantity(15d, KILOWATT)), - DayOfWeek.MONDAY, - 1 - ), - new LoadProfileEntry( - new PValue(Quantities.getQuantity(10d, KILOWATT)), - DayOfWeek.MONDAY, - 2 - ) - ] as Set - ) - - Set> loadProfileInputProcessed = [ - [ - "dayOfWeek" : "MONDAY", - "p" : "5.0", - "quarterHourOfDay" : "0" - ] as LinkedHashMap, - [ - "dayOfWeek" : "MONDAY", - "p" : "15.0", - "quarterHourOfDay" : "1" - ] as LinkedHashMap, - [ - "dayOfWeek" : "MONDAY", - "p" : "10.0", - "quarterHourOfDay" : "2" - ] as LinkedHashMap - ] as Set - List allTimeSeries = [ individualPTimeSeries, individualEnergyPriceTimeSeries, @@ -450,6 +408,5 @@ trait TimeSeriesTestData { individualPTimeSeries, individualSTimeSeries, individualWeatherTimeSeries, - loadProfileInput ] } \ No newline at end of file From 426d9701e8ce54bba9875b8b5cb05888d63bb94b Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 13:07:27 +0100 Subject: [PATCH 230/310] Added `BdewLoadProfileTimeSeries` --- CHANGELOG.md | 1 + docs/uml/main/TimeSeriesDatamodelConcept.puml | 12 +- .../timeseries/BdewLoadProfileFactory.java | 127 ++++++++++++ .../factory/timeseries/LoadProfileData.java | 16 ++ .../timeseries/LoadProfileFactory.java | 51 +++++ .../ie3/datamodel/io/processor/Processor.java | 4 +- .../timeseries/TimeSeriesProcessor.java | 6 +- .../edu/ie3/datamodel/models/BdewSeason.java | 85 ++++++++ .../repetitive/BdewLoadProfileTimeSeries.java | 66 +++++++ .../models/value/load/BdewLoadValues.java | 184 ++++++++++++++++++ .../BdewLoadProfileFactoryTest.groovy | 163 ++++++++++++++++ ...EntityPersistenceNamingStrategyTest.groovy | 11 +- .../io/processor/ProcessorProviderTest.groovy | 4 + .../timeseries/TimeSeriesProcessorTest.groovy | 14 ++ .../datamodel/io/sink/CsvFileSinkTest.groovy | 1 + .../common/TimeSeriesSourceTestData.groovy | 10 +- .../ie3/test/common/TimeSeriesTestData.groovy | 58 ++++++ .../io/source/csv/_timeseries/lpts_g2.csv | 3 + 18 files changed, 806 insertions(+), 10 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/models/BdewSeason.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java create mode 100644 src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv diff --git a/CHANGELOG.md b/CHANGELOG.md index 50384ec7a..2d669828d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) - Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) +- Added `BdewLoadProfileTimeSeries` [#1230](https://github.com/ie3-institute/PowerSystemDataModel/issues/1230) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/docs/uml/main/TimeSeriesDatamodelConcept.puml b/docs/uml/main/TimeSeriesDatamodelConcept.puml index 370f3b2e8..7f0cda6d7 100644 --- a/docs/uml/main/TimeSeriesDatamodelConcept.puml +++ b/docs/uml/main/TimeSeriesDatamodelConcept.puml @@ -22,11 +22,21 @@ package models { childNote .. input childNote .. voltagelevels - interface StandardLoadProfile { + interface LoadProfile { + getKey: String + + {static} parse(String): LoadProfile + + {static} getAllProfiles: LoadProfile[] + + {static} getProfile(T[], String): T + enum DefaultLoadProfiles + + enum RandomLoadProfile + } + + DefaultLoadProfiles --|> LoadProfile + + interface StandardLoadProfile { + {static} parse(String): StandardLoadProfile } + StandardLoadProfile ..|> LoadProfile enum BdewLoadProfile { - key: String diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java new file mode 100644 index 000000000..b2bc2a74d --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -0,0 +1,127 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import static tech.units.indriya.unit.Units.WATT; + +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Stream; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +public class BdewLoadProfileFactory + extends LoadProfileFactory { + public static final String SUMMER_SATURDAY = "SuSa"; + public static final String SUMMER_SUNDAY = "SuSu"; + public static final String SUMMER_WEEKDAY = "SuWd"; + public static final String TRANSITION_SATURDAY = "TrSa"; + public static final String TRANSITION_SUNDAY = "TrSu"; + public static final String TRANSITION_WEEKDAY = "TrWd"; + public static final String WINTER_SATURDAY = "WiSa"; + public static final String WINTER_SUNDAY = "WiSu"; + public static final String WINTER_WEEKDAY = "WiWd"; + + public BdewLoadProfileFactory() { + this(BdewLoadValues.class); + } + + public BdewLoadProfileFactory(Class valueClass) { + super(valueClass); + } + + @Override + protected LoadProfileEntry buildModel(LoadProfileData data) { + int quarterHour = data.getInt(QUARTER_HOUR); + + return new LoadProfileEntry<>( + new BdewLoadValues( + data.getDouble(SUMMER_SATURDAY), + data.getDouble(SUMMER_SUNDAY), + data.getDouble(SUMMER_WEEKDAY), + data.getDouble(TRANSITION_SATURDAY), + data.getDouble(TRANSITION_SUNDAY), + data.getDouble(TRANSITION_WEEKDAY), + data.getDouble(WINTER_SATURDAY), + data.getDouble(WINTER_SUNDAY), + data.getDouble(WINTER_WEEKDAY)), + quarterHour); + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + QUARTER_HOUR, + SUMMER_SATURDAY, + SUMMER_SUNDAY, + SUMMER_WEEKDAY, + TRANSITION_SATURDAY, + TRANSITION_SUNDAY, + TRANSITION_WEEKDAY, + WINTER_SATURDAY, + WINTER_SUNDAY, + WINTER_WEEKDAY)); + } + + @Override + public BdewLoadProfileTimeSeries build( + LoadProfileMetaInformation metaInformation, Set> entries) { + + BdewStandardLoadProfile profile = parseProfile(metaInformation.getProfile()); + Optional> maxPower = calculateMaxPower(profile, entries); + + return new BdewLoadProfileTimeSeries(metaInformation.getUuid(), profile, entries, maxPower); + } + + @Override + public BdewStandardLoadProfile parseProfile(String profile) { + try { + return BdewStandardLoadProfile.get(profile); + } catch (ParsingException e) { + throw new FactoryException("An error occurred while parsing the profile: " + profile, e); + } + } + + @Override + public Optional> calculateMaxPower( + BdewStandardLoadProfile loadProfile, Set> entries) { + Function> valueExtractor; + + if (loadProfile == BdewStandardLoadProfile.H0) { + // maximum dynamization factor is on day 366 (leap year) or day 365 (regular year). + // The difference between day 365 and day 366 is negligible, thus pick 366 + valueExtractor = + v -> + Stream.of(v.getWiSa(), v.getWiSu(), v.getWiWd()) + .map(p -> BdewLoadValues.dynamization(p, 366)); + } else { + valueExtractor = v -> v.values().stream(); + } + return entries.stream() + .map(TimeSeriesEntry::getValue) + .flatMap(valueExtractor) + .max(Comparator.naturalOrder()) + .map(p -> Quantities.getQuantity(p, WATT)); + } + + @Override + public Optional> getLoadProfileEnergyScaling( + BdewStandardLoadProfile loadProfile) { + return Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java new file mode 100644 index 000000000..8d432d26a --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java @@ -0,0 +1,16 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.FactoryData; +import edu.ie3.datamodel.models.value.load.LoadValues; +import java.util.Map; + +public class LoadProfileData extends FactoryData { + public LoadProfileData(Map fieldsToAttributes, Class targetClass) { + super(fieldsToAttributes, targetClass); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java new file mode 100644 index 000000000..e4af59b88 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -0,0 +1,51 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.Factory; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.LoadValues; +import java.util.Optional; +import java.util.Set; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; + +public abstract class LoadProfileFactory

    + extends Factory, LoadProfileEntry> { + protected static final String QUARTER_HOUR = "quarterHour"; + + public LoadProfileFactory(Class valueClass) { + super(valueClass); + } + + public abstract LoadProfileTimeSeries build( + LoadProfileMetaInformation metaInformation, Set> entries); + + public abstract P parseProfile(String profile); + + /** + * Calculates the maximum average power consumption per quarter-hour for a given calculated over + * all seasons and weekday types of given load profile + * + * @param loadProfile given load profile + * @param entries with power values + * @return an option for the maximal power + */ + public abstract Optional> calculateMaxPower( + P loadProfile, Set> entries); + + /** Returns the quarter-hour field. */ + public String getTimeFieldString() { + return QUARTER_HOUR; + } + + /** Returns the load profile energy scaling. */ + public abstract Optional> getLoadProfileEnergyScaling(P loadProfile); +} diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index faf79daa8..dc09ca026 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -224,6 +224,7 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "double", "String", "DayOfWeek", + "Season", "ChargingPointType", "EvcsLocationType" -> resultStringBuilder.append(methodReturnObject.toString()); case "Quantity", "ComparableQuantity" -> resultStringBuilder.append( @@ -260,7 +261,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S processVoltageLevel((VoltageLevel) methodReturnObject, fieldName)); case "Point", "LineString" -> resultStringBuilder.append( geoJsonWriter.write((Geometry) methodReturnObject)); - case "LoadProfile" -> resultStringBuilder.append(((LoadProfile) methodReturnObject).getKey()); + case "LoadProfile", "BdewStandardLoadProfile" -> resultStringBuilder.append( + ((LoadProfile) methodReturnObject).getKey()); case "AssetTypeInput", "BmTypeInput", "ChpTypeInput", diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 65edd5980..9149a713d 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -13,7 +13,9 @@ import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; +import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; @@ -47,7 +49,9 @@ public class TimeSeriesProcessor< new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, SValue.class), new TimeSeriesProcessorKey( - IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class)); + IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), + new TimeSeriesProcessorKey( + BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class)); /** * Specific combination of time series class, entry class and value class, this processor is diff --git a/src/main/java/edu/ie3/datamodel/models/BdewSeason.java b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java new file mode 100644 index 000000000..eb7336c55 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/BdewSeason.java @@ -0,0 +1,85 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models; + +import edu.ie3.datamodel.exceptions.ParsingException; +import java.time.ZonedDateTime; + +public enum BdewSeason { + WINTER("Wi"), + SUMMER("Su"), + TRANSITION("Tr"); + + private final String key; + + BdewSeason(String key) { + this.key = key.toLowerCase(); + } + + public static BdewSeason parse(String key) throws ParsingException { + return switch (key) { + case "Wi", "Winter" -> WINTER; + case "Su", "Summer" -> SUMMER; + case "Tr", "Intermediate" -> TRANSITION; + default -> throw new ParsingException( + "There is no season for key:" + + key + + ". Permissible keys: 'Wi', 'Winter', 'Su', 'Summer', 'Tr', 'Intermediate'"); + }; + } + + /** + * Creates a season from given time + * + * @param time the time + * @return a season + */ + public static BdewSeason getSeason(ZonedDateTime time) { + int day = time.getDayOfMonth(); + + // winter: 1.11.-20.03. + // summer: 15.05.-14.09. + // transition: 21.03.-14.05. and + // 15.09.-31.10. + // (VDEW handbook) + + return switch (time.getMonth()) { + case NOVEMBER, DECEMBER, JANUARY, FEBRUARY -> WINTER; + case MARCH -> { + if (day <= 20) { + yield WINTER; + } else { + yield TRANSITION; + } + } + case MAY -> { + if (day >= 15) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + case JUNE, JULY, AUGUST -> SUMMER; + case SEPTEMBER -> { + if (day <= 14) { + yield SUMMER; + } else { + yield TRANSITION; + } + } + default -> TRANSITION; + }; + } + + public String getKey() { + return key; + } + + @Override + public String toString() { + return key; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java new file mode 100644 index 000000000..38edbd08c --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -0,0 +1,66 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +/** + * Describes a bdew load profile time series with repetitive values that can be calculated from a + * pattern. Each value of this timeseries is given in W. + */ +public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { + + public BdewLoadProfileTimeSeries( + UUID uuid, + BdewStandardLoadProfile loadProfile, + Set> values, + Optional> maxPower) { + super( + uuid, + loadProfile, + values, + maxPower, + Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR))); + } + + @Override + public BdewStandardLoadProfile getLoadProfile() { + return (BdewStandardLoadProfile) super.getLoadProfile(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "BDEWLoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java new file mode 100644 index 000000000..278dcaa0e --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/value/load/BdewLoadValues.java @@ -0,0 +1,184 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.value.load; + +import static edu.ie3.datamodel.models.BdewSeason.*; +import static java.lang.Math.pow; +import static java.lang.Math.round; +import static tech.units.indriya.unit.Units.WATT; + +import edu.ie3.datamodel.models.BdewSeason; +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import tech.units.indriya.quantity.Quantities; + +/** Load values for a {@link BdewStandardLoadProfile} */ +public class BdewLoadValues implements LoadValues { + private final double suSa; + private final double suSu; + private final double suWd; + private final double trSa; + private final double trSu; + private final double trWd; + private final double wiSa; + private final double wiSu; + private final double wiWd; + + public BdewLoadValues( + double suSa, + double suSu, + double suWd, + double trSa, + double trSu, + double trWd, + double wiSa, + double wiSu, + double wiWd) { + this.suSa = suSa; + this.suSu = suSu; + this.suWd = suWd; + this.trSa = trSa; + this.trSu = trSu; + this.trWd = trWd; + this.wiSa = wiSa; + this.wiSu = wiSu; + this.wiWd = wiWd; + } + + @Override + public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { + Map mapping = + switch (time.getDayOfWeek()) { + case SATURDAY -> Map.of( + SUMMER, suSa, + WINTER, wiSa, + TRANSITION, trSa); + case SUNDAY -> Map.of( + SUMMER, suSu, + WINTER, wiSu, + TRANSITION, trSu); + default -> Map.of( + SUMMER, suWd, + WINTER, wiWd, + TRANSITION, trWd); + }; + + double power = mapping.get(getSeason(time)); + + if (loadProfile == BdewStandardLoadProfile.H0) { + /* For the residential average profile, a dynamization has to be taken into account */ + power = dynamization(power, time.getDayOfYear()); // leap years are ignored + } + + return new PValue(Quantities.getQuantity(power, WATT)); + } + + /** + * Calculates the dynamization factor for given day of year. Cf. + * Anwendung der repräsentativen Lastprofile - Step by step page 19 + * + * @param load load value + * @param t day of year (1-366) + * @return dynamization factor + */ + public static double dynamization(double load, int t) { + double factor = + (-3.92e-10 * pow(t, 4) + 3.2e-7 * pow(t, 3) - 7.02e-5 * pow(t, 2) + 2.1e-3 * t + 1.24); + double rndFactor = round(factor * 1e4) / 1e4; // round to 4 decimal places + return round(load * rndFactor * 1e1) / 1e1; // rounded to 1 decimal place + } + + public double getSuSa() { + return suSa; + } + + public double getSuSu() { + return suSu; + } + + public double getSuWd() { + return suWd; + } + + public double getTrSa() { + return trSa; + } + + public double getTrSu() { + return trSu; + } + + public double getTrWd() { + return trWd; + } + + public double getWiSa() { + return wiSa; + } + + public double getWiSu() { + return wiSu; + } + + public double getWiWd() { + return wiWd; + } + + public List values() { + return List.of(suSa, suSu, suWd, trSa, trSu, trWd, wiSa, wiSu, wiWd); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BdewLoadValues that = (BdewLoadValues) o; + return Objects.equals(suSa, that.suSa) + && Objects.equals(suSu, that.suSu) + && Objects.equals(suWd, that.suWd) + && Objects.equals(trSa, that.trSa) + && Objects.equals(trSu, that.trSu) + && Objects.equals(trWd, that.trWd) + && Objects.equals(wiSa, that.wiSa) + && Objects.equals(wiSu, that.wiSu) + && Objects.equals(wiWd, that.wiWd); + } + + @Override + public int hashCode() { + return Objects.hash(suSa, suSu, suWd, trSa, trSu, trWd, wiSa, wiSu, wiWd); + } + + @Override + public String toString() { + return "BDEWLoadValues{" + + "suSa=" + + suSa + + ", suSu=" + + suSu + + ", suWd=" + + suWd + + ", trSa=" + + trSa + + ", trSu=" + + trSu + + ", trWd=" + + trWd + + ", wiSa=" + + wiSa + + ", wiSu=" + + wiSu + + ", wiWd=" + + wiWd + + '}'; + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy new file mode 100644 index 000000000..db4e2849a --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -0,0 +1,163 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.timeseries + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.util.quantities.PowerSystemUnits +import spock.lang.Shared +import spock.lang.Specification +import tech.units.indriya.quantity.Quantities + +class BdewLoadProfileFactoryTest extends Specification { + @Shared + BdewLoadProfileFactory factory + + @Shared + private Set> allEntries + + def setupSpec() { + factory = new BdewLoadProfileFactory() + + def data0 = new LoadProfileData([ + "SuSa": "74.6", + "SuSu": "68.8", + "SuWd": "71.5", + "TrSa": "75.8", + "TrSu": "68.3", + "TrWd": "73.0", + "WiSa": "70.0", + "WiSu": "63.2", + "WiWd": "65.5", + "quarterHour": "0" + ] as Map, BdewLoadValues) + + def data1 = new LoadProfileData([ + "SuSa": "76.2", + "SuSu": "67.4", + "SuWd": "69.0", + "TrSa": "76.7", + "TrSu": "66.5", + "TrWd": "70.1", + "WiSa": "73.0", + "WiSu": "61.0", + "WiWd": "62.6", + "quarterHour": "1" + ] as Map, BdewLoadValues) + + def data2 = new LoadProfileData([ + "SuSa": "77.7", + "SuSu": "65.7", + "SuWd": "66.3", + "TrSa": "77.7", + "TrSu": "64.6", + "TrWd": "67.1", + "WiSa": "75.9", + "WiSu": "58.9", + "WiWd": "59.6", + "quarterHour": "2" + ] as Map, BdewLoadValues) + + allEntries = [ + factory.buildModel(data0), + factory.buildModel(data1), + factory.buildModel(data2) + ].flatten() as Set> + } + + def "A BDEWLoadProfileFactory returns the correct fields"() { + given: + def expectedFields = [ + "SuSa", + "SuSu", + "SuWd", + "TrSa", + "TrSu", + "TrWd", + "WiSa", + "WiSu", + "WiWd", + "quarterHour" + ] as Set + + when: + def actual = factory.getFields(BdewLoadValues) + + then: + actual.size() == 1 + actual.head() == expectedFields + } + + def "A BDEWLoadProfileFactory refuses to build from invalid data"() { + given: + def actualFields = factory.newSet("Sa", "Su", "Wd") + + when: + def actual = factory.validate(actualFields, BdewLoadValues) + + then: + actual.failure + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'BdewLoadValues'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'BdewLoadValues' are possible (NOT case-sensitive!):\n" + + "0: [quarterHour, SuSa, SuSu, SuWd, TrSa, TrSu, TrWd, WiSa, WiSu, WiWd] or [quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd]\n" + } + + def "A BDEWLoadProfileFactory builds model from valid data"() { + given: + def data = [ + "SuSa": "74.6", + "SuSu": "68.8", + "SuWd": "71.5", + "TrSa": "75.8", + "TrSu": "68.3", + "TrWd": "73.0", + "WiSa": "70.0", + "WiSu": "63.2", + "WiWd": "65.5", + "quarterHour": "0" + ] as Map + + when: + def entry = factory.buildModel(new LoadProfileData<>(data, BdewLoadValues)) + + then: + entry.value.class == BdewLoadValues + } + + def "A BDEWLoadProfileFactory builds time series from entries"() { + given: + UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") + LoadProfileMetaInformation metaInformation = new LoadProfileMetaInformation(uuid, "g0") + + + when: + def lpts = factory.build(metaInformation, allEntries) + + then: + lpts.loadProfile == BdewStandardLoadProfile.G0 + lpts.entries.size() == 3 + } + + def "A BDEWLoadProfileFactory does return the max power correctly"() { + when: + def maxPower = factory.calculateMaxPower(BdewStandardLoadProfile.G0, allEntries) + + then: + maxPower.isPresent() + maxPower.get() == Quantities.getQuantity(77.7, PowerSystemUnits.WATT) + } + + def "A BDEWLoadProfileFactory does return an energy scaling correctly"() { + when: + def energyScaling = factory.getLoadProfileEnergyScaling(BdewStandardLoadProfile.G0) + + then: + energyScaling.isPresent() + energyScaling.get() == Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR) + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 7986a3774..06765fdc1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -34,7 +34,7 @@ import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue -import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.RepetitiveTimeSeries import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.util.quantities.PowerSystemUnits @@ -409,11 +409,10 @@ class EntityPersistenceNamingStrategyTest extends Specification { IndividualTimeSeries | UUID.fromString("4881fda2-bcee-4f4f-a5bb-6a09bf785276") || "aa_its_c_4881fda2-bcee-4f4f-a5bb-6a09bf785276_zz" } - def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile input" () { + def "A EntityPersistenceNamingStrategy without pre- or suffix should return valid file name for load profile time series" () { given: EntityPersistenceNamingStrategy strategy = new EntityPersistenceNamingStrategy() - LoadProfileTimeSeries timeSeries = Mock(LoadProfileTimeSeries) - timeSeries.uuid >> uuid + BdewLoadProfileTimeSeries timeSeries = Mock(BdewLoadProfileTimeSeries) timeSeries.loadProfile >> type when: @@ -424,8 +423,8 @@ class EntityPersistenceNamingStrategyTest extends Specification { actual.get() == expectedFileName where: - clazz | uuid | type || expectedFileName - LoadProfileTimeSeries | UUID.fromString("bee0a8b6-4788-4f18-bf72-be52035f7304") | BdewStandardLoadProfile.G3 || "lpts_g3" + clazz | type || expectedFileName + BdewLoadProfileTimeSeries | BdewStandardLoadProfile.G3 || "lpts_g3" } def "A EntityPersistenceNamingStrategy returns empty Optional, when there is no naming defined for a given time series class"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index aa65e1c84..ae7836aed 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -40,7 +40,10 @@ import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.util.TimeUtil @@ -139,6 +142,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndPValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), + new TimeSeriesProcessorKey(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues), ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 8c782715e..56eb58c60 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -10,7 +10,10 @@ import edu.ie3.datamodel.io.processor.Processor import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import edu.ie3.test.common.TimeSeriesTestData import spock.lang.Specification @@ -207,4 +210,15 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat then: actual == individualHeatAndSTimeSeriesProcessed } + + def "A TimeSeriesProcessors handles a complete LoadProfileTimeSeries correctly"() { + given: + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues) + + when: + Set> actual = processor.handleTimeSeries(loadProfileTimeSeries) + + then: + actual == loadProfileTimeSeriesProcessed + } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index e6b03240c..84a54459b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -236,6 +236,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("its_ph_56c20b88-c001-4225-8dac-cd13a75c6b48.csv").toFile().exists() testBaseFolderPath.resolve("its_pqh_83b577cc-06b1-47a1-bfff-ad648a00784b.csv").toFile().exists() testBaseFolderPath.resolve("its_c_a4bbcb77-b9d0-4b88-92be-b9a14a3e332b.csv").toFile().exists() + testBaseFolderPath.resolve("lpts_g2.csv").toFile().exists() testBaseFolderPath.resolve("its_weather_4fcbdfcd-4ff0-46dd-b0df-f3af7ae3ed98.csv").toFile().exists() } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy index 9df990efb..115c13911 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy @@ -8,6 +8,7 @@ package edu.ie3.test.common import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.value.HeatAndPValue import edu.ie3.datamodel.models.value.PValue +import edu.ie3.util.quantities.PowerSystemUnits import tech.units.indriya.quantity.Quantities import java.time.ZonedDateTime @@ -20,7 +21,6 @@ final class TimeSeriesSourceTestData { public static final ZonedDateTime TIME_00MIN = ZonedDateTime.parse("2020-01-01T00:00:00Z") public static final ZonedDateTime TIME_15MIN = ZonedDateTime.parse("2020-01-01T00:15:00Z") - public static final ZonedDateTime TIME_30MIN = ZonedDateTime.parse("2020-01-01T00:30:00Z") public static final PValue P_VALUE_00MIN = new PValue( Quantities.getQuantity(1000.0d, StandardUnits.ACTIVE_POWER_IN) @@ -37,4 +37,12 @@ final class TimeSeriesSourceTestData { Quantities.getQuantity(1250.0d, StandardUnits.ACTIVE_POWER_IN), Quantities.getQuantity(12.0, StandardUnits.HEAT_DEMAND) ) + + public static final PValue G3_VALUE_00MIN = new PValue( + Quantities.getQuantity(94.7, PowerSystemUnits.WATT) + ) + + public static final PValue G3_VALUE_15MIN = new PValue( + Quantities.getQuantity(94.1, PowerSystemUnits.WATT) + ) } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index efa2ccdea..49a39d86c 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -17,8 +17,10 @@ import edu.ie3.datamodel.models.timeseries.IntValue import edu.ie3.datamodel.models.timeseries.TimeSeries import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue +import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry import edu.ie3.datamodel.models.value.* +import edu.ie3.datamodel.models.value.load.BdewLoadValues import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.GeometryFactory import org.locationtech.jts.geom.Point @@ -399,6 +401,61 @@ trait TimeSeriesTestData { ] as LinkedHashMap ] as Set + BdewLoadProfileTimeSeries loadProfileTimeSeries = new BdewLoadProfileTimeSeries( + UUID.fromString("b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc"), + BdewStandardLoadProfile.G2, + [ + new LoadProfileEntry<>( + new BdewLoadValues(63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), 0 + ), + new LoadProfileEntry<>( + new BdewLoadValues(58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), 1), + new LoadProfileEntry<>( + new BdewLoadValues(53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), 2 + ), + ] as Set, + Optional.empty() + ) + + Set> loadProfileTimeSeriesProcessed = [ + [ + "suSa": "63.1", + "suSu": "50.6", + "suWd": "60.8", + "trSa": "73.1", + "trSu": "64.2", + "trWd": "70.5", + "wiSa": "80.6", + "wiSu": "73.7", + "wiWd": "77.4", + "quarterHour": "0" + ] as LinkedHashMap, + [ + "suSa": "58.0", + "suSu": "47.4", + "suWd": "53.0", + "trSa": "67.6", + "trSu": "60.7", + "trWd": "61.9", + "wiSa": "74.6", + "wiSu": "68.7", + "wiWd": "67.4", + "quarterHour": "1" + ] as LinkedHashMap, + [ + "suSa": "53.5", + "suSu": "44.3", + "suWd": "46.0", + "trSa": "62.8", + "trSu": "56.9", + "trWd": "54.4", + "wiSa": "69.2", + "wiSu": "63.6", + "wiWd": "58.4", + "quarterHour": "2" + ] as LinkedHashMap + ] as Set + List allTimeSeries = [ individualPTimeSeries, individualEnergyPriceTimeSeries, @@ -408,5 +465,6 @@ trait TimeSeriesTestData { individualPTimeSeries, individualSTimeSeries, individualWeatherTimeSeries, + loadProfileTimeSeries ] } \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv new file mode 100644 index 000000000..b216cb1f6 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_timeseries/lpts_g2.csv @@ -0,0 +1,3 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,0 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,1 \ No newline at end of file From ceb83fadbbf1b1f0995c3806cf2698d69923d271 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 13:20:55 +0100 Subject: [PATCH 231/310] Fix `SqlSinkTest` --- src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 67e5065e4..a8f3234b0 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -87,7 +87,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri "result_entities.sql", "input_entities.sql", "time_series.sql", - "load_profile.sql" + "load_profiles.sql" ) for (String file: importFiles) { Container.ExecResult res = postgreSQLContainer.execInContainer("psql", "-Utest", "-f/home/" + file) @@ -199,6 +199,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_ph", ps -> {}).count() == 3 source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_pqh", ps -> {}).count() == 3 source.executeQuery("SELECT * FROM " + schemaName + "." + "time_series_weather", ps -> {}).count() == 3 + source.executeQuery("SELECT * FROM " + schemaName + "." + "load_profiles", ps -> {}).count() == 3 cleanup: sink.shutdown() From 808faa17255d36fd87163862d140fd7ba4520542 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 13:28:05 +0100 Subject: [PATCH 232/310] Fix `SqlSinkTest` --- .../datamodel/io/sink/_sql/load_profile.sql | 11 ------ .../datamodel/io/sink/_sql/load_profiles.sql | 24 +++++++++++++ .../source/sql/_timeseries/load_profiles.sql | 35 +++++++++++++++++++ 3 files changed, 59 insertions(+), 11 deletions(-) delete mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql deleted file mode 100644 index 474be75de..000000000 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profile.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE public.load_profile_g2 -( - time_series UUID NOT NULL, - day_of_week TEXT NOT NULL, - quarter_hour_of_day TEXT NOT NULL, - p DOUBLE PRECISION, - grid_uuid UUID NOT NULL REFERENCES grids(uuid) -) - WITHOUT OIDS - TABLESPACE pg_default; - diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql new file mode 100644 index 000000000..da883ded9 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/load_profiles.sql @@ -0,0 +1,24 @@ +CREATE TABLE public.load_profiles +( + load_profile VARCHAR(11) NOT NULL, + quarter_hour integer NOT NULL, + su_sa DOUBLE PRECISION NOT NULL, + su_su DOUBLE PRECISION NOT NULL, + su_wd DOUBLE PRECISION NOT NULL, + tr_sa DOUBLE PRECISION NOT NULL, + tr_su DOUBLE PRECISION NOT NULL, + tr_wd DOUBLE PRECISION NOT NULL, + wi_sa DOUBLE PRECISION NOT NULL, + wi_su DOUBLE PRECISION NOT NULL, + wi_wd DOUBLE PRECISION NOT NULL, + grid_uuid UUID NOT NULL REFERENCES grids(uuid) +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX load_profiles_series_id ON load_profiles USING hash (load_profile); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX load_profiles_series_time ON load_profiles USING btree (load_profile, quarter_hour); \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql new file mode 100644 index 000000000..8402798ae --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/sql/_timeseries/load_profiles.sql @@ -0,0 +1,35 @@ +CREATE TABLE public.load_profiles +( + load_profile VARCHAR(11) NOT NULL, + quarter_hour integer NOT NULL, + su_sa DOUBLE PRECISION NOT NULL, + su_su DOUBLE PRECISION NOT NULL, + su_wd DOUBLE PRECISION NOT NULL, + tr_sa DOUBLE PRECISION NOT NULL, + tr_su DOUBLE PRECISION NOT NULL, + tr_wd DOUBLE PRECISION NOT NULL, + wi_sa DOUBLE PRECISION NOT NULL, + wi_su DOUBLE PRECISION NOT NULL, + wi_wd DOUBLE PRECISION NOT NULL +) + WITHOUT OIDS + TABLESPACE pg_default; + +CREATE INDEX load_profiles_series_id ON load_profiles USING hash (load_profile); + +-- Order of columns is important when using btree: https://www.postgresql.org/docs/14/indexes-multicolumn.html +-- Column time_series needs to placed as the first argument since we at most use an equality constraint on +-- time_series and a range query on time. +CREATE UNIQUE INDEX load_profiles_series_time ON load_profiles USING btree (load_profile, quarter_hour); + +INSERT INTO + public.load_profiles (load_profile, quarter_hour, su_sa, su_su, su_wd, tr_sa, tr_su, tr_wd, wi_sa, wi_su, wi_wd) +VALUES + +('g2', 0, 63.1, 50.6, 60.8, 73.1, 64.2, 70.5, 80.6, 73.7, 77.4), +('g2', 1, 58.0, 47.4, 53.0, 67.6, 60.7, 61.9, 74.6, 68.7, 67.4), +('g2', 2, 53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), + +('g3', 0, 99.0, 94.6, 98.5, 92.5, 87.6, 91.2, 95.3, 87.8, 94.7), +('g3', 1, 100.0, 95.3, 99.0, 93.0, 87.3, 90.2, 95.5, 88.3, 94.1), +('g3', 2, 100.9, 96.0, 99.4, 93.7, 87.4, 89.4, 96.2, 89.0, 94.1); From bf62c4aa4dc135661789008c32da0984635a5916 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 15:00:50 +0100 Subject: [PATCH 233/310] Fix `SqlSinkTest` --- .../ie3/test/common/TimeSeriesSourceTestData.groovy | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy index 115c13911..9df990efb 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy @@ -8,7 +8,6 @@ package edu.ie3.test.common import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.value.HeatAndPValue import edu.ie3.datamodel.models.value.PValue -import edu.ie3.util.quantities.PowerSystemUnits import tech.units.indriya.quantity.Quantities import java.time.ZonedDateTime @@ -21,6 +20,7 @@ final class TimeSeriesSourceTestData { public static final ZonedDateTime TIME_00MIN = ZonedDateTime.parse("2020-01-01T00:00:00Z") public static final ZonedDateTime TIME_15MIN = ZonedDateTime.parse("2020-01-01T00:15:00Z") + public static final ZonedDateTime TIME_30MIN = ZonedDateTime.parse("2020-01-01T00:30:00Z") public static final PValue P_VALUE_00MIN = new PValue( Quantities.getQuantity(1000.0d, StandardUnits.ACTIVE_POWER_IN) @@ -37,12 +37,4 @@ final class TimeSeriesSourceTestData { Quantities.getQuantity(1250.0d, StandardUnits.ACTIVE_POWER_IN), Quantities.getQuantity(12.0, StandardUnits.HEAT_DEMAND) ) - - public static final PValue G3_VALUE_00MIN = new PValue( - Quantities.getQuantity(94.7, PowerSystemUnits.WATT) - ) - - public static final PValue G3_VALUE_15MIN = new PValue( - Quantities.getQuantity(94.1, PowerSystemUnits.WATT) - ) } From 59e2114fb643c49d678ce338b2e864e40802608a Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 3 Feb 2025 15:13:45 +0100 Subject: [PATCH 234/310] Added `RandomLoadProfileTimeSeries` --- CHANGELOG.md | 1 + build.gradle | 4 + docs/uml/main/TimeSeriesDatamodelConcept.puml | 34 +++- .../uml/main/input/InputDatamodelConcept.puml | 14 -- .../timeseries/RandomLoadProfileFactory.java | 96 +++++++++++ .../ie3/datamodel/io/processor/Processor.java | 4 +- .../timeseries/TimeSeriesProcessor.java | 5 +- .../datamodel/models/profile/LoadProfile.java | 22 ++- .../RandomLoadProfileTimeSeries.java | 62 +++++++ .../load/RandomLoadValues.java} | 128 ++++++++------ .../RandomLoadProfileFactoryTest.groovy | 163 ++++++++++++++++++ .../io/processor/ProcessorProviderTest.groovy | 3 + .../models/profile/LoadProfileTest.groovy | 149 ++++++++-------- .../common/TimeSeriesSourceTestData.groovy | 9 + 14 files changed, 542 insertions(+), 152 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java rename src/main/java/edu/ie3/datamodel/models/{input/RandomLoadParameters.java => value/load/RandomLoadValues.java} (60%) create mode 100644 src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d669828d..666b8bf22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) - Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) - Added `BdewLoadProfileTimeSeries` [#1230](https://github.com/ie3-institute/PowerSystemDataModel/issues/1230) +- Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/build.gradle b/build.gradle index c70b1bbec..d98495ec5 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ plugins { id 'jacoco' // java code coverage plugin id "org.sonarqube" version "6.0.1.5171" // sonarqube id 'net.thauvin.erik.gradle.semver' version '1.0.4' // semantic versioning + id "com.github.johnrengelman.shadow" version "8.1.1" // fat jar } ext { @@ -67,6 +68,9 @@ dependencies { // Graphs implementation 'org.jgrapht:jgrapht-core:1.5.2' + // Statistics (for random load model) + implementation 'de.lmu.ifi.dbs.elki:elki:0.7.5' + // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" diff --git a/docs/uml/main/TimeSeriesDatamodelConcept.puml b/docs/uml/main/TimeSeriesDatamodelConcept.puml index 7f0cda6d7..0acc0cf5f 100644 --- a/docs/uml/main/TimeSeriesDatamodelConcept.puml +++ b/docs/uml/main/TimeSeriesDatamodelConcept.puml @@ -32,6 +32,7 @@ package models { } DefaultLoadProfiles --|> LoadProfile + RandomLoadProfile --|> LoadProfile interface StandardLoadProfile { + {static} parse(String): StandardLoadProfile @@ -130,12 +131,22 @@ package models { } RepetitiveTimeSeries --|> TimeSeries - class LoadProfileInput { - - type: StandardLoadProfile - - dayOfWeekToHourlyValues: Map> + abstract class LoadProfileTimeSeries { + - loadProfile: StandardLoadProfile + - valueMapping: Map> + + getLoadProfile(): LoadProfile + # fromTime(ZonedDateTime): Key } - LoadProfileInput --|> RepetitiveTimeSeries - LoadProfileInput *-- StandardLoadProfile + LoadProfileTimeSeries --|> RepetitiveTimeSeries + LoadProfileTimeSeries *-- LoadProfile + + class BDEWLoadProfileTimeSeries {} + BDEWLoadProfileTimeSeries --|> LoadProfileTimeSeries + BDEWLoadProfileTimeSeries *-- BdewLoadProfileEntry + + class RandomLoadProfileTimeSeries {} + RandomLoadProfileTimeSeries --|> LoadProfileTimeSeries + RandomLoadProfileTimeSeries *-- RandomLoadProfileEntry abstract class TimeSeriesEntry { # value: V @@ -152,8 +163,21 @@ package models { class LoadProfileEntry { - dayOfWeek: DayOfWeek - quarterHourOfDay: int + + getDayOfWeek(): DayOfWeek + + getQuarterHourOfDay(): Integer } LoadProfileEntry --|> TimeSeriesEntry: <>:PValue + + class BdewLoadProfileEntry { + - season: Season + + getSeason(): Season + } + BdewLoadProfileEntry --|> LoadProfileEntry + + class RandomLoadProfileEntry { + - gev: GeneralizedExtremeValueDistribution + } + RandomLoadProfileEntry --|> LoadProfileEntry } } diff --git a/docs/uml/main/input/InputDatamodelConcept.puml b/docs/uml/main/input/InputDatamodelConcept.puml index 91f11c107..15badfeb0 100644 --- a/docs/uml/main/input/InputDatamodelConcept.puml +++ b/docs/uml/main/input/InputDatamodelConcept.puml @@ -142,20 +142,6 @@ package models { MeasurementUnitInput --|> AssetInput MeasurementUnitInput ..|> HasNodes - class RandomLoadParameter { - - quarterHour: int - - kWd: Double - - kSa: Double - - kSu: Double - - myWd: Double - - mySa: Double - - mySu: Double - - sigmaWd: Double - - sigmaSa: Double - - sigmaSu: Double - } - RandomLoadParameter --|> InputEntity - abstract class AssetTypeInput { - id: String } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java new file mode 100644 index 000000000..25a94e8f7 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -0,0 +1,96 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +public class RandomLoadProfileFactory + extends LoadProfileFactory { + public static final String K_WEEKDAY = "kWd"; + public static final String K_SATURDAY = "kSa"; + public static final String K_SUNDAY = "kSu"; + public static final String MY_WEEKDAY = "myWd"; + public static final String MY_SATURDAY = "mySa"; + public static final String MY_SUNDAY = "mySu"; + public static final String SIGMA_WEEKDAY = "sigmaWd"; + public static final String SIGMA_SATURDAY = "sigmaSa"; + public static final String SIGMA_SUNDAY = "sigmaSu"; + + public RandomLoadProfileFactory() { + super(RandomLoadValues.class); + } + + @Override + protected LoadProfileEntry buildModel(LoadProfileData data) { + int quarterHour = data.getInt(QUARTER_HOUR); + + return new LoadProfileEntry<>( + new RandomLoadValues( + data.getDouble(K_SATURDAY), + data.getDouble(K_SUNDAY), + data.getDouble(K_WEEKDAY), + data.getDouble(MY_SATURDAY), + data.getDouble(MY_SUNDAY), + data.getDouble(MY_WEEKDAY), + data.getDouble(SIGMA_SATURDAY), + data.getDouble(SIGMA_SUNDAY), + data.getDouble(SIGMA_WEEKDAY)), + quarterHour); + } + + @Override + protected List> getFields(Class entityClass) { + return List.of( + newSet( + QUARTER_HOUR, + K_WEEKDAY, + K_SATURDAY, + K_SUNDAY, + MY_WEEKDAY, + MY_SATURDAY, + MY_SUNDAY, + SIGMA_WEEKDAY, + SIGMA_SATURDAY, + SIGMA_SUNDAY)); + } + + @Override + public RandomLoadProfileTimeSeries build( + LoadProfileMetaInformation metaInformation, Set> entries) { + return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); + } + + @Override + public RandomLoadProfile parseProfile(String profile) { + return RANDOM_LOAD_PROFILE; + } + + @Override + public Optional> calculateMaxPower( + RandomLoadProfile loadProfile, Set> loadProfileEntries) { + return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); + } + + @Override + public Optional> getLoadProfileEnergyScaling( + RandomLoadProfile loadProfile) { + return Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index dc09ca026..194edd8f7 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -261,8 +261,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S processVoltageLevel((VoltageLevel) methodReturnObject, fieldName)); case "Point", "LineString" -> resultStringBuilder.append( geoJsonWriter.write((Geometry) methodReturnObject)); - case "LoadProfile", "BdewStandardLoadProfile" -> resultStringBuilder.append( - ((LoadProfile) methodReturnObject).getKey()); + case "LoadProfile", "BdewStandardLoadProfile", "RandomLoadProfile" -> resultStringBuilder + .append(((LoadProfile) methodReturnObject).getKey()); case "AssetTypeInput", "BmTypeInput", "ChpTypeInput", diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 9149a713d..84a597eb8 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; @@ -51,7 +52,9 @@ public class TimeSeriesProcessor< new TimeSeriesProcessorKey( IndividualTimeSeries.class, TimeBasedValue.class, HeatAndSValue.class), new TimeSeriesProcessorKey( - BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class)); + BdewLoadProfileTimeSeries.class, LoadProfileEntry.class, BdewLoadValues.class), + new TimeSeriesProcessorKey( + RandomLoadProfileTimeSeries.class, LoadProfileEntry.class, RandomLoadValues.class)); /** * Specific combination of time series class, entry class and value class, this processor is diff --git a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java index 5159c9940..c68ba3435 100644 --- a/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java +++ b/src/main/java/edu/ie3/datamodel/models/profile/LoadProfile.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.util.Arrays; import java.util.stream.Collectors; +import java.util.stream.Stream; public interface LoadProfile extends Serializable { /** @return The identifying String */ @@ -28,12 +29,12 @@ static LoadProfile parse(String key) throws ParsingException { } static LoadProfile[] getAllProfiles() { - final LoadProfile[][] all = - new LoadProfile[][] { - BdewStandardLoadProfile.values(), NbwTemperatureDependantLoadProfile.values() - }; - - return Arrays.stream(all).flatMap(Arrays::stream).toArray(LoadProfile[]::new); + return Stream.of( + BdewStandardLoadProfile.values(), + NbwTemperatureDependantLoadProfile.values(), + (LoadProfile[]) RandomLoadProfile.values()) + .flatMap(Arrays::stream) + .toArray(LoadProfile[]::new); } /** @@ -70,4 +71,13 @@ public String getKey() { return "No load profile assigned"; } } + + enum RandomLoadProfile implements LoadProfile { + RANDOM_LOAD_PROFILE; + + @Override + public String getKey() { + return "random"; + } + } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java new file mode 100644 index 000000000..c494112ce --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -0,0 +1,62 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.timeseries.repetitive; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import tech.units.indriya.quantity.Quantities; + +/** + * Describes a random load profile time series based on a {@link + * GeneralizedExtremeValueDistribution}. Each value of this# timeseries is given in kW. + */ +public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { + + public RandomLoadProfileTimeSeries( + UUID uuid, LoadProfile loadProfile, Set> entries) { + super( + uuid, + loadProfile, + entries, + Optional.empty(), + Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR))); + } + + @Override + public LoadProfile.RandomLoadProfile getLoadProfile() { + return (LoadProfile.RandomLoadProfile) super.getLoadProfile(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @Override + public String toString() { + return "RandomLoadProfileTimeSeries{" + + "uuid=" + + getUuid() + + "loadProfile=" + + getLoadProfile() + + ", valueMapping=" + + getValueMapping() + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java similarity index 60% rename from src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java rename to src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java index 2233cb144..d5d399301 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/RandomLoadParameters.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -1,12 +1,21 @@ /* - * © 2021. TU Dortmund University, + * © 2024. TU Dortmund University, * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.models.input; +package edu.ie3.datamodel.models.value.load; +import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT; + +import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; +import de.lmu.ifi.dbs.elki.utilities.random.RandomFactory; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.value.PValue; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; import java.util.Objects; -import java.util.UUID; +import java.util.Random; +import tech.units.indriya.quantity.Quantities; /** * Data model to describe the parameters of a probability density function to draw random power @@ -14,22 +23,15 @@ * sampled for each quarter hour of a day, subdivided into workdays, Saturdays and Sundays. In * general the GEV is described by the three parameters "location", "scale" and "shape" */ -public class RandomLoadParameters extends UniqueInputEntity { - - /** The respective quarter hour of the day */ - private final int quarterHour; - - /** Shape parameter for a working day */ - private final double kWd; - +public class RandomLoadValues implements LoadValues { /** Shape parameter for a Saturday */ private final double kSa; /** Shape parameter for a Sunday */ private final double kSu; - /** Location parameter for a working day */ - private final double myWd; + /** Shape parameter for a working day */ + private final double kWd; /** Location parameter for a Saturday */ private final double mySa; @@ -37,8 +39,8 @@ public class RandomLoadParameters extends UniqueInputEntity { /** Location parameter for a Sunday */ private final double mySu; - /** Scale parameter for a working day */ - private final double sigmaWd; + /** Location parameter for a working day */ + private final double myWd; /** Scale parameter for a Saturday */ private final double sigmaSa; @@ -46,33 +48,34 @@ public class RandomLoadParameters extends UniqueInputEntity { /** Scale parameter for a Sunday */ private final double sigmaSu; + /** Scale parameter for a working day */ + private final double sigmaWd; + + private final GeneralizedExtremeValueDistribution gevWd; + private final GeneralizedExtremeValueDistribution gevSa; + private final GeneralizedExtremeValueDistribution gevSu; + /** - * @param uuid of the input entity - * @param quarterHour The respective quarter hour of the day - * @param kWd Shape parameter for a working day * @param kSa Shape parameter for a Saturday * @param kSu Shape parameter for a Sunday - * @param myWd Location parameter for a working day + * @param kWd Shape parameter for a working day * @param mySa Location parameter for a Saturday * @param mySu Location parameter for a Sunday - * @param sigmaWd Scale parameter for a working day + * @param myWd Location parameter for a working day * @param sigmaSa Scale parameter for a Saturday * @param sigmaSu Scale parameter for a Sunday + * @param sigmaWd Scale parameter for a working day */ - public RandomLoadParameters( - UUID uuid, - int quarterHour, - double kWd, + public RandomLoadValues( double kSa, double kSu, - double myWd, + double kWd, double mySa, double mySu, - double sigmaWd, + double myWd, double sigmaSa, - double sigmaSu) { - super(uuid); - this.quarterHour = quarterHour; + double sigmaSu, + double sigmaWd) { this.kWd = kWd; this.kSa = kSa; this.kSu = kSu; @@ -82,10 +85,38 @@ public RandomLoadParameters( this.sigmaWd = sigmaWd; this.sigmaSa = sigmaSa; this.sigmaSu = sigmaSu; + + RandomFactory factory = RandomFactory.get(new Random().nextLong()); + + this.gevWd = new GeneralizedExtremeValueDistribution(myWd, sigmaWd, kWd, factory.getRandom()); + + this.gevSa = new GeneralizedExtremeValueDistribution(mySa, sigmaSa, kSa, factory.getRandom()); + this.gevSu = new GeneralizedExtremeValueDistribution(mySu, sigmaSu, kSu, factory.getRandom()); } - public int getQuarterHour() { - return quarterHour; + @Override + public PValue getValue(ZonedDateTime time, LoadProfile loadProfile) { + return new PValue(Quantities.getQuantity(getValue(time.getDayOfWeek()), KILOWATT)); + } + + /** + * Method to get the next random double value. + * + * @param day of the week + * @return a suitable random double + */ + private double getValue(DayOfWeek day) { + double randomValue = + switch (day) { + case SATURDAY -> gevSa.nextRandom(); + case SUNDAY -> gevSu.nextRandom(); + default -> gevWd.nextRandom(); + }; + + while (randomValue < 0) { + randomValue = getValue(day); + } + return randomValue; } public double getMyWd() { @@ -127,51 +158,46 @@ public double getkSu() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof RandomLoadParameters that)) return false; + if (!(o instanceof RandomLoadValues that)) return false; if (!super.equals(o)) return false; - return Objects.equals(quarterHour, that.quarterHour) - && Objects.equals(kWd, that.kWd) - && Objects.equals(kSa, that.kSa) + return Objects.equals(kSa, that.kSa) && Objects.equals(kSu, that.kSu) - && Objects.equals(myWd, that.myWd) + && Objects.equals(kWd, that.kWd) && Objects.equals(mySa, that.mySa) && Objects.equals(mySu, that.mySu) - && Objects.equals(sigmaWd, that.sigmaWd) + && Objects.equals(myWd, that.myWd) && Objects.equals(sigmaSa, that.sigmaSa) - && Objects.equals(sigmaSu, that.sigmaSu); + && Objects.equals(sigmaSu, that.sigmaSu) + && Objects.equals(sigmaWd, that.sigmaWd); } @Override public int hashCode() { return Objects.hash( - super.hashCode(), quarterHour, kWd, kSa, kSu, myWd, mySa, mySu, sigmaWd, sigmaSa, sigmaSu); + super.hashCode(), kSa, kSu, kWd, mySa, mySu, myWd, sigmaSa, sigmaSu, sigmaWd); } @Override public String toString() { - return "RandomLoadParameters{" - + "uuid=" - + getUuid() - + ", quarterHour=" - + quarterHour - + ", kWd=" - + kWd - + ", kSa=" + return "RandomLoadValues{" + + "kSa=" + kSa + ", kSu=" + kSu - + ", myWd=" - + myWd + + ", kWd=" + + kWd + ", mySa=" + mySa + ", mySu=" + mySu - + ", sigmaWd=" - + sigmaWd + + ", myWd=" + + myWd + ", sigmaSa=" + sigmaSa + ", sigmaSu=" + sigmaSu + + ", sigmaWd=" + + sigmaWd + '}'; } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy new file mode 100644 index 000000000..22cb08121 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -0,0 +1,163 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.factory.timeseries + +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation +import edu.ie3.datamodel.models.profile.LoadProfile +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.value.load.RandomLoadValues +import edu.ie3.util.quantities.PowerSystemUnits +import spock.lang.Shared +import spock.lang.Specification +import tech.units.indriya.quantity.Quantities + +class RandomLoadProfileFactoryTest extends Specification { + @Shared + RandomLoadProfileFactory factory + + @Shared + private Set> allEntries + + def setupSpec() { + factory = new RandomLoadProfileFactory() + + def data0 = new LoadProfileData([ + "kSa": "0.266806721687317", + "kSu": "0.295997023582459", + "kWd": "0.279087692499161", + "mySa": "0.0610353946685791", + "mySu": "0.0630703344941139", + "myWd": "0.053140863776207", + "sigmaSa": "0.0357091873884201", + "sigmaSu": "0.0370676517486572", + "sigmaWd": "0.0293692331761122", + "quarterHour": "0" + ] as Map, RandomLoadValues) + + def data1 = new LoadProfileData([ + "kSa": "0.281179457902908", + "kSu": "0.299608528614044", + "kWd": "0.275292456150055", + "mySa": "0.0560021996498108", + "mySu": "0.058424074202776", + "myWd": "0.0498424917459488", + "sigmaSa": "0.0319067053496838", + "sigmaSu": "0.0334825366735458", + "sigmaWd": "0.0265011098235846", + "quarterHour": "1" + ] as Map, RandomLoadValues) + + def data2 = new LoadProfileData([ + "kSa": "0.275563269853592", + "kSu": "0.29670587182045", + "kWd": "0.252942383289337", + "mySa": "0.0528385005891323", + "mySu": "0.0547995530068874", + "myWd": "0.0472154095768929", + "sigmaSa": "0.0286294519901276", + "sigmaSu": "0.0310499873012304", + "sigmaWd": "0.0245211906731129", + "quarterHour": "2" + ] as Map, RandomLoadValues) + + allEntries = [ + factory.buildModel(data0), + factory.buildModel(data1), + factory.buildModel(data2) + ].flatten() as Set> + } + + def "A RandomLoadProfileFactory returns the correct fields"() { + given: + def expectedFields = [ + "kSa", + "kSu", + "kWd", + "mySa", + "mySu", + "myWd", + "sigmaSa", + "sigmaSu", + "sigmaWd", + "quarterHour" + ] as Set + + when: + def actual = factory.getFields(RandomLoadValues) + + then: + actual.size() == 1 + actual.head() == expectedFields + } + + def "A RandomLoadProfileFactory refuses to build from invalid data"() { + given: + def actualFields = factory.newSet("Wd", "Sa", "Su") + + when: + def actual = factory.validate(actualFields, RandomLoadValues) + + then: + actual.failure + actual.exception.get().message == "The provided fields [Sa, Su, Wd] are invalid for instance of 'RandomLoadValues'. \n" + + "The following fields (without complex objects e.g. nodes, operators, ...) to be passed to a constructor of 'RandomLoadValues' are possible (NOT case-sensitive!):\n" + + "0: [kSa, kSu, kWd, mySa, mySu, myWd, quarterHour, sigmaSa, sigmaSu, sigmaWd] or [k_sa, k_su, k_wd, my_sa, my_su, my_wd, quarter_hour, sigma_sa, sigma_su, sigma_wd]\n" + } + + def "A RandomLoadProfileFactory builds model from valid data"() { + given: + def data = [ + "kSa": "0.266806721687317", + "kSu": "0.295997023582459", + "kWd": "0.279087692499161", + "mySa": "0.0610353946685791", + "mySu": "0.0630703344941139", + "myWd": "0.053140863776207", + "sigmaSa": "0.0357091873884201", + "sigmaSu": "0.0370676517486572", + "sigmaWd": "0.0293692331761122", + "quarterHour": "0" + ] as Map + + when: + def entry = factory.buildModel(new LoadProfileData<>(data, RandomLoadValues)) + + then: + entry.value.class == RandomLoadValues + } + + def "A RandomLoadProfileFactory builds time series from entries"() { + given: + UUID uuid = UUID.fromString("fa3894c1-25af-479c-8a40-1323bb9150a9") + LoadProfileMetaInformation metaInformation = new LoadProfileMetaInformation(uuid, "random") + + + when: + def lpts = factory.build(metaInformation, allEntries) + + then: + lpts.loadProfile == LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + lpts.entries.size() == 3 + } + + def "A RandomLoadProfileFactory does return the max power correctly"() { + when: + def maxPower = factory.calculateMaxPower(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE, allEntries) + + then: + maxPower.isPresent() + maxPower.get() == Quantities.getQuantity(159d, PowerSystemUnits.WATT) + } + + def "A RandomLoadProfileFactory does return an energy scaling correctly"() { + when: + def energyScaling = factory.getLoadProfileEnergyScaling(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE) + + then: + energyScaling.isPresent() + energyScaling.get() == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index ae7836aed..74d46aadf 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -42,8 +42,10 @@ import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.datamodel.models.value.load.RandomLoadValues import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.util.TimeUtil @@ -143,6 +145,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, SValue), new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, HeatAndSValue), new TimeSeriesProcessorKey(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues), + new TimeSeriesProcessorKey(RandomLoadProfileTimeSeries, LoadProfileEntry, RandomLoadValues) ] as Set when: diff --git a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy index 47b5e6fdf..0265d24c4 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/profile/LoadProfileTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.models.profile +import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE + import edu.ie3.datamodel.exceptions.ParsingException import spock.lang.Specification @@ -17,77 +19,78 @@ class LoadProfileTest extends Specification { actual == expected where: - key || expected - "h0" || BdewStandardLoadProfile.H0 - "h-0" || BdewStandardLoadProfile.H0 - "h_0" || BdewStandardLoadProfile.H0 - "H0" || BdewStandardLoadProfile.H0 - "H-0" || BdewStandardLoadProfile.H0 - "H_0" || BdewStandardLoadProfile.H0 - "l0" || BdewStandardLoadProfile.L0 - "l-0" || BdewStandardLoadProfile.L0 - "l_0" || BdewStandardLoadProfile.L0 - "L0" || BdewStandardLoadProfile.L0 - "L-0" || BdewStandardLoadProfile.L0 - "L_0" || BdewStandardLoadProfile.L0 - "l1" || BdewStandardLoadProfile.L1 - "l-1" || BdewStandardLoadProfile.L1 - "l_1" || BdewStandardLoadProfile.L1 - "L1" || BdewStandardLoadProfile.L1 - "L-1" || BdewStandardLoadProfile.L1 - "L_1" || BdewStandardLoadProfile.L1 - "l2" || BdewStandardLoadProfile.L2 - "l-2" || BdewStandardLoadProfile.L2 - "l_2" || BdewStandardLoadProfile.L2 - "L2" || BdewStandardLoadProfile.L2 - "L-2" || BdewStandardLoadProfile.L2 - "L_2" || BdewStandardLoadProfile.L2 - "g0" || BdewStandardLoadProfile.G0 - "g-0" || BdewStandardLoadProfile.G0 - "g_0" || BdewStandardLoadProfile.G0 - "G0" || BdewStandardLoadProfile.G0 - "G-0" || BdewStandardLoadProfile.G0 - "G_0" || BdewStandardLoadProfile.G0 - "g1" || BdewStandardLoadProfile.G1 - "g-1" || BdewStandardLoadProfile.G1 - "g_1" || BdewStandardLoadProfile.G1 - "G1" || BdewStandardLoadProfile.G1 - "G-1" || BdewStandardLoadProfile.G1 - "G_1" || BdewStandardLoadProfile.G1 - "g2" || BdewStandardLoadProfile.G2 - "g-2" || BdewStandardLoadProfile.G2 - "g_2" || BdewStandardLoadProfile.G2 - "G2" || BdewStandardLoadProfile.G2 - "G-2" || BdewStandardLoadProfile.G2 - "G_2" || BdewStandardLoadProfile.G2 - "g3" || BdewStandardLoadProfile.G3 - "g-3" || BdewStandardLoadProfile.G3 - "g_3" || BdewStandardLoadProfile.G3 - "G3" || BdewStandardLoadProfile.G3 - "G-3" || BdewStandardLoadProfile.G3 - "G_3" || BdewStandardLoadProfile.G3 - "g4" || BdewStandardLoadProfile.G4 - "g-4" || BdewStandardLoadProfile.G4 - "g_4" || BdewStandardLoadProfile.G4 - "G4" || BdewStandardLoadProfile.G4 - "G-4" || BdewStandardLoadProfile.G4 - "G_4" || BdewStandardLoadProfile.G4 - "g5" || BdewStandardLoadProfile.G5 - "g-5" || BdewStandardLoadProfile.G5 - "g_5" || BdewStandardLoadProfile.G5 - "G5" || BdewStandardLoadProfile.G5 - "G-5" || BdewStandardLoadProfile.G5 - "G_5" || BdewStandardLoadProfile.G5 - "g6" || BdewStandardLoadProfile.G6 - "g-6" || BdewStandardLoadProfile.G6 - "g_6" || BdewStandardLoadProfile.G6 - "G6" || BdewStandardLoadProfile.G6 - "G-6" || BdewStandardLoadProfile.G6 - "G_6" || BdewStandardLoadProfile.G6 - "ep1" || NbwTemperatureDependantLoadProfile.EP1 - "ez2" || NbwTemperatureDependantLoadProfile.EZ2 - "" || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE - null || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE + key || expected + "h0" || BdewStandardLoadProfile.H0 + "h-0" || BdewStandardLoadProfile.H0 + "h_0" || BdewStandardLoadProfile.H0 + "H0" || BdewStandardLoadProfile.H0 + "H-0" || BdewStandardLoadProfile.H0 + "H_0" || BdewStandardLoadProfile.H0 + "l0" || BdewStandardLoadProfile.L0 + "l-0" || BdewStandardLoadProfile.L0 + "l_0" || BdewStandardLoadProfile.L0 + "L0" || BdewStandardLoadProfile.L0 + "L-0" || BdewStandardLoadProfile.L0 + "L_0" || BdewStandardLoadProfile.L0 + "l1" || BdewStandardLoadProfile.L1 + "l-1" || BdewStandardLoadProfile.L1 + "l_1" || BdewStandardLoadProfile.L1 + "L1" || BdewStandardLoadProfile.L1 + "L-1" || BdewStandardLoadProfile.L1 + "L_1" || BdewStandardLoadProfile.L1 + "l2" || BdewStandardLoadProfile.L2 + "l-2" || BdewStandardLoadProfile.L2 + "l_2" || BdewStandardLoadProfile.L2 + "L2" || BdewStandardLoadProfile.L2 + "L-2" || BdewStandardLoadProfile.L2 + "L_2" || BdewStandardLoadProfile.L2 + "g0" || BdewStandardLoadProfile.G0 + "g-0" || BdewStandardLoadProfile.G0 + "g_0" || BdewStandardLoadProfile.G0 + "G0" || BdewStandardLoadProfile.G0 + "G-0" || BdewStandardLoadProfile.G0 + "G_0" || BdewStandardLoadProfile.G0 + "g1" || BdewStandardLoadProfile.G1 + "g-1" || BdewStandardLoadProfile.G1 + "g_1" || BdewStandardLoadProfile.G1 + "G1" || BdewStandardLoadProfile.G1 + "G-1" || BdewStandardLoadProfile.G1 + "G_1" || BdewStandardLoadProfile.G1 + "g2" || BdewStandardLoadProfile.G2 + "g-2" || BdewStandardLoadProfile.G2 + "g_2" || BdewStandardLoadProfile.G2 + "G2" || BdewStandardLoadProfile.G2 + "G-2" || BdewStandardLoadProfile.G2 + "G_2" || BdewStandardLoadProfile.G2 + "g3" || BdewStandardLoadProfile.G3 + "g-3" || BdewStandardLoadProfile.G3 + "g_3" || BdewStandardLoadProfile.G3 + "G3" || BdewStandardLoadProfile.G3 + "G-3" || BdewStandardLoadProfile.G3 + "G_3" || BdewStandardLoadProfile.G3 + "g4" || BdewStandardLoadProfile.G4 + "g-4" || BdewStandardLoadProfile.G4 + "g_4" || BdewStandardLoadProfile.G4 + "G4" || BdewStandardLoadProfile.G4 + "G-4" || BdewStandardLoadProfile.G4 + "G_4" || BdewStandardLoadProfile.G4 + "g5" || BdewStandardLoadProfile.G5 + "g-5" || BdewStandardLoadProfile.G5 + "g_5" || BdewStandardLoadProfile.G5 + "G5" || BdewStandardLoadProfile.G5 + "G-5" || BdewStandardLoadProfile.G5 + "G_5" || BdewStandardLoadProfile.G5 + "g6" || BdewStandardLoadProfile.G6 + "g-6" || BdewStandardLoadProfile.G6 + "g_6" || BdewStandardLoadProfile.G6 + "G6" || BdewStandardLoadProfile.G6 + "G-6" || BdewStandardLoadProfile.G6 + "G_6" || BdewStandardLoadProfile.G6 + "ep1" || NbwTemperatureDependantLoadProfile.EP1 + "ez2" || NbwTemperatureDependantLoadProfile.EZ2 + "random" || RANDOM_LOAD_PROFILE + "" || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE + null || LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE } def "Standard load profiles can be parsed correctly"() { @@ -107,7 +110,7 @@ class LoadProfileTest extends Specification { "H_0" || BdewStandardLoadProfile.H0 } - def "Tempearture dependent load profiles can be parsed correctly"() { + def "Temperature dependent load profiles can be parsed correctly"() { when: TemperatureDependantLoadProfile actual = TemperatureDependantLoadProfile.parse(key) @@ -184,6 +187,6 @@ class LoadProfileTest extends Specification { then: def e = thrown(ParsingException) - e.message == "No predefined load profile with key 'not_a_key' found. Please provide one of the following keys: h0, l0, l1, l2, g0, g1, g2, g3, g4, g5, g6, ep1, ez2" + e.message == "No predefined load profile with key 'not_a_key' found. Please provide one of the following keys: h0, l0, l1, l2, g0, g1, g2, g3, g4, g5, g6, ep1, ez2, random" } } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy index 9df990efb..2e7cb5d4d 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesSourceTestData.groovy @@ -8,6 +8,7 @@ package edu.ie3.test.common import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.value.HeatAndPValue import edu.ie3.datamodel.models.value.PValue +import edu.ie3.util.quantities.PowerSystemUnits import tech.units.indriya.quantity.Quantities import java.time.ZonedDateTime @@ -37,4 +38,12 @@ final class TimeSeriesSourceTestData { Quantities.getQuantity(1250.0d, StandardUnits.ACTIVE_POWER_IN), Quantities.getQuantity(12.0, StandardUnits.HEAT_DEMAND) ) + + public static final PValue G3_VALUE_00MIN = new PValue( + Quantities.getQuantity(94.7, PowerSystemUnits.WATT) + ) + + public static final PValue G3_VALUE_15MIN = new PValue( + Quantities.getQuantity(94.1, PowerSystemUnits.WATT) + ) } From 4c7374d6253b634c0c459f37acb92f6748fe2af3 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 4 Feb 2025 12:46:01 +0100 Subject: [PATCH 235/310] Addressing reviewers comments. --- .../io/connectors/CsvFileConnector.java | 5 +- .../datamodel/io/csv/CsvFileDefinition.java | 6 ++- .../io/naming/DatabaseNamingStrategy.java | 6 ++- .../EntityPersistenceNamingStrategy.java | 6 ++- .../io/naming/FileNamingStrategy.java | 18 ++++++-- .../io/processor/ProcessorProvider.java | 46 ++++++++++++++----- .../timeseries/TimeSeriesProcessor.java | 5 +- .../timeseries/TimeSeriesProcessorKey.java | 2 +- .../ie3/datamodel/io/sink/CsvFileSink.java | 10 ++-- .../edu/ie3/datamodel/io/sink/DataSink.java | 5 +- .../ie3/datamodel/io/sink/InfluxDbSink.java | 15 +++--- .../edu/ie3/datamodel/io/sink/SqlSink.java | 17 +++---- .../models/timeseries/TimeSeries.java | 15 +++--- .../individual/IndividualTimeSeries.java | 2 +- .../repetitive/LoadProfileTimeSeries.java | 12 ++++- .../repetitive/RepetitiveTimeSeries.java | 18 ++------ .../io/processor/ProcessorProviderTest.groovy | 10 ++-- .../timeseries/TimeSeriesProcessorTest.groovy | 28 +++++------ .../datamodel/io/sink/CsvFileSinkTest.groovy | 4 +- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 6 +-- 20 files changed, 147 insertions(+), 89 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 358b60739..43ce34b66 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -64,7 +64,10 @@ public synchronized BufferedCsvWriter getOrInitWriter( } public synchronized < - T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> BufferedCsvWriter getOrInitWriter(T timeSeries, CsvFileDefinition fileDefinition) throws ConnectorException { /* Try to the right writer */ diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java index f220f537a..fe56a4294 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvFileDefinition.java @@ -68,7 +68,11 @@ public CsvFileDefinition( * @param fileNamingStrategy that should be used * @throws FileException If the definition cannot be determined */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> CsvFileDefinition( T timeSeries, String[] headLineElements, diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 03a9a32d2..7e720e2d2 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -82,7 +82,11 @@ public Optional getEntityName(Class cls) { * @param timeSeries to be named TimeSeries * @return the table name */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) { Optional maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 37a070aa3..da19edf2f 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -342,7 +342,11 @@ public Optional getTimeSeriesMappingEntityName() { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> Optional getEntityName(T timeSeries) { if (timeSeries instanceof IndividualTimeSeries) { Optional maybeFirstElement = timeSeries.getEntries().stream().findFirst(); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index dc3e8dc66..fd7084a60 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -86,7 +86,11 @@ public Optional getFilePath(Class cls) { * @param timeSeries Time series to derive naming information from * @return An optional sub path to the actual file */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> Optional getFilePath(T timeSeries) { return FileUtils.of( entityPersistenceNamingStrategy.getEntityName(timeSeries), getDirectoryPath(timeSeries)); @@ -137,7 +141,11 @@ public Optional getDirectoryPath(Class cls) { * @param timeSeries Time series to derive naming information from * @return An optional sub directory path */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> Optional getDirectoryPath(T timeSeries) { Optional maybeDirectoryName = fileHierarchy.getSubDirectory(timeSeries.getClass()); if (maybeDirectoryName.isEmpty()) { @@ -280,7 +288,11 @@ public Optional getEntityName(Class cls) { * @param timeSeries Time series to derive naming information from * @return A file name for this particular time series */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> Optional getEntityName(T timeSeries) { return entityPersistenceNamingStrategy.getEntityName(timeSeries); } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java index 8fc1a538a..f1858c44b 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/ProcessorProvider.java @@ -41,7 +41,10 @@ public class ProcessorProvider { private final Map< TimeSeriesProcessorKey, TimeSeriesProcessor< - TimeSeries, Value>, TimeSeriesEntry, Value>> + TimeSeries, Value, Value>, + TimeSeriesEntry, + Value, + Value>> timeSeriesProcessors; /** Get an instance of this class with all existing entity processors */ @@ -62,7 +65,10 @@ public ProcessorProvider( Map< TimeSeriesProcessorKey, TimeSeriesProcessor< - TimeSeries, Value>, TimeSeriesEntry, Value>> + TimeSeries, Value, Value>, + TimeSeriesEntry, + Value, + Value>> timeSeriesProcessors) { this.entityProcessors = init(entityProcessors); this.timeSeriesProcessors = timeSeriesProcessors; @@ -120,13 +126,19 @@ private EntityProcessor getEntityProcessor(Class Type of the time series * @param Type of the time series entries * @param Type of the value inside the time series entries + * @param Type of the value, the time series will return * @return A set of mappings from field name to value */ - public , E extends TimeSeriesEntry, V extends Value> + public < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> Set> handleTimeSeries(T timeSeries) throws ProcessorProviderException { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); - return Try.of(() -> this.getTimeSeriesProcessor(key), ProcessorProviderException.class) + return Try.of( + () -> this.getTimeSeriesProcessor(key), ProcessorProviderException.class) .flatMap( processor -> Try.of(() -> processor.handleTimeSeries(timeSeries), EntityProcessorException.class) @@ -141,15 +153,20 @@ Set> handleTimeSeries(T timeSeries) * @param Type of the time series * @param Type of the entry of the time series * @param Type of the entry's value + * @param Type of the value, the time series will return * @return The correct processor * @throws ProcessorProviderException If no fitting processor can be found */ @SuppressWarnings("unchecked cast") - private , E extends TimeSeriesEntry, V extends Value> - TimeSeriesProcessor getTimeSeriesProcessor(TimeSeriesProcessorKey processorKey) + private < + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> + TimeSeriesProcessor getTimeSeriesProcessor(TimeSeriesProcessorKey processorKey) throws ProcessorProviderException { - TimeSeriesProcessor processor = - (TimeSeriesProcessor) timeSeriesProcessors.get(processorKey); + TimeSeriesProcessor processor = + (TimeSeriesProcessor) timeSeriesProcessors.get(processorKey); if (processor == null) throw new ProcessorProviderException( "Cannot find processor for time series combination '" @@ -206,7 +223,11 @@ public String[] getHeaderElements(Class clazz) public String[] getHeaderElements(TimeSeriesProcessorKey processorKey) throws ProcessorProviderException { try { - TimeSeriesProcessor, Value>, TimeSeriesEntry, Value> + TimeSeriesProcessor< + TimeSeries, Value, Value>, + TimeSeriesEntry, + Value, + Value> processor = getTimeSeriesProcessor(processorKey); return processor.getHeaderElements(); } catch (ProcessorProviderException e) { @@ -287,7 +308,10 @@ public static Collection> allResultEntityProce public static Map< TimeSeriesProcessorKey, TimeSeriesProcessor< - TimeSeries, Value>, TimeSeriesEntry, Value>> + TimeSeries, Value, Value>, + TimeSeriesEntry, + Value, + Value>> allTimeSeriesProcessors() throws EntityProcessorException { try { return Try.scanStream( @@ -297,7 +321,7 @@ public static Collection> allResultEntityProce Try.of( () -> new TimeSeriesProcessor<>( - (Class, Value>>) + (Class, Value, Value>>) key.getTimeSeriesClass(), (Class>) key.getEntryClass(), (Class) key.getValueClass()), diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 65edd5980..77a85e69d 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -20,7 +20,10 @@ import java.util.stream.Stream; public class TimeSeriesProcessor< - T extends TimeSeries, E extends TimeSeriesEntry, V extends Value> + T extends TimeSeries, + E extends TimeSeriesEntry, + V extends Value, + R extends Value> extends EntityProcessor { /** * List of all combinations of time series class, entry class and value class, this processor is diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorKey.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorKey.java index 44ecd18be..b76d276db 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorKey.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorKey.java @@ -19,7 +19,7 @@ public class TimeSeriesProcessorKey { private final Class entryClass; private final Class valueClass; - public TimeSeriesProcessorKey(TimeSeries, ?> timeSeries) { + public TimeSeriesProcessorKey(TimeSeries, ?, ?> timeSeries) { this.timeSeriesClass = timeSeries.getClass(); this.entryClass = timeSeries.getEntries().stream() diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 26f0801ac..4b08d00f6 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -114,7 +114,7 @@ public void persist(T entity) { persistIncludeNested(inputEntity); } else if (entity instanceof ResultEntity) { write(entity); - } else if (entity instanceof TimeSeries timeSeries) { + } else if (entity instanceof TimeSeries timeSeries) { persistTimeSeries(timeSeries); } else { log.error( @@ -243,8 +243,8 @@ public void shutdown() { } @Override - public , V extends Value> void persistTimeSeries( - TimeSeries timeSeries) { + public , V extends Value, R extends Value> void persistTimeSeries( + TimeSeries timeSeries) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); String[] headerElements = csvHeaderElements(processorProvider.getHeaderElements(key)); @@ -264,8 +264,8 @@ public , V extends Value> void persis } } - private , V extends Value> void persistTimeSeries( - TimeSeries timeSeries, BufferedCsvWriter writer) throws ProcessorProviderException { + private , V extends Value, R extends Value> void persistTimeSeries( + TimeSeries timeSeries, BufferedCsvWriter writer) throws ProcessorProviderException { try { Set> entityFieldData = processorProvider.handleTimeSeries(timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java index d4dca754e..553392391 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/DataSink.java @@ -61,7 +61,8 @@ public interface DataSink { * @param timeSeries Time series to persist * @param Type of entry in the time series * @param Type of actual value, that is inside the entry + * @param Type of the value, the time series will return */ - , V extends Value> void persistTimeSeries( - TimeSeries timeSeries) throws ProcessorProviderException; + , V extends Value, R extends Value> void persistTimeSeries( + TimeSeries timeSeries) throws ProcessorProviderException; } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java index 85255f916..80d0795d5 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/InfluxDbSink.java @@ -85,8 +85,8 @@ public void persistAll(Collection entities) } @Override - public , V extends Value> void persistTimeSeries( - TimeSeries timeSeries) throws ProcessorProviderException { + public , V extends Value, R extends Value> void persistTimeSeries( + TimeSeries timeSeries) throws ProcessorProviderException { Set points = transformToPoints(timeSeries); writeAll(points); } @@ -146,8 +146,9 @@ private Point transformToPoint(ResultEntity entity, String measurementName) * * @param timeSeries the time series to transform */ - private , V extends Value> - Set transformToPoints(TimeSeries timeSeries) throws ProcessorProviderException { + private , V extends Value, R extends Value> + Set transformToPoints(TimeSeries timeSeries) + throws ProcessorProviderException { if (timeSeries.getEntries().isEmpty()) return Collections.emptySet(); Optional measurementName = entityPersistenceNamingStrategy.getEntityName(timeSeries); @@ -169,8 +170,8 @@ Set transformToPoints(TimeSeries timeSeries) throws ProcessorProvid * @param timeSeries the time series to transform * @param measurementName equivalent to the name of a relational table */ - private , V extends Value> - Set transformToPoints(TimeSeries timeSeries, String measurementName) + private , V extends Value, R extends Value> + Set transformToPoints(TimeSeries timeSeries, String measurementName) throws ProcessorProviderException { Set points = new HashSet<>(); Set> entityFieldData = @@ -205,7 +206,7 @@ private Set extractPoints(C entity) throws ProcessorPr /* Distinguish between result models and time series */ if (entity instanceof ResultEntity resultEntity) { points.add(transformToPoint(resultEntity)); - } else if (entity instanceof TimeSeries timeSeries) { + } else if (entity instanceof TimeSeries timeSeries) { points.addAll(transformToPoints(timeSeries)); } else { log.error( diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 35cdf3b9e..08d2645d8 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -129,7 +129,7 @@ public void persist(C entity, DbGridMetadata identifier) thro persistIncludeNested(inputEntity, identifier); } else if (entity instanceof ResultEntity resultEntity) { insert(resultEntity, identifier); - } else if (entity instanceof TimeSeries timeSeries) { + } else if (entity instanceof TimeSeries timeSeries) { persistTimeSeries(timeSeries, identifier); } else { log.error( @@ -186,8 +186,9 @@ private void persistMixedList(List entities, DbGridMetadat * Persist a list of entities with same types. To minimize the number of queries, the entities * will be grouped by their class. */ - private , V extends Value> void persistList( - List entities, Class cls, DbGridMetadata identifier) throws SQLException { + private , V extends Value, R extends Value> + void persistList(List entities, Class cls, DbGridMetadata identifier) + throws SQLException { // Check if there are only elements of the same class Class firstClass = entities.get(0).getClass(); boolean allSameClass = entities.stream().allMatch(e -> e.getClass() == firstClass); @@ -198,7 +199,7 @@ private , V extends Value> void p } else if (ResultEntity.class.isAssignableFrom(cls)) { insertListIgnoreNested(entities, cls, identifier, false); } else if (TimeSeries.class.isAssignableFrom(cls)) { - entities.forEach(ts -> persistTimeSeries((TimeSeries) ts, identifier)); + entities.forEach(ts -> persistTimeSeries((TimeSeries) ts, identifier)); } else { log.error("I don't know how to handle an entity of class {}", cls.getSimpleName()); } @@ -230,8 +231,8 @@ private void insertListIgnoreNested( } /** Persist one time series. */ - protected , V extends Value> void persistTimeSeries( - TimeSeries timeSeries, DbGridMetadata identifier) { + protected , V extends Value, R extends Value> void persistTimeSeries( + TimeSeries timeSeries, DbGridMetadata identifier) { try { TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(timeSeries); String[] headerElements = processorProvider.getHeaderElements(key); @@ -242,8 +243,8 @@ protected , V extends Value> void persistTimeSeries } } - private , V extends Value> void persistTimeSeries( - TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) + private , V extends Value, R extends Value> void persistTimeSeries( + TimeSeries timeSeries, String[] headerElements, DbGridMetadata identifier) throws ProcessorProviderException { try { diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java index 62593b0ae..b42238286 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java @@ -16,8 +16,9 @@ * * @param Type of the entries, the time series is foreseen to contain * @param Type of the values, the entries will have + * @param Type of the value, the time series will return */ -public abstract class TimeSeries, V extends Value> +public abstract class TimeSeries, V extends Value, R extends Value> extends UniqueEntity { private final Set entries; @@ -36,8 +37,8 @@ protected TimeSeries(UUID uuid, Set entries) { * @param time Reference in time * @return the value at the given time step as a TimeBasedValue */ - public Optional> getTimeBasedValue(ZonedDateTime time) { - V content = getValue(time).orElse(null); + public Optional> getTimeBasedValue(ZonedDateTime time) { + R content = getValue(time).orElse(null); if (content != null) { return Optional.of(new TimeBasedValue<>(time, content)); @@ -53,7 +54,7 @@ public Optional> getTimeBasedValue(ZonedDateTime time) { * @param time Queried time * @return An option on the raw value at the given time step */ - public abstract Optional getValue(ZonedDateTime time); + public abstract Optional getValue(ZonedDateTime time); /** * Get the next earlier known time instant @@ -85,7 +86,7 @@ public Optional> getTimeBasedValue(ZonedDateTime time) { * @param time Reference in time * @return the most recent available value before or at the given time step as a TimeBasedValue */ - public Optional> getPreviousTimeBasedValue(ZonedDateTime time) { + public Optional> getPreviousTimeBasedValue(ZonedDateTime time) { return getPreviousDateTime(time).flatMap(this::getTimeBasedValue); } @@ -95,7 +96,7 @@ public Optional> getPreviousTimeBasedValue(ZonedDateTime time) * @param time Reference in time * @return the next available value after or at the given time step as a TimeBasedValue */ - public Optional> getNextTimeBasedValue(ZonedDateTime time) { + public Optional> getNextTimeBasedValue(ZonedDateTime time) { return getNextDateTime(time).flatMap(this::getTimeBasedValue); } @@ -113,7 +114,7 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - TimeSeries that = (TimeSeries) o; + TimeSeries that = (TimeSeries) o; return entries.equals(that.entries); } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/individual/IndividualTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/individual/IndividualTimeSeries.java index a89e1a234..1ae846da3 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/individual/IndividualTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/individual/IndividualTimeSeries.java @@ -13,7 +13,7 @@ import java.util.stream.Collectors; /** Describes a TimeSeries with individual values per time step */ -public class IndividualTimeSeries extends TimeSeries, V> { +public class IndividualTimeSeries extends TimeSeries, V, V> { /** Maps a time to its respective value to retrieve faster */ private final Map> timeToValue; diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index 6a14a863c..ef254c35e 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -20,7 +20,7 @@ * Describes a load profile time series with repetitive values that can be calculated from a pattern */ public class LoadProfileTimeSeries - extends RepetitiveTimeSeries, PValue> { + extends RepetitiveTimeSeries, V, PValue> { private final LoadProfile loadProfile; private final Map valueMapping; @@ -64,6 +64,16 @@ public Set> getEntries() { return set; } + @Override + protected Optional getPreviousDateTime(ZonedDateTime time) { + return Optional.of(time.minusMinutes(15)); + } + + @Override + protected Optional getNextDateTime(ZonedDateTime time) { + return Optional.of(time.plusMinutes(15)); + } + @Override public List getTimeKeysAfter(ZonedDateTime time) { return List.of(time.plusMinutes(15)); // dummy value that will return next quarter-hour value diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index c26f951f1..9338688bb 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -13,8 +13,8 @@ /** Describes a TimeSeries with repetitive values that can be calculated from a pattern */ public abstract class RepetitiveTimeSeries< - E extends TimeSeriesEntry, V extends Value> - extends TimeSeries { + E extends TimeSeriesEntry, V extends Value, R extends Value> + extends TimeSeries { protected RepetitiveTimeSeries(UUID uuid, Set entries) { super(uuid, entries); @@ -26,23 +26,13 @@ protected RepetitiveTimeSeries(UUID uuid, Set entries) { * @param time Questioned time * @return The value for the queried time */ - protected abstract V calc(ZonedDateTime time); + protected abstract R calc(ZonedDateTime time); @Override - public Optional getValue(ZonedDateTime time) { + public Optional getValue(ZonedDateTime time) { return Optional.ofNullable(calc(time)); } - @Override - protected Optional getPreviousDateTime(ZonedDateTime time) { - return Optional.of(time.minusHours(1)); - } - - @Override - protected Optional getNextDateTime(ZonedDateTime time) { - return Optional.of(time.plusHours(1)); - } - @Override public List getTimeKeysAfter(ZonedDateTime time) { // dummy value diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index aa65e1c84..4f9b5c011 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -153,7 +153,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData ProcessorProvider provider = new ProcessorProvider([ new ResultEntityProcessor(PvResult), new ResultEntityProcessor(EvResult) - ], [] as Map, Value>, TimeSeriesEntry, Value>>) + ], [] as Map, Value, Value>, TimeSeriesEntry, Value, Value>>) when: String[] headerResults = provider.getHeaderElements(PvResult) @@ -177,7 +177,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider should return the header elements for a time series key known by one of its processors and do nothing otherwise"() { given: TimeSeriesProcessorKey availableKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - Map, Value>, TimeSeriesEntry, Value>> timeSeriesProcessors = new HashMap<>() + Map, Value, Value>, TimeSeriesEntry, Value, Value>> timeSeriesProcessors = new HashMap<>() timeSeriesProcessors.put(availableKey, new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue)) ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessors) @@ -203,7 +203,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData ProcessorProvider provider = new ProcessorProvider([ new ResultEntityProcessor(PvResult), new ResultEntityProcessor(EvResult) - ], [] as Map, Value>, TimeSeriesEntry, Value>>) + ], [] as Map, Value, Value>, TimeSeriesEntry, Value, Value>>) Map expectedMap = [ "inputModel": "22bea5fc-2cb2-4c61-beb9-b476e0107f52", @@ -244,7 +244,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider returns an empty Optional, if none of the assigned processors is able to handle a time series"() { given: TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) Map timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(key, processor) ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessorMap) @@ -261,7 +261,7 @@ class ProcessorProviderTest extends Specification implements TimeSeriesTestData def "A ProcessorProvider handles a time series correctly"() { given: TimeSeriesProcessorKey key = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) Map timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(key, processor) ProcessorProvider provider = new ProcessorProvider([], timeSeriesProcessorMap) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index 8c782715e..d551d35d0 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -19,7 +19,7 @@ import java.lang.reflect.Method class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestData { def "A TimeSeriesProcessor is instantiated correctly"() { when: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) Map expectedSourceMapping = [ "price": FieldSourceToMethod.FieldSource.VALUE, "time": FieldSourceToMethod.FieldSource.ENTRY] @@ -54,7 +54,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor throws an Exception, when the simple handle method is called"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) when: processor.handleEntity(individualEnergyPriceTimeSeries) @@ -66,7 +66,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor correctly extracts the field name to getter map"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) when: Map actual = processor.extractFieldToMethod(source) @@ -83,7 +83,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessor handles an entry correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) Map expected = Processor.putUuidFirst([ "price": "5.0", "time" : "2020-04-02 10:00:00" @@ -100,7 +100,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with EnergyPriceValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) when: Set> actual = processor.handleTimeSeries(individualEnergyPriceTimeSeries) @@ -111,7 +111,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with TemperatureValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, TemperatureValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, TemperatureValue) when: Set> actual = processor.handleTimeSeries(individualTemperatureTimeSeries) @@ -122,7 +122,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with WindValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WindValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WindValue) when: Set> actual = processor.handleTimeSeries(individualWindTimeSeries) @@ -133,7 +133,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with IrradianceValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SolarIrradianceValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SolarIrradianceValue) when: Set> actual = processor.handleTimeSeries(individualIrradianceTimeSeries) @@ -144,7 +144,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with WeatherValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WeatherValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, WeatherValue) when: Set> actual = processor.handleTimeSeries(individualWeatherTimeSeries) @@ -155,7 +155,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with HeatDemandValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatDemandValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatDemandValue) when: Set> actual = processor.handleTimeSeries(individualHeatDemandTimeSeries) @@ -166,7 +166,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with PValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, PValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, PValue) when: Set> actual = processor.handleTimeSeries(individualPTimeSeries) @@ -177,7 +177,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with HeatAndPValues correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndPValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndPValue) when: Set> actual = processor.handleTimeSeries(individualHeatAndPTimeSeries) @@ -188,7 +188,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with SValue correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, SValue) when: Set> actual = processor.handleTimeSeries(individualSTimeSeries) @@ -199,7 +199,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete time series with HeatAndSValue correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndSValue) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, HeatAndSValue) when: Set> actual = processor.handleTimeSeries(individualHeatAndSTimeSeries) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index e6b03240c..4b2be267b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -199,7 +199,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { def "A valid CsvFileSink should persist a time series correctly"() { given: - TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) HashMap timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) @@ -315,7 +315,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath, new ProcessorProvider( ProcessorProvider.allEntityProcessors(), - new HashMap, Value>, TimeSeriesEntry, Value>>()), + new HashMap, Value, Value>, TimeSeriesEntry, Value, Value>>()), new FileNamingStrategy(), ",") diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 67e5065e4..db8828495 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -101,7 +101,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri def "SQL sink can persist provided elements correctly"() { given: - TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) HashMap timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) @@ -167,7 +167,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri def "A SqlSink can persist a time series."() { given: - TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) + TimeSeriesProcessor timeSeriesProcessor = new TimeSeriesProcessor<>(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) TimeSeriesProcessorKey timeSeriesProcessorKey = new TimeSeriesProcessorKey(IndividualTimeSeries, TimeBasedValue, EnergyPriceValue) HashMap timeSeriesProcessorMap = new HashMap<>() timeSeriesProcessorMap.put(timeSeriesProcessorKey, timeSeriesProcessor) @@ -244,7 +244,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri schemaName, new ProcessorProvider( ProcessorProvider.allEntityProcessors(), - new HashMap, Value>, TimeSeriesEntry, Value>>()), + new HashMap, Value, Value>, TimeSeriesEntry, Value, Value>>()), namingStrategy, connector) From a6301d594a8e2cbbf4281c3acc8ed61e17e030d9 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 4 Feb 2025 13:03:26 +0100 Subject: [PATCH 236/310] Fixing `InfluxDbSinkIT` test. --- src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy index 7939b4dc9..b79f62336 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/InfluxDbSinkIT.groovy @@ -273,7 +273,7 @@ class InfluxDbSinkIT extends Specification { } @Override - , E extends TimeSeriesEntry, V extends Value> Optional getEntityName(T timeSeries) { + , E extends TimeSeriesEntry, V extends Value, R extends Value> Optional getEntityName(T timeSeries) { return Optional.empty() } } From 06b89a24ff46e93e084c2d49e14484417acb18bc Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 4 Feb 2025 14:28:56 +0100 Subject: [PATCH 237/310] Refactoring `CongestionResult` --- CHANGELOG.md | 1 + .../models/result/grid/congestion.md | 32 +++----- .../result/CongestionResultFactory.java | 22 +++--- .../result/ConnectorResultFactory.java | 2 +- .../result/FlexOptionsResultFactory.java | 2 +- .../io/factory/result/ModelResultFactory.java | 23 ------ .../io/factory/result/NodeResultFactory.java | 2 +- .../factory/result/ResultEntityFactory.java | 1 + .../factory/result/SwitchResultFactory.java | 2 +- .../SystemParticipantResultFactory.java | 2 +- .../factory/result/ThermalResultFactory.java | 2 +- .../models/result/CongestionResult.java | 78 ++++++------------- .../models/result/ModelResultEntity.java | 54 ------------- .../datamodel/models/result/NodeResult.java | 2 +- .../datamodel/models/result/ResultEntity.java | 15 +++- .../result/connector/ConnectorResult.java | 4 +- .../models/result/connector/SwitchResult.java | 4 +- .../result/system/FlexOptionsResult.java | 4 +- .../system/SystemParticipantResult.java | 4 +- .../result/thermal/ThermalUnitResult.java | 4 +- .../validation/UniquenessValidationUtils.java | 24 ++---- .../result/ResultEntityProcessorTest.groovy | 4 +- .../UniquenessValidationUtilsTest.groovy | 29 +++---- 23 files changed, 101 insertions(+), 216 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 3abd7d730..f93c8b178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed timeseries mapping `participant` column to `asset` [#1191](https://github.com/ie3-institute/PowerSystemDataModel/issues/1191) - Removed attribute `dsm` from `LoadInput` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195) - Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223) +- Refactored `CongestionResult`, removed `ModelResultEntity` [#1234](https://github.com/ie3-institute/PowerSystemDataModel/issues/1234) ## [5.1.0] - 2024-06-24 diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index e0f687fa4..57f639917 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -2,7 +2,7 @@ # Congestion -Representation of a congestion result for a given subnet. +Representation of a congestion result for a given asset. ## Attributes, Units and Remarks @@ -18,30 +18,22 @@ Representation of a congestion result for a given subnet. * - time - ZonedDateTime - date and time for the produced result - + + * - inputModel + - + - uuid for the associated input model + * - subgrid - - Sub grid number - * - vMin - - p.u. - - minimal voltage of the subnet - - * - vMax - - p.u. - - maximal voltage of the subnet - - * - voltage - - - - Boolean indicator, if a voltage congestion occurred + * - min + - % + - minimal value that is possible - * - line - - - - Boolean indicator, if a line congestion occurred - - * - transformer - - - - Boolean indicator, if a transformer congestion occurred + * - max + - % + - maximal value that is possible ``` ## Caveats diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java index 9950a3eaf..082b5d91d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.result; -import static edu.ie3.util.quantities.PowerSystemUnits.PU; +import static tech.units.indriya.unit.Units.PERCENT; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.result.CongestionResult; @@ -13,16 +13,14 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Set; +import java.util.UUID; import javax.measure.quantity.Dimensionless; import tech.units.indriya.ComparableQuantity; public class CongestionResultFactory extends ResultEntityFactory { private static final String SUBGRID = "subgrid"; - private static final String VMIN = "vMin"; - private static final String VMAX = "vMax"; - private static final String VOLTAGE = "voltage"; - private static final String LINE = "line"; - private static final String TRANSFORMER = "transformer"; + private static final String MIN = "min"; + private static final String MAX = "max"; public CongestionResultFactory() { super(CongestionResult.class); @@ -34,19 +32,17 @@ public CongestionResultFactory(DateTimeFormatter dateTimeFormatter) { @Override protected List> getFields(Class entityClass) { - return List.of(newSet(TIME, SUBGRID, VMIN, VMAX, VOLTAGE, LINE, TRANSFORMER)); + return List.of(newSet(TIME, SUBGRID, MIN, MAX)); } @Override protected CongestionResult buildModel(EntityData data) { ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); + UUID inputModel = data.getUUID(INPUT_MODEL); int subgrid = data.getInt(SUBGRID); - ComparableQuantity vMin = data.getQuantity(VMIN, PU); - ComparableQuantity vMax = data.getQuantity(VMAX, PU); - boolean voltage = data.getBoolean(VOLTAGE); - boolean line = data.getBoolean(LINE); - boolean transformer = data.getBoolean(TRANSFORMER); + ComparableQuantity min = data.getQuantity(MIN, PERCENT); + ComparableQuantity max = data.getQuantity(MAX, PERCENT); - return new CongestionResult(zdtTime, subgrid, vMin, vMax, voltage, line, transformer); + return new CongestionResult(zdtTime, inputModel, subgrid, min, max); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java index d211528ef..495ee9bb9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java @@ -20,7 +20,7 @@ import javax.measure.quantity.ElectricCurrent; import tech.units.indriya.ComparableQuantity; -public class ConnectorResultFactory extends ModelResultFactory { +public class ConnectorResultFactory extends ResultEntityFactory { private static final String IAMAG = "iAMag"; private static final String IAANG = "iAAng"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java index d3d63af84..1c31ea9db 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java @@ -14,7 +14,7 @@ import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -public class FlexOptionsResultFactory extends ModelResultFactory { +public class FlexOptionsResultFactory extends ResultEntityFactory { private static final String P_REF = "pRef"; private static final String P_MIN = "pMin"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java deleted file mode 100644 index c888b7ee5..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.result; - -import edu.ie3.datamodel.models.result.ModelResultEntity; -import java.time.format.DateTimeFormatter; - -public abstract class ModelResultFactory - extends ResultEntityFactory { - protected static final String INPUT_MODEL = "inputModel"; - - protected ModelResultFactory(Class... allowedClasses) { - super(allowedClasses); - } - - protected ModelResultFactory( - DateTimeFormatter dateTimeFormatter, Class... allowedClasses) { - super(dateTimeFormatter, allowedClasses); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java index 858480fbd..e7cbf1ea9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java @@ -15,7 +15,7 @@ import javax.measure.quantity.Dimensionless; import tech.units.indriya.ComparableQuantity; -public class NodeResultFactory extends ModelResultFactory { +public class NodeResultFactory extends ResultEntityFactory { private static final String VMAG = "vMag"; private static final String VANG = "vAng"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java index f4c239795..6eadf1cd9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java @@ -22,6 +22,7 @@ public abstract class ResultEntityFactory extends EntityFactory { protected static final String TIME = "time"; + protected static final String INPUT_MODEL = "inputModel"; protected final TimeUtil timeUtil; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java index 039928148..0db6a14dc 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java @@ -11,7 +11,7 @@ import java.time.format.DateTimeFormatter; import java.util.*; -public class SwitchResultFactory extends ModelResultFactory { +public class SwitchResultFactory extends ResultEntityFactory { private static final String CLOSED = "closed"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java index 68243f438..1d819be4e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java @@ -23,7 +23,7 @@ * Factory class for creating {@link SystemParticipantResult} entities from provided {@link * EntityData} data objects. */ -public class SystemParticipantResultFactory extends ModelResultFactory { +public class SystemParticipantResultFactory extends ResultEntityFactory { private static final String POWER = "p"; private static final String REACTIVE_POWER = "q"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java index 0ff9180d0..6a84b6d73 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java @@ -21,7 +21,7 @@ import javax.measure.quantity.Temperature; import tech.units.indriya.ComparableQuantity; -public class ThermalResultFactory extends ModelResultFactory { +public class ThermalResultFactory extends ResultEntityFactory { private static final String Q_DOT = "qDot"; private static final String INDOOR_TEMPERATURE = "indoorTemperature"; private static final String ENERGY = "energy"; diff --git a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java index 61db3fb62..95c57c7bf 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java @@ -7,6 +7,7 @@ import java.time.ZonedDateTime; import java.util.Objects; +import java.util.UUID; import javax.measure.quantity.Dimensionless; import tech.units.indriya.ComparableQuantity; @@ -14,62 +15,39 @@ public class CongestionResult extends ResultEntity { /** Values */ private final Integer subgrid; - private final ComparableQuantity vMin; - private final ComparableQuantity vMax; - private final boolean voltage; - private final boolean line; - private final boolean transformer; + private final ComparableQuantity min; + private final ComparableQuantity max; /** * Standard constructor which includes auto generation of the resulting output models uuid. * * @param time date and time when the result is produced * @param subgrid the subgrid - * @param vMin minimum voltage in pu - * @param vMax maximal voltage in pu - * @param voltage {@code true} if a voltage congestion occurred in the subnet - * @param line {@code true} if a line congestion occurred in the subnet - * @param transformer {@code true} if a transformer congestion occurred in the subnet + * @param min minimum value in percent + * @param max maximal value in percent */ public CongestionResult( ZonedDateTime time, + UUID inputModel, int subgrid, - ComparableQuantity vMin, - ComparableQuantity vMax, - boolean voltage, - boolean line, - boolean transformer) { - super(time); + ComparableQuantity min, + ComparableQuantity max) { + super(time, inputModel); this.subgrid = subgrid; - this.vMin = vMin; - this.vMax = vMax; - this.voltage = voltage; - this.line = line; - this.transformer = transformer; + this.min = min; + this.max = max; } public int getSubgrid() { return subgrid; } - public boolean getVoltage() { - return voltage; + public ComparableQuantity getMin() { + return min; } - public boolean getLine() { - return line; - } - - public boolean getTransformer() { - return transformer; - } - - public ComparableQuantity getVMin() { - return vMin; - } - - public ComparableQuantity getVMax() { - return vMax; + public ComparableQuantity getMax() { + return max; } @Override @@ -79,35 +57,27 @@ public boolean equals(Object o) { CongestionResult that = (CongestionResult) o; return getTime().equals(that.getTime()) && Objects.equals(subgrid, that.subgrid) - && vMin.equals(that.vMin) - && vMax.equals(that.vMax) - && voltage == that.voltage - && line == that.line - && transformer == that.transformer; + && min.equals(that.min) + && max.equals(that.max); } @Override public int hashCode() { - return Objects.hash( - super.hashCode(), getTime(), subgrid, vMin, vMax, voltage, line, transformer); + return Objects.hash(super.hashCode(), getTime(), subgrid, min, max); } @Override public String toString() { return "InputResultEntity{time=" + getTime() + + ", inputModel=" + + getInputModel() + ", subgrid=" + subgrid - + ", vMin=" - + vMin - + ", vMan=" - + vMax - + ", voltage=" - + voltage - + ", line=" - + line - + ", transformer=" - + transformer + + ", min=" + + min + + ", max=" + + max + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java b/src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java deleted file mode 100644 index abc90cec4..000000000 --- a/src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.result; - -import java.time.ZonedDateTime; -import java.util.Objects; -import java.util.UUID; - -/** Abstract class to hold all mappings common to all input result models */ -public abstract class ModelResultEntity extends ResultEntity { - - /** uuid of the input model that produces the result */ - private UUID inputModel; - - /** - * Standard constructor which includes auto generation of the resulting output models uuid. - * - * @param time date and time when the result is produced - * @param inputModel uuid of the input model that produces the result - */ - protected ModelResultEntity(ZonedDateTime time, UUID inputModel) { - super(time); - this.inputModel = inputModel; - } - - public UUID getInputModel() { - return inputModel; - } - - public void setInputModel(UUID inputID) { - inputModel = inputID; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ModelResultEntity that = (ModelResultEntity) o; - return getTime().equals(that.getTime()) && inputModel.equals(that.inputModel); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getTime(), inputModel); - } - - @Override - public String toString() { - return "InputResultEntity{time=" + getTime() + ", inputModel=" + inputModel + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java b/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java index f0db14df3..0724a8344 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java @@ -13,7 +13,7 @@ import tech.units.indriya.ComparableQuantity; /** Represents calculation results of a {@link edu.ie3.datamodel.models.input.NodeInput} */ -public class NodeResult extends ModelResultEntity { +public class NodeResult extends ResultEntity { /** Voltage magnitude @ this node in p.u. */ private ComparableQuantity vMag; diff --git a/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java b/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java index ba4dd58af..0d8b229bf 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java +++ b/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java @@ -8,20 +8,33 @@ import edu.ie3.datamodel.models.Entity; import java.time.ZonedDateTime; import java.util.Objects; +import java.util.UUID; /** Abstract class to hold all mappings common to all result models */ public abstract class ResultEntity implements Entity { /** date and time of the produced result */ private ZonedDateTime time; + /** uuid of the input model that produces the result */ + private UUID inputModel; /** * Standard constructor which includes auto generation of the resulting output models uuid. * * @param time date and time when the result is produced + * @param inputModel uuid of the input model that produces the result */ - protected ResultEntity(ZonedDateTime time) { + protected ResultEntity(ZonedDateTime time, UUID inputModel) { this.time = time; + this.inputModel = inputModel; + } + + public UUID getInputModel() { + return inputModel; + } + + public void setInputModel(UUID inputID) { + inputModel = inputID; } public ZonedDateTime getTime() { diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java index 187a27fc0..c5d9b99cd 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.connector; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -14,7 +14,7 @@ import tech.units.indriya.ComparableQuantity; /** Abstract class to hold most 'ElectricCurrent and Angle'-mappings common to all connectors */ -public abstract class ConnectorResult extends ModelResultEntity { +public abstract class ConnectorResult extends ResultEntity { /** Electric current magnitude @ port A, normally provided in Ampere */ private ComparableQuantity iAMag; diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java index c0b650558..7b5c15c5b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.connector; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,7 +13,7 @@ /** * Represents calculation results of a {@link edu.ie3.datamodel.models.input.connector.SwitchInput} */ -public class SwitchResult extends ModelResultEntity { +public class SwitchResult extends ResultEntity { /** is the switching state 'closed'? */ private boolean closed; diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java index ea85fc554..210bc761b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.system; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,7 +13,7 @@ import tech.units.indriya.ComparableQuantity; /** Represents results of flexibility request */ -public class FlexOptionsResult extends ModelResultEntity { +public class FlexOptionsResult extends ResultEntity { /** * Active power (might be negative, thus feed-in) that was suggested for regular usage by the diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java index 225833777..4b5067896 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.system; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,7 +13,7 @@ import tech.units.indriya.ComparableQuantity; /** Abstract class that holds values common to all other result entities */ -public abstract class SystemParticipantResult extends ModelResultEntity { +public abstract class SystemParticipantResult extends ResultEntity { /** active power output normally provided in MW */ private ComparableQuantity p; diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java index d3265bbae..07ba81913 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.models.result.thermal; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -14,7 +14,7 @@ import tech.units.indriya.ComparableQuantity; /** Representation of a result with regard to a thermal unit */ -public abstract class ThermalUnitResult extends ModelResultEntity { +public abstract class ThermalUnitResult extends ResultEntity { /** * Average thermal power flowing into the thermal unit (+: Power flowing into unit, -: Power diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java index 50f71c78c..cdf980fad 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java @@ -11,8 +11,7 @@ import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.IdCoordinateInput; -import edu.ie3.datamodel.models.result.CongestionResult; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.WeatherValue; import edu.ie3.datamodel.utils.Try; @@ -28,10 +27,8 @@ public class UniquenessValidationUtils extends ValidationUtils { protected static final FieldSetSupplier uuidFieldSupplier = entity -> Set.of(entity.getUuid()); protected static final FieldSetSupplier idFieldSupplier = e -> Set.of(e.getId()); - protected static final FieldSetSupplier modelResultFieldSupplier = + protected static final FieldSetSupplier resultFieldSupplier = entity -> Set.of(entity.getTime(), entity.getInputModel()); - protected static final FieldSetSupplier congestionResultFieldSupplier = - entity -> Set.of(entity.getTime(), entity.getSubgrid()); protected static final FieldSetSupplier mappingFieldSupplier = entity -> Set.of(entity.getAsset()); protected static final FieldSetSupplier idCoordinateSupplier = @@ -72,25 +69,14 @@ public static void checkAssetUniqueness(Collection entitie } /** - * Checks the uniqueness of a collection of {@link CongestionResult}. + * Checks the uniqueness of a collection of {@link ResultEntity}. * * @param entities to be checked * @throws DuplicateEntitiesException if uniqueness is violated */ - public static void checkCongestionResultUniqueness( - Collection entities) throws DuplicateEntitiesException { - checkUniqueness(entities, congestionResultFieldSupplier).getOrThrow(); - } - - /** - * Checks the uniqueness of a collection of {@link ModelResultEntity}. - * - * @param entities to be checked - * @throws DuplicateEntitiesException if uniqueness is violated - */ - public static void checkModelResultUniqueness(Collection entities) + public static void checkResultUniqueness(Collection entities) throws DuplicateEntitiesException { - checkUniqueness(entities, modelResultFieldSupplier).getOrThrow(); + checkUniqueness(entities, resultFieldSupplier).getOrThrow(); } /** diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy index 7bf12fbb9..4f5c4a0f1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy @@ -7,8 +7,8 @@ package edu.ie3.datamodel.io.processor.result import edu.ie3.datamodel.exceptions.EntityProcessorException import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.ModelResultEntity import edu.ie3.datamodel.models.result.NodeResult +import edu.ie3.datamodel.models.result.ResultEntity import edu.ie3.datamodel.models.result.connector.LineResult import edu.ie3.datamodel.models.result.connector.SwitchResult import edu.ie3.datamodel.models.result.connector.Transformer2WResult @@ -285,7 +285,7 @@ class ResultEntityProcessorTest extends Specification { thrown(EntityProcessorException) } - private static class InvalidTestResult extends ModelResultEntity { + private static class InvalidTestResult extends ResultEntity { InvalidTestResult(ZonedDateTime time, UUID inputModel) { super(time, inputModel) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index 95b2f0472..f8ac14ec8 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -10,14 +10,15 @@ import static edu.ie3.datamodel.utils.validation.UniquenessValidationUtils.* import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.PU import static tech.units.indriya.unit.Units.METRE_PER_SECOND +import static tech.units.indriya.unit.Units.PERCENT import edu.ie3.datamodel.exceptions.DuplicateEntitiesException import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.AssetInput import edu.ie3.datamodel.models.result.CongestionResult -import edu.ie3.datamodel.models.result.ModelResultEntity import edu.ie3.datamodel.models.result.NodeResult +import edu.ie3.datamodel.models.result.ResultEntity import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.SolarIrradianceValue import edu.ie3.datamodel.models.value.TemperatureValue @@ -107,19 +108,19 @@ class UniquenessValidationUtilsTest extends Specification { Quantity vMag = Quantities.getQuantity(0.95, PU) Quantity vAng = Quantities.getQuantity(45, StandardUnits.VOLTAGE_ANGLE) - Set uniqueResults = [ + Set uniqueResults = [ new NodeResult(time, uuid, vMag, vAng), new NodeResult(time.plusHours(1), uuid, vMag, vAng) ] when: - checkModelResultUniqueness(uniqueResults) + checkResultUniqueness(uniqueResults) then: noExceptionThrown() } - def "Duplicates in model result inputs lead to an exception"() { + def "Duplicates in result inputs lead to an exception"() { given: ZonedDateTime time = ZonedDateTime.parse("2024-02-15T13:49:44+01:00[Europe/Berlin]") UUID uuid1 = UUID.fromString("4f7938ad-3d8f-4d56-a76c-525f2362e8b6") @@ -127,7 +128,7 @@ class UniquenessValidationUtilsTest extends Specification { Quantity vMag = Quantities.getQuantity(0.95, PU) Quantity vAng = Quantities.getQuantity(45, StandardUnits.VOLTAGE_ANGLE) - Set notUniqueResults = [ + Set notUniqueResults = [ new NodeResult(time, uuid1, vMag, vAng), new NodeResult(time, uuid1, vMag, vAng), new NodeResult(time.plusHours(1), uuid2, vMag, vAng), @@ -135,7 +136,7 @@ class UniquenessValidationUtilsTest extends Specification { ] when: - checkModelResultUniqueness(notUniqueResults) + checkResultUniqueness(notUniqueResults) then: DuplicateEntitiesException de = thrown() @@ -145,20 +146,22 @@ class UniquenessValidationUtilsTest extends Specification { def "Duplicates in congestion result inputs lead to an exception"() { given: ZonedDateTime time = ZonedDateTime.parse("2024-02-15T13:49:44+01:00[Europe/Berlin]") + UUID inputModel1 = UUID.randomUUID() + UUID inputModel2 = UUID.randomUUID() int subgrid1 = 1 int subgrid2 = 2 - Quantity vMin = Quantities.getQuantity(0.9, PU) - Quantity vMax = Quantities.getQuantity(1.1, PU) + Quantity min = Quantities.getQuantity(90, PERCENT) + Quantity max = Quantities.getQuantity(110, PERCENT) Set notUniqueResults = [ - new CongestionResult(time, subgrid1, vMin, vMax, false, false, false), - new CongestionResult(time, subgrid1, vMin, vMax, false, true, false), - new CongestionResult(time.plusHours(1), subgrid1, vMin, vMax, false, false, false), - new CongestionResult(time.plusHours(1), subgrid2, vMin, vMax, false, true, false), + new CongestionResult(time, inputModel1, subgrid1, min, max), + new CongestionResult(time, inputModel2, subgrid1, min, max), + new CongestionResult(time.plusHours(1), inputModel1, subgrid1, min, max), + new CongestionResult(time.plusHours(1), inputModel2, subgrid2, min, max), ] when: - checkCongestionResultUniqueness(notUniqueResults) + checkResultUniqueness(notUniqueResults) then: DuplicateEntitiesException de = thrown() From 39fdd99f141a1b8f98edf3122b06d406cbf4a967 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 4 Feb 2025 14:39:31 +0100 Subject: [PATCH 238/310] Fixing failing test. --- .../utils/validation/UniquenessValidationUtilsTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index f8ac14ec8..09192cd47 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -155,7 +155,7 @@ class UniquenessValidationUtilsTest extends Specification { Set notUniqueResults = [ new CongestionResult(time, inputModel1, subgrid1, min, max), - new CongestionResult(time, inputModel2, subgrid1, min, max), + new CongestionResult(time, inputModel1, subgrid2, min, max), new CongestionResult(time.plusHours(1), inputModel1, subgrid1, min, max), new CongestionResult(time.plusHours(1), inputModel2, subgrid2, min, max), ] From 5d5d9e68f2806edfbe40bb8ccc2b5eff76b67e83 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 5 Feb 2025 10:06:09 +0100 Subject: [PATCH 239/310] Enhancing `CongestionResult` with input model type and value. --- .../models/result/grid/congestion.md | 12 ++++- .../result/CongestionResultFactory.java | 18 ++++++- .../models/result/CongestionResult.java | 51 ++++++++++++++++++- .../UniquenessValidationUtilsTest.groovy | 10 ++-- 4 files changed, 82 insertions(+), 9 deletions(-) diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 57f639917..7b21278fb 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -23,16 +23,24 @@ Representation of a congestion result for a given asset. - - uuid for the associated input model + * - inputModelType + - + - the type of the input model (e.g. node, line, etc.) + * - subgrid - - Sub grid number * - min - - % + - Percent + - the actual value that was calculated + + * - min + - Percent - minimal value that is possible * - max - - % + - Percent - maximal value that is possible ``` diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java index 082b5d91d..1ff917089 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java @@ -7,8 +7,12 @@ import static tech.units.indriya.unit.Units.PERCENT; +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.result.CongestionResult; +import edu.ie3.datamodel.models.result.CongestionResult.InputModelType; +import edu.ie3.datamodel.utils.Try; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -18,7 +22,9 @@ import tech.units.indriya.ComparableQuantity; public class CongestionResultFactory extends ResultEntityFactory { + private static final String TYPE = "type"; private static final String SUBGRID = "subgrid"; + private static final String VALUE = "value"; private static final String MIN = "min"; private static final String MAX = "max"; @@ -32,17 +38,25 @@ public CongestionResultFactory(DateTimeFormatter dateTimeFormatter) { @Override protected List> getFields(Class entityClass) { - return List.of(newSet(TIME, SUBGRID, MIN, MAX)); + return List.of(newSet(TIME, INPUT_MODEL, TYPE, SUBGRID, MIN, MAX)); } @Override protected CongestionResult buildModel(EntityData data) { ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); UUID inputModel = data.getUUID(INPUT_MODEL); + + InputModelType type = + Try.of(() -> InputModelType.parse(data.getField(TYPE)), ParsingException.class) + .transformF(FactoryException::new) + .getOrThrow(); + int subgrid = data.getInt(SUBGRID); + + ComparableQuantity value = data.getQuantity(VALUE, PERCENT); ComparableQuantity min = data.getQuantity(MIN, PERCENT); ComparableQuantity max = data.getQuantity(MAX, PERCENT); - return new CongestionResult(zdtTime, inputModel, subgrid, min, max); + return new CongestionResult(zdtTime, inputModel, type, subgrid, value, min, max); } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java index 95c57c7bf..cada19c7f 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.result; +import edu.ie3.datamodel.exceptions.ParsingException; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -15,6 +16,8 @@ public class CongestionResult extends ResultEntity { /** Values */ private final Integer subgrid; + private final InputModelType type; + private final ComparableQuantity value; private final ComparableQuantity min; private final ComparableQuantity max; @@ -22,26 +25,41 @@ public class CongestionResult extends ResultEntity { * Standard constructor which includes auto generation of the resulting output models uuid. * * @param time date and time when the result is produced + * @param inputModel identifier of the input model + * @param type of the input model * @param subgrid the subgrid + * @param value the actual value in percent * @param min minimum value in percent * @param max maximal value in percent */ public CongestionResult( ZonedDateTime time, UUID inputModel, + InputModelType type, int subgrid, + ComparableQuantity value, ComparableQuantity min, ComparableQuantity max) { super(time, inputModel); + this.type = type; this.subgrid = subgrid; + this.value = value; this.min = min; this.max = max; } + public InputModelType getType() { + return type; + } + public int getSubgrid() { return subgrid; } + public ComparableQuantity getValue() { + return value; + } + public ComparableQuantity getMin() { return min; } @@ -56,14 +74,17 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; CongestionResult that = (CongestionResult) o; return getTime().equals(that.getTime()) + && getInputModel().equals(that.getInputModel()) + && type.equals(that.type) && Objects.equals(subgrid, that.subgrid) + && value.equals(that.value) && min.equals(that.min) && max.equals(that.max); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), getTime(), subgrid, min, max); + return Objects.hash(super.hashCode(), getTime(), type, subgrid, value, min, max); } @Override @@ -72,12 +93,40 @@ public String toString() { + getTime() + ", inputModel=" + getInputModel() + + ", type=" + + type + ", subgrid=" + subgrid + + ", value=" + + value + ", min=" + min + ", max=" + max + '}'; } + + public enum InputModelType { + NODE("node"), + LINE("line"), + TRANSFORMER_2W("transformer_2w"), + TRANSFORMER_3W("transforerm_3w"); + + public final String type; + + InputModelType(String type) { + this.type = type; + } + + public static InputModelType parse(String inputModelType) throws ParsingException { + return switch (inputModelType) { + case "node" -> NODE; + case "line" -> LINE; + case "transformer_2w" -> TRANSFORMER_2W; + case "transformer_3w" -> TRANSFORMER_3W; + default -> throw new ParsingException( + "InputModelType '" + inputModelType + "' cannot be parsed!"); + }; + } + } } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index 09192cd47..e291227c4 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.utils.validation +import static edu.ie3.datamodel.models.result.CongestionResult.InputModelType.NODE import static edu.ie3.datamodel.utils.validation.DummyAssetInput.valid import static edu.ie3.datamodel.utils.validation.UniquenessValidationUtils.* import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM @@ -150,14 +151,15 @@ class UniquenessValidationUtilsTest extends Specification { UUID inputModel2 = UUID.randomUUID() int subgrid1 = 1 int subgrid2 = 2 + Quantity value = Quantities.getQuantity(100, PERCENT) Quantity min = Quantities.getQuantity(90, PERCENT) Quantity max = Quantities.getQuantity(110, PERCENT) Set notUniqueResults = [ - new CongestionResult(time, inputModel1, subgrid1, min, max), - new CongestionResult(time, inputModel1, subgrid2, min, max), - new CongestionResult(time.plusHours(1), inputModel1, subgrid1, min, max), - new CongestionResult(time.plusHours(1), inputModel2, subgrid2, min, max), + new CongestionResult(time, inputModel1, NODE, subgrid1, value, min, max), + new CongestionResult(time, inputModel1, NODE, subgrid2, value, min, max), + new CongestionResult(time.plusHours(1), inputModel1, NODE, subgrid1, value, min, max), + new CongestionResult(time.plusHours(1), inputModel2, NODE, subgrid2, value, min, max), ] when: From f09f53d03a8a32e7a4f9cb70ca7624353c7809aa Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 5 Feb 2025 10:17:28 +0100 Subject: [PATCH 240/310] Addressing reviewer's comments. --- docs/readthedocs/models/result/grid/congestion.md | 6 +++--- .../utils/validation/UniquenessValidationUtilsTest.groovy | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 7b21278fb..299648eeb 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -31,17 +31,17 @@ Representation of a congestion result for a given asset. - - Sub grid number - * - min + * - value - Percent - the actual value that was calculated * - min - Percent - - minimal value that is possible + - minimal limit value * - max - Percent - - maximal value that is possible + - maximal limit value ``` ## Caveats diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index e291227c4..82066c52c 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -151,7 +151,7 @@ class UniquenessValidationUtilsTest extends Specification { UUID inputModel2 = UUID.randomUUID() int subgrid1 = 1 int subgrid2 = 2 - Quantity value = Quantities.getQuantity(100, PERCENT) + Quantity value = Quantities.getQuantity(120, PERCENT) Quantity min = Quantities.getQuantity(90, PERCENT) Quantity max = Quantities.getQuantity(110, PERCENT) From 09806f5c74057d5c78aba23ac5123397c0f59d86 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 5 Feb 2025 13:47:08 +0100 Subject: [PATCH 241/310] Addressing reviewer's comments. --- docs/readthedocs/models/result/grid/congestion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 299648eeb..2113706ac 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -33,7 +33,7 @@ Representation of a congestion result for a given asset. * - value - Percent - - the actual value that was calculated + - the actual value that was calculated in relation to its base value * - min - Percent From 19bcfb1ed198d49f4e51138546fce32b1b9b4847 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 5 Feb 2025 14:12:19 +0100 Subject: [PATCH 242/310] fix tests after merging dev --- docs/readthedocs/io/ValidationUtils.md | 2 +- .../validation/ThermalValidationUtils.java | 36 ------------------- .../utils/validation/ValidationUtils.java | 2 -- .../ThermalValidationUtilsTest.groovy | 25 +++++++------ 4 files changed, 15 insertions(+), 50 deletions(-) diff --git a/docs/readthedocs/io/ValidationUtils.md b/docs/readthedocs/io/ValidationUtils.md index 7937ac204..4c2bf9194 100644 --- a/docs/readthedocs/io/ValidationUtils.md +++ b/docs/readthedocs/io/ValidationUtils.md @@ -74,7 +74,7 @@ The ValidationUtils include validation checks for... - HpTypeInput - StorageTypeInput - WecTypeInput -- ThermalUnitValidationUtils +- ThermalValidationUtils - ThermalUnitInput - ThermalSinkInput - ThermalHouseInput diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java index 04d8c7a78..cbd63a98a 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java @@ -60,42 +60,6 @@ private ThermalValidationUtils() { return exceptions; } - /** - * Validates a thermal grid if: - * - *

      - *
    • it is not null - *
    - * - * A "distribution" method, that forwards the check request to specific implementations to fulfill - * the checking task, based on the class of the given object. - * - * @param thermalGrid ThermalGrid to validate - * @return a list of try objects either containing an {@link ValidationException} or an empty - * Success - */ - protected static List> check(ThermalGrid thermalGrid) { - Try isNull = checkNonNull(thermalGrid, "a thermal grid"); - - if (isNull.isFailure()) { - return List.of(isNull); - } - - List> exceptions = new ArrayList<>(); - - // Validate houses - for (ThermalHouseInput house : thermalGrid.houses()) { - exceptions.addAll(checkThermalHouse(house)); - } - - // Validate storages - for (ThermalStorageInput storage : thermalGrid.storages()) { - exceptions.addAll(check(storage)); - } - - return exceptions; - } - /** * Validates a thermal grid if: * diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java index b36bcc4d8..80006953b 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java @@ -157,8 +157,6 @@ else if (ThermalUnitInput.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput)); else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass())) exceptions.addAll(ThermalValidationUtils.check((ThermalUnitInput) assetInput)); - else if (ThermalGrid.class.isAssignableFrom(assetInput.getClass())) - exceptions.addAll(ThermalUnitValidationUtils.check((ThermalUnitInput) assetInput)); else { logNotImplemented(assetInput); } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index fbdb4ad16..1c1188b1e 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -70,7 +70,7 @@ class ThermalValidationUtilsTest extends Specification { noExceptionThrown() } - def "ThermalUnitValidationUtils.checkThermalHouse() recognizes all potential errors for a thermal house"() { + def "ThermalValidationUtils.checkThermalHouse() recognizes all potential errors for a thermal house"() { when: List> exceptions = ThermalValidationUtils.check(invalidThermalHouse).stream().filter { it -> it.failure }.toList() @@ -105,7 +105,7 @@ class ThermalValidationUtilsTest extends Specification { noExceptionThrown() } - def "ThermalUnitValidationUtils.checkCylindricalStorage() recognizes all potential errors for a thermal cylindrical storage"() { + def "ThermalValidationUtils.checkCylindricalStorage() recognizes all potential errors for a thermal cylindrical storage"() { when: List> exceptions = ThermalValidationUtils.check(invalidCylindricalStorage).stream().filter { it -> it.failure }.toList() @@ -123,9 +123,9 @@ class ThermalValidationUtilsTest extends Specification { new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidCylindricalStorage) } - def "ThermalUnitValidationUtils.checkDomesticHotWaterStorage() recognizes all potential errors for a domestic hot water storage"() { + def "ThermalValidationUtils.checkDomesticHotWaterStorage() recognizes all potential errors for a domestic hot water storage"() { when: - List> exceptions = ThermalUnitValidationUtils.check(invalidDomesticHotWaterStorage).stream().filter { it -> it.failure }.toList() + List> exceptions = ThermalValidationUtils.check(invalidDomesticHotWaterStorage).stream().filter { it -> it.failure }.toList() then: exceptions.size() == expectedSize @@ -141,7 +141,7 @@ class ThermalValidationUtilsTest extends Specification { new DomesticHotWaterStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidDomesticHotWaterStorage) } - def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { + def "ThermalValidationUtils.check() works for complete ThermalGrid as well"() { when: def thermalBus = ThermalUnitInputTestData.thermalBus def domesticHotWaterStorageInput = [ @@ -154,7 +154,7 @@ class ThermalValidationUtilsTest extends Specification { ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) - List> exceptions = ThermalUnitValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() + List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() then: exceptions.size() == expectedSize @@ -168,15 +168,18 @@ class ThermalValidationUtilsTest extends Specification { new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } - def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { + def "ThermalValidationUtils.check() works for complete ThermalGrid as well"() { when: def thermalBus = ThermalUnitInputTestData.thermalBus def cylindricalStorageInput = [ - ThermalUnitInputTestData.cylindricStorageInput + ThermalUnitInputTestData.cylindricalStorageInput + ] + def domesticHotWaterStorageInput = [ + ThermalUnitInputTestData.domesticHotWaterStorageInput ] - ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput) + ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() @@ -189,7 +192,7 @@ class ThermalValidationUtilsTest extends Specification { where: - thermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) + thermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "house", 2) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } } From 763507bef72d296be93f752f63a7a3af2f4d9010 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 5 Feb 2025 14:15:38 +0100 Subject: [PATCH 243/310] fix changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d7742f8f..b7b8d2ba3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) -- Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) -- Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) +- Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) - Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) From 02e37af0b4925bfe106e643df5c365d804eafe6d Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 5 Feb 2025 14:18:38 +0100 Subject: [PATCH 244/310] fmt --- CHANGELOG.md | 2 +- .../utils/validation/ThermalValidationUtilsTest.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7b8d2ba3..7c6b6824d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) -- Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) +- Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) - Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index 1c1188b1e..76ccec889 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -175,7 +175,7 @@ class ThermalValidationUtilsTest extends Specification { ThermalUnitInputTestData.cylindricalStorageInput ] def domesticHotWaterStorageInput = [ - ThermalUnitInputTestData.domesticHotWaterStorageInput + ThermalUnitInputTestData.domesticHotWaterStorageInput ] From 8ad0a663fc9285ec1e8a65c23b790dc2ccdc62d3 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Thu, 6 Feb 2025 10:41:14 +0100 Subject: [PATCH 245/310] Fixing sonarqube issues. --- .../factory/timeseries/LoadProfileData.java | 22 +++++++ .../timeseries/LoadProfileFactory.java | 60 +++++++++++++++++++ .../edu/ie3/datamodel/io/sink/SqlSink.java | 19 +++--- .../SqlTimeSeriesMetaInformationSource.java | 2 +- .../repetitive/LoadProfileTimeSeries.java | 8 +-- 5 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java new file mode 100644 index 000000000..abdb140b3 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileData.java @@ -0,0 +1,22 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.FactoryData; +import edu.ie3.datamodel.models.value.load.LoadValues; +import java.util.Map; + +/** + * Data, that is used to build a {@link + * edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry} within a factory + * + * @param Type of load values class + */ +public class LoadProfileData extends FactoryData { + public LoadProfileData(Map fieldsToAttributes, Class targetClass) { + super(fieldsToAttributes, targetClass); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java new file mode 100644 index 000000000..f2b511eef --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -0,0 +1,60 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.timeseries; + +import edu.ie3.datamodel.io.factory.Factory; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; +import edu.ie3.datamodel.models.profile.LoadProfile; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; +import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries; +import edu.ie3.datamodel.models.value.load.LoadValues; +import edu.ie3.util.quantities.PowerSystemUnits; +import java.util.Set; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; + +/** + * Base factory for all {@link LoadProfileTimeSeries}. + * + * @param

    type of load profile + * @param type of load values + */ +public abstract class LoadProfileFactory

    + extends Factory, LoadProfileEntry> { + protected static final String QUARTER_HOUR = "quarterHour"; + + public LoadProfileFactory(Class valueClass) { + super(valueClass); + } + + public abstract LoadProfileTimeSeries build( + LoadProfileMetaInformation metaInformation, Set> entries); + + public abstract P parseProfile(String profile); + + /** + * Calculates the maximum average power consumption per quarter-hour for a given calculated over + * all seasons and weekday types of given load profile + * + * @param loadProfile given load profile + * @param entries with power values + * @return the maximal average power + */ + public abstract ComparableQuantity calculateMaxPower( + P loadProfile, Set> entries); + + /** Returns the quarter-hour field. */ + public String getTimeFieldString() { + return QUARTER_HOUR; + } + + /** Returns the load profile energy scaling. The default value is 1000 kWh */ + public ComparableQuantity getLoadProfileEnergyScaling(P loadProfile) { + return Quantities.getQuantity(1000, PowerSystemUnits.KILOWATTHOUR); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 08d2645d8..ea99d17a3 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -400,10 +400,8 @@ private static String basicInsertQuery(String schemaName, String tableName) { private String basicInsertQueryValuesGrid( String schemaName, String tableName, String[] headerElements) { String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN}; - return basicInsertQuery(schemaName, tableName) - + " " - + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) - + "\nVALUES\n"; + return basicInsertQueryWith( + schemaName, tableName, StringUtils.camelCaseToSnakeCase(headerElements), addParams); } /** @@ -413,16 +411,21 @@ private String basicInsertQueryValuesGrid( private String basicInsertQueryValuesITS( String schemaName, String tableName, String[] headerElements) { String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN, TIME_SERIES}; - return basicInsertQuery(schemaName, tableName) - + " " - + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) - + "\nVALUES\n"; + return basicInsertQueryWith( + schemaName, tableName, StringUtils.camelCaseToSnakeCase(headerElements), addParams); } /** Provides the insert, column names, grid identifier, and the VALUES statement for a query. */ private String basicInsertQueryValuesLPTS( String schemaName, String tableName, String[] headerElements) { String[] addParams = {DbGridMetadata.GRID_UUID_COLUMN, LOAD_PROFILE}; + return basicInsertQueryWith( + schemaName, tableName, StringUtils.camelCaseToSnakeCase(headerElements), addParams); + } + + /** Provides the insert, column names, grid identifier, and the VALUES statement for a query */ + private String basicInsertQueryWith( + String schemaName, String tableName, String[] headerElements, String[] addParams) { return basicInsertQuery(schemaName, tableName) + " " + writeOneLine(StringUtils.camelCaseToSnakeCase(headerElements), addParams) diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index ad372d2fd..7d05bb462 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -96,7 +96,7 @@ private Optional createEntity( new EntityData(fieldToValues, IndividualTimeSeriesMetaInformation.class); return mappingFactory .get(entityData) - .map(meta -> (IndividualTimeSeriesMetaInformation) meta) + .map(IndividualTimeSeriesMetaInformation.class::cast) .getData(); } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index ef254c35e..3de25d9c2 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -28,17 +28,17 @@ public class LoadProfileTimeSeries * The maximum average power consumption per quarter-hour for a given calculated over all seasons * and weekday types of given load profile. */ - public final Optional> maxPower; + public final ComparableQuantity maxPower; /** The profile energy scaling in kWh. */ - public final Optional> profileEnergyScaling; + public final ComparableQuantity profileEnergyScaling; public LoadProfileTimeSeries( UUID uuid, LoadProfile loadProfile, Set> entries, - Optional> maxPower, - Optional> profileEnergyScaling) { + ComparableQuantity maxPower, + ComparableQuantity profileEnergyScaling) { super(uuid, entries); this.loadProfile = loadProfile; this.valueMapping = From b49576e55061666374fde7266ca3269ae761bbb8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 7 Feb 2025 13:52:30 +0100 Subject: [PATCH 246/310] Adapt to changes in `dev`. --- .../timeseries/BdewLoadProfileFactory.java | 27 +++++++++---------- .../timeseries/LoadProfileFactory.java | 2 +- .../repetitive/BdewLoadProfileTimeSeries.java | 14 +++------- .../BdewLoadProfileFactoryTest.groovy | 6 ++--- .../timeseries/TimeSeriesProcessorTest.groovy | 2 +- .../ie3/test/common/TimeSeriesTestData.groovy | 3 ++- 6 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index b2bc2a74d..2d10a0c00 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -15,7 +15,6 @@ import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.*; import java.util.function.Function; import java.util.stream.Stream; @@ -83,9 +82,11 @@ public BdewLoadProfileTimeSeries build( LoadProfileMetaInformation metaInformation, Set> entries) { BdewStandardLoadProfile profile = parseProfile(metaInformation.getProfile()); - Optional> maxPower = calculateMaxPower(profile, entries); + ComparableQuantity maxPower = calculateMaxPower(profile, entries); + ComparableQuantity profileEnergyScaling = getLoadProfileEnergyScaling(profile); - return new BdewLoadProfileTimeSeries(metaInformation.getUuid(), profile, entries, maxPower); + return new BdewLoadProfileTimeSeries( + metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling); } @Override @@ -98,7 +99,7 @@ public BdewStandardLoadProfile parseProfile(String profile) { } @Override - public Optional> calculateMaxPower( + public ComparableQuantity calculateMaxPower( BdewStandardLoadProfile loadProfile, Set> entries) { Function> valueExtractor; @@ -112,16 +113,14 @@ public Optional> calculateMaxPower( } else { valueExtractor = v -> v.values().stream(); } - return entries.stream() - .map(TimeSeriesEntry::getValue) - .flatMap(valueExtractor) - .max(Comparator.naturalOrder()) - .map(p -> Quantities.getQuantity(p, WATT)); - } - @Override - public Optional> getLoadProfileEnergyScaling( - BdewStandardLoadProfile loadProfile) { - return Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR)); + double maxPower = + entries.stream() + .map(TimeSeriesEntry::getValue) + .flatMap(valueExtractor) + .max(Comparator.naturalOrder()) + .orElse(0d); + + return Quantities.getQuantity(maxPower, WATT); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index f2b511eef..eea6e22d2 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -55,6 +55,6 @@ public String getTimeFieldString() { /** Returns the load profile energy scaling. The default value is 1000 kWh */ public ComparableQuantity getLoadProfileEnergyScaling(P loadProfile) { - return Quantities.getQuantity(1000, PowerSystemUnits.KILOWATTHOUR); + return Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR); } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 38edbd08c..524697166 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -7,14 +7,12 @@ import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.UUID; +import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -import tech.units.indriya.quantity.Quantities; /** * Describes a bdew load profile time series with repetitive values that can be calculated from a @@ -26,13 +24,9 @@ public BdewLoadProfileTimeSeries( UUID uuid, BdewStandardLoadProfile loadProfile, Set> values, - Optional> maxPower) { - super( - uuid, - loadProfile, - values, - maxPower, - Optional.of(Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR))); + ComparableQuantity maxPower, + ComparableQuantity profileEnergyScaling) { + super(uuid, loadProfile, values, maxPower, profileEnergyScaling); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy index db4e2849a..8c9c14048 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactoryTest.groovy @@ -148,8 +148,7 @@ class BdewLoadProfileFactoryTest extends Specification { def maxPower = factory.calculateMaxPower(BdewStandardLoadProfile.G0, allEntries) then: - maxPower.isPresent() - maxPower.get() == Quantities.getQuantity(77.7, PowerSystemUnits.WATT) + maxPower == Quantities.getQuantity(77.7, PowerSystemUnits.WATT) } def "A BDEWLoadProfileFactory does return an energy scaling correctly"() { @@ -157,7 +156,6 @@ class BdewLoadProfileFactoryTest extends Specification { def energyScaling = factory.getLoadProfileEnergyScaling(BdewStandardLoadProfile.G0) then: - energyScaling.isPresent() - energyScaling.get() == Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR) + energyScaling == Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy index d7d2ccfd4..d4f045201 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessorTest.groovy @@ -213,7 +213,7 @@ class TimeSeriesProcessorTest extends Specification implements TimeSeriesTestDat def "A TimeSeriesProcessors handles a complete LoadProfileTimeSeries correctly"() { given: - TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues) + TimeSeriesProcessor processor = new TimeSeriesProcessor<>(BdewLoadProfileTimeSeries, LoadProfileEntry, BdewLoadValues) when: Set> actual = processor.handleTimeSeries(loadProfileTimeSeries) diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index 49a39d86c..99925e5ab 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -414,7 +414,8 @@ trait TimeSeriesTestData { new BdewLoadValues(53.5, 44.3, 46.0, 62.8, 56.9, 54.4, 69.2, 63.6, 58.4), 2 ), ] as Set, - Optional.empty() + Quantities.getQuantity(80.6, WATT), + Quantities.getQuantity(1000d, KILOWATTHOUR) ) Set> loadProfileTimeSeriesProcessed = [ From 8ae31c65a8e37496b4677115ebf5ec6ec9011450 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 10 Feb 2025 16:20:15 +0100 Subject: [PATCH 247/310] Adapt to changes in `dev`. --- .../timeseries/RandomLoadProfileFactory.java | 18 +++++++++++------- .../repetitive/LoadProfileTimeSeries.java | 15 +++++++++++---- .../RandomLoadProfileTimeSeries.java | 19 +++++++++---------- .../RandomLoadProfileFactoryTest.groovy | 6 ++---- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 25a94e8f7..8859b0d7a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -14,7 +14,6 @@ import edu.ie3.datamodel.models.value.load.RandomLoadValues; import edu.ie3.util.quantities.PowerSystemUnits; import java.util.List; -import java.util.Optional; import java.util.Set; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; @@ -74,7 +73,13 @@ protected List> getFields(Class entityClass) { @Override public RandomLoadProfileTimeSeries build( LoadProfileMetaInformation metaInformation, Set> entries) { - return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); + RandomLoadProfile profile = RANDOM_LOAD_PROFILE; + + ComparableQuantity maxPower = calculateMaxPower(profile, entries); + ComparableQuantity profileEnergyScaling = getLoadProfileEnergyScaling(profile); + + return new RandomLoadProfileTimeSeries( + metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling); } @Override @@ -83,14 +88,13 @@ public RandomLoadProfile parseProfile(String profile) { } @Override - public Optional> calculateMaxPower( + public ComparableQuantity calculateMaxPower( RandomLoadProfile loadProfile, Set> loadProfileEntries) { - return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); + return Quantities.getQuantity(159d, PowerSystemUnits.WATT); } @Override - public Optional> getLoadProfileEnergyScaling( - RandomLoadProfile loadProfile) { - return Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR)); + public ComparableQuantity getLoadProfileEnergyScaling(RandomLoadProfile loadProfile) { + return Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR); } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index 3de25d9c2..2b20c6b4c 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -9,12 +9,14 @@ import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.load.LoadValues; import edu.ie3.datamodel.utils.TimeSeriesUtils; +import edu.ie3.util.quantities.PowerSystemUnits; import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Collectors; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; +import tech.units.indriya.quantity.Quantities; /** * Describes a load profile time series with repetitive values that can be calculated from a pattern @@ -25,8 +27,8 @@ public class LoadProfileTimeSeries private final Map valueMapping; /** - * The maximum average power consumption per quarter-hour for a given calculated over all seasons - * and weekday types of given load profile. + * The maximum average power consumption per quarter-hour calculated over all seasons and weekday + * types of given load profile. */ public final ComparableQuantity maxPower; @@ -46,8 +48,13 @@ public LoadProfileTimeSeries( .collect( Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); - this.maxPower = maxPower; - this.profileEnergyScaling = profileEnergyScaling; + // use default value is null value is given + this.maxPower = + Optional.ofNullable(maxPower) + .orElseGet(() -> Quantities.getQuantity(0d, PowerSystemUnits.KILOWATT)); + this.profileEnergyScaling = + Optional.ofNullable(profileEnergyScaling) + .orElseGet(() -> Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR)); } /** Returns the {@link LoadProfile}. */ diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index c494112ce..b77fbf065 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -8,12 +8,12 @@ import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.UUID; -import tech.units.indriya.quantity.Quantities; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Describes a random load profile time series based on a {@link @@ -22,13 +22,12 @@ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set> entries) { - super( - uuid, - loadProfile, - entries, - Optional.empty(), - Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR))); + UUID uuid, + LoadProfile loadProfile, + Set> entries, + ComparableQuantity maxPower, + ComparableQuantity profileEnergyScaling) { + super(uuid, loadProfile, entries, maxPower, profileEnergyScaling); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 22cb08121..901a3a3b1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -148,8 +148,7 @@ class RandomLoadProfileFactoryTest extends Specification { def maxPower = factory.calculateMaxPower(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE, allEntries) then: - maxPower.isPresent() - maxPower.get() == Quantities.getQuantity(159d, PowerSystemUnits.WATT) + maxPower == Quantities.getQuantity(159d, PowerSystemUnits.WATT) } def "A RandomLoadProfileFactory does return an energy scaling correctly"() { @@ -157,7 +156,6 @@ class RandomLoadProfileFactoryTest extends Specification { def energyScaling = factory.getLoadProfileEnergyScaling(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE) then: - energyScaling.isPresent() - energyScaling.get() == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) + energyScaling == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) } } From db174c29acff85dbcc8cb5494810c6c867e808f6 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 12 Feb 2025 09:21:11 +0100 Subject: [PATCH 248/310] Fixing `sonarqube` issues. --- .../io/factory/timeseries/RandomLoadProfileFactory.java | 3 ++- .../ie3/datamodel/models/value/load/RandomLoadValues.java | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 8859b0d7a..98cc0d749 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.timeseries; import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; @@ -90,7 +91,7 @@ public RandomLoadProfile parseProfile(String profile) { @Override public ComparableQuantity calculateMaxPower( RandomLoadProfile loadProfile, Set> loadProfileEntries) { - return Quantities.getQuantity(159d, PowerSystemUnits.WATT); + return Quantities.getQuantity(159d, WATT); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java index d5d399301..3e9684e56 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -51,9 +51,9 @@ public class RandomLoadValues implements LoadValues { /** Scale parameter for a working day */ private final double sigmaWd; - private final GeneralizedExtremeValueDistribution gevWd; - private final GeneralizedExtremeValueDistribution gevSa; - private final GeneralizedExtremeValueDistribution gevSu; + private final transient GeneralizedExtremeValueDistribution gevWd; + private final transient GeneralizedExtremeValueDistribution gevSa; + private final transient GeneralizedExtremeValueDistribution gevSu; /** * @param kSa Shape parameter for a Saturday From 7c1078e121fdb753ab5bb7f1d5bb058648c8ab96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 08:35:33 +0000 Subject: [PATCH 249/310] Bump com.github.spotbugs from 6.1.3 to 6.1.4 (#1236) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c70b1bbec..47c3bc849 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '7.0.2' //code format - id 'com.github.spotbugs' version '6.1.3' // code check, working on byte code + id 'com.github.spotbugs' version '6.1.4' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From 4b0f4a4bde859be496337084a313b92bcd7bbfc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2025 08:43:58 +0000 Subject: [PATCH 250/310] Bump com.couchbase.client:java-client from 3.7.7 to 3.7.8 (#1239) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 47c3bc849..5ab8074e1 100644 --- a/build.gradle +++ b/build.gradle @@ -90,7 +90,7 @@ dependencies { // Databases implementation 'org.influxdb:influxdb-java:2.24' - implementation 'com.couchbase.client:java-client:3.7.7' + implementation 'com.couchbase.client:java-client:3.7.8' runtimeOnly 'org.postgresql:postgresql:42.7.5' // postgresql jdbc driver required during runtime implementation 'commons-io:commons-io:2.18.0' // I/O functionalities From 560cc77c8e281e0bcff70c15da94734ad12c67b8 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 14 Feb 2025 14:13:40 +0100 Subject: [PATCH 251/310] Adapting to changes in `dev`. --- .../timeseries/BdewLoadProfileFactory.java | 1 - .../timeseries/RandomLoadProfileFactory.java | 19 ++++++++++++------- .../timeseries/TimeSeriesProcessor.java | 1 + .../io/source/LoadProfileSource.java | 4 ++-- .../io/source/csv/CsvLoadProfileSource.java | 4 ++-- .../io/source/sql/SqlLoadProfileSource.java | 4 ++-- .../RandomLoadProfileTimeSeries.java | 19 +++++++++---------- .../models/value/load/RandomLoadValues.java | 6 +++--- .../RandomLoadProfileFactoryTest.groovy | 6 ++---- .../io/processor/ProcessorProviderTest.groovy | 2 ++ 10 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 1c865b948..2d10a0c00 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -15,7 +15,6 @@ import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries; import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry; import edu.ie3.datamodel.models.value.load.BdewLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.*; import java.util.function.Function; import java.util.stream.Stream; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 25a94e8f7..98cc0d749 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.factory.timeseries; import static edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE; +import static tech.units.indriya.unit.Units.WATT; import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation; import edu.ie3.datamodel.models.profile.LoadProfile.RandomLoadProfile; @@ -14,7 +15,6 @@ import edu.ie3.datamodel.models.value.load.RandomLoadValues; import edu.ie3.util.quantities.PowerSystemUnits; import java.util.List; -import java.util.Optional; import java.util.Set; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; @@ -74,7 +74,13 @@ protected List> getFields(Class entityClass) { @Override public RandomLoadProfileTimeSeries build( LoadProfileMetaInformation metaInformation, Set> entries) { - return new RandomLoadProfileTimeSeries(metaInformation.getUuid(), RANDOM_LOAD_PROFILE, entries); + RandomLoadProfile profile = RANDOM_LOAD_PROFILE; + + ComparableQuantity maxPower = calculateMaxPower(profile, entries); + ComparableQuantity profileEnergyScaling = getLoadProfileEnergyScaling(profile); + + return new RandomLoadProfileTimeSeries( + metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling); } @Override @@ -83,14 +89,13 @@ public RandomLoadProfile parseProfile(String profile) { } @Override - public Optional> calculateMaxPower( + public ComparableQuantity calculateMaxPower( RandomLoadProfile loadProfile, Set> loadProfileEntries) { - return Optional.of(Quantities.getQuantity(159d, PowerSystemUnits.WATT)); + return Quantities.getQuantity(159d, WATT); } @Override - public Optional> getLoadProfileEnergyScaling( - RandomLoadProfile loadProfile) { - return Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR)); + public ComparableQuantity getLoadProfileEnergyScaling(RandomLoadProfile loadProfile) { + return Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java index 63f3a0990..d536bbb02 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/timeseries/TimeSeriesProcessor.java @@ -16,6 +16,7 @@ import edu.ie3.datamodel.models.timeseries.repetitive.*; import edu.ie3.datamodel.models.value.*; import edu.ie3.datamodel.models.value.load.BdewLoadValues; +import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index 60e30dd4e..be767995e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -83,10 +83,10 @@ protected Try, FactoryException> createEntries( public abstract P getLoadProfile(); /** Returns the maximal power value of the time series */ - public abstract Optional> getMaxPower(); + public abstract ComparableQuantity getMaxPower(); /** Returns the load profile energy scaling for this load profile time series. */ - public abstract Optional> getLoadProfileEnergyScaling(); + public abstract ComparableQuantity getLoadProfileEnergyScaling(); /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 278eb7a8e..b96e8ee21 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -83,12 +83,12 @@ public P getLoadProfile() { } @Override - public Optional> getMaxPower() { + public ComparableQuantity getMaxPower() { return loadProfileTimeSeries.maxPower; } @Override - public Optional> getLoadProfileEnergyScaling() { + public ComparableQuantity getLoadProfileEnergyScaling() { return loadProfileTimeSeries.profileEnergyScaling; } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index df85a139e..193272e33 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -126,12 +126,12 @@ public P getLoadProfile() { } @Override - public Optional> getMaxPower() { + public ComparableQuantity getMaxPower() { return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); } @Override - public Optional> getLoadProfileEnergyScaling() { + public ComparableQuantity getLoadProfileEnergyScaling() { return entryFactory.getLoadProfileEnergyScaling(loadProfile); } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index c494112ce..b77fbf065 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -8,12 +8,12 @@ import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; -import edu.ie3.util.quantities.PowerSystemUnits; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.UUID; -import tech.units.indriya.quantity.Quantities; +import javax.measure.quantity.Energy; +import javax.measure.quantity.Power; +import tech.units.indriya.ComparableQuantity; /** * Describes a random load profile time series based on a {@link @@ -22,13 +22,12 @@ public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( - UUID uuid, LoadProfile loadProfile, Set> entries) { - super( - uuid, - loadProfile, - entries, - Optional.empty(), - Optional.of(Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR))); + UUID uuid, + LoadProfile loadProfile, + Set> entries, + ComparableQuantity maxPower, + ComparableQuantity profileEnergyScaling) { + super(uuid, loadProfile, entries, maxPower, profileEnergyScaling); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java index d5d399301..3e9684e56 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -51,9 +51,9 @@ public class RandomLoadValues implements LoadValues { /** Scale parameter for a working day */ private final double sigmaWd; - private final GeneralizedExtremeValueDistribution gevWd; - private final GeneralizedExtremeValueDistribution gevSa; - private final GeneralizedExtremeValueDistribution gevSu; + private final transient GeneralizedExtremeValueDistribution gevWd; + private final transient GeneralizedExtremeValueDistribution gevSa; + private final transient GeneralizedExtremeValueDistribution gevSu; /** * @param kSa Shape parameter for a Saturday diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy index 22cb08121..901a3a3b1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactoryTest.groovy @@ -148,8 +148,7 @@ class RandomLoadProfileFactoryTest extends Specification { def maxPower = factory.calculateMaxPower(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE, allEntries) then: - maxPower.isPresent() - maxPower.get() == Quantities.getQuantity(159d, PowerSystemUnits.WATT) + maxPower == Quantities.getQuantity(159d, PowerSystemUnits.WATT) } def "A RandomLoadProfileFactory does return an energy scaling correctly"() { @@ -157,7 +156,6 @@ class RandomLoadProfileFactoryTest extends Specification { def energyScaling = factory.getLoadProfileEnergyScaling(LoadProfile.RandomLoadProfile.RANDOM_LOAD_PROFILE) then: - energyScaling.isPresent() - energyScaling.get() == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) + energyScaling == Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index f40e246eb..7d63bcfae 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -42,8 +42,10 @@ import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.timeseries.repetitive.BdewLoadProfileTimeSeries import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry +import edu.ie3.datamodel.models.timeseries.repetitive.RandomLoadProfileTimeSeries import edu.ie3.datamodel.models.value.* import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.datamodel.models.value.load.RandomLoadValues import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.TimeSeriesTestData import edu.ie3.util.TimeUtil From 3ca5a4bbfed78db9b01cfe9d3a02c204b0a7b1e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:45:50 +0000 Subject: [PATCH 252/310] Bump com.github.spotbugs from 6.1.4 to 6.1.5 (#1241) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5ab8074e1..1188c5055 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '7.0.2' //code format - id 'com.github.spotbugs' version '6.1.4' // code check, working on byte code + id 'com.github.spotbugs' version '6.1.5' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From df44543dd7f0d7b51b8a07d794bd8d0738b79923 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:52:19 +0000 Subject: [PATCH 253/310] Bump myst-parser from 4.0.0 to 4.0.1 in /docs/readthedocs (#1240) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index a22c632a5..5276d296a 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -2,5 +2,5 @@ commonmark==0.9.1 recommonmark==0.7.1 Sphinx==8.1.3 sphinx-rtd-theme==3.0.2 -myst-parser==4.0.0 +myst-parser==4.0.1 markdown-it-py==3.0.0 From 4a4e4d196251f7767d0caef4ded227de17acef85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:03:44 +0000 Subject: [PATCH 254/310] Bump net.bytebuddy:byte-buddy from 1.17.0 to 1.17.1 (#1242) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1188c5055..95cff35db 100644 --- a/build.gradle +++ b/build.gradle @@ -73,7 +73,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters - testImplementation 'net.bytebuddy:byte-buddy:1.17.0' // Mocks of classes + testImplementation 'net.bytebuddy:byte-buddy:1.17.1' // Mocks of classes // testcontainers (docker framework for testing) testImplementation "org.testcontainers:testcontainers:$testcontainersVersion" From 6324db8a60fe753df86f050a8a3a6da872041978 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Mon, 17 Feb 2025 16:10:15 +0100 Subject: [PATCH 255/310] Reduce duplicate lines. --- .../RandomLoadProfileTimeSeries.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index b77fbf065..de9142fd9 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -8,7 +8,6 @@ import de.lmu.ifi.dbs.elki.math.statistics.distribution.GeneralizedExtremeValueDistribution; import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; -import java.util.Objects; import java.util.Set; import java.util.UUID; import javax.measure.quantity.Energy; @@ -35,27 +34,8 @@ public LoadProfile.RandomLoadProfile getLoadProfile() { return (LoadProfile.RandomLoadProfile) super.getLoadProfile(); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - return super.equals(o); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode()); - } - @Override public String toString() { - return "RandomLoadProfileTimeSeries{" - + "uuid=" - + getUuid() - + "loadProfile=" - + getLoadProfile() - + ", valueMapping=" - + getValueMapping() - + '}'; + return "Random" + super.toString(); } } From 2004653a0c503a83690379eaa94608ac9743e657 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 18 Feb 2025 14:04:21 +0100 Subject: [PATCH 256/310] Addressing reviewer's comments. --- .../repetitive/LoadProfileTimeSeries.java | 28 +++++++++++-------- .../models/value/load/RandomLoadValues.java | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index 2b20c6b4c..c024e4efc 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -9,14 +9,12 @@ import edu.ie3.datamodel.models.value.PValue; import edu.ie3.datamodel.models.value.load.LoadValues; import edu.ie3.datamodel.utils.TimeSeriesUtils; -import edu.ie3.util.quantities.PowerSystemUnits; import java.time.ZonedDateTime; import java.util.*; import java.util.stream.Collectors; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -import tech.units.indriya.quantity.Quantities; /** * Describes a load profile time series with repetitive values that can be calculated from a pattern @@ -30,10 +28,10 @@ public class LoadProfileTimeSeries * The maximum average power consumption per quarter-hour calculated over all seasons and weekday * types of given load profile. */ - public final ComparableQuantity maxPower; + private final ComparableQuantity maxPower; /** The profile energy scaling in kWh. */ - public final ComparableQuantity profileEnergyScaling; + private final ComparableQuantity profileEnergyScaling; public LoadProfileTimeSeries( UUID uuid, @@ -48,13 +46,21 @@ public LoadProfileTimeSeries( .collect( Collectors.toMap(LoadProfileEntry::getQuarterHour, LoadProfileEntry::getValue)); - // use default value is null value is given - this.maxPower = - Optional.ofNullable(maxPower) - .orElseGet(() -> Quantities.getQuantity(0d, PowerSystemUnits.KILOWATT)); - this.profileEnergyScaling = - Optional.ofNullable(profileEnergyScaling) - .orElseGet(() -> Quantities.getQuantity(1000d, PowerSystemUnits.KILOWATTHOUR)); + this.maxPower = maxPower; + this.profileEnergyScaling = profileEnergyScaling; + } + + /** + * Returns the maximum average power consumption per quarter-hour calculated over all seasons and + * weekday types of given load profile in Watt. + */ + public Optional> maxPower() { + return Optional.ofNullable(maxPower); + } + + /** Returns the profile energy scaling in kWh. */ + public Optional> loadProfileScaling() { + return Optional.ofNullable(profileEnergyScaling); } /** Returns the {@link LoadProfile}. */ diff --git a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java index 3e9684e56..01f1f2c1b 100644 --- a/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java +++ b/src/main/java/edu/ie3/datamodel/models/value/load/RandomLoadValues.java @@ -1,5 +1,5 @@ /* - * © 2024. TU Dortmund University, + * © 2021. TU Dortmund University, * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ From 306a43a4d66161af909c2d2c8933039af75aa8bd Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 18 Feb 2025 14:22:48 +0100 Subject: [PATCH 257/310] Adding explanation for values in `RandomLoadProfileFactory`. --- .../timeseries/RandomLoadProfileFactory.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 98cc0d749..440639388 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -88,12 +88,28 @@ public RandomLoadProfile parseProfile(String profile) { return RANDOM_LOAD_PROFILE; } + /** + * This is the 95 % quantile resulting from 10,000 evaluations of the year 2019. It is only + * needed, when the load is meant to be scaled to rated active power. + * + * @return Reference active power to use for later model calculations + */ @Override public ComparableQuantity calculateMaxPower( RandomLoadProfile loadProfile, Set> loadProfileEntries) { return Quantities.getQuantity(159d, WATT); } + /** + * Returns the profile energy scaling factor, the random profile is scaled to. + * + *

    It is said in 'Kays - Agent-based simulation environment for improving the planning of + * distribution grids', that the Generalized Extreme Value distribution's parameters are sampled + * from input data, that is normalized to 1,000 kWh annual energy consumption. However, due to + * inaccuracies in random data reproduction, the sampled values will lead to an average annual + * energy consumption of approx. this value. It has been found by 1,000 evaluations of the year + * 2019. + */ @Override public ComparableQuantity getLoadProfileEnergyScaling(RandomLoadProfile loadProfile) { return Quantities.getQuantity(716.5416966513656, PowerSystemUnits.KILOWATTHOUR); From d9857bd3a3bd98621f37d8ab05c86e9418097680 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Wed, 19 Feb 2025 13:52:55 +0100 Subject: [PATCH 258/310] Fixed example in ReadTheDocs --- CHANGELOG.md | 1 + docs/readthedocs/models/input/operator.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aed99080..b35da38c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) +- Fixed example in ReadTheDocs [#1244](https://github.com/ie3-institute/PowerSystemDataModel/issues/1244) ### Changed - Storage minimum level parameter removed from cylindrical thermal storage [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1123) diff --git a/docs/readthedocs/models/input/operator.md b/docs/readthedocs/models/input/operator.md index 1674de745..b0d0dac63 100644 --- a/docs/readthedocs/models/input/operator.md +++ b/docs/readthedocs/models/input/operator.md @@ -36,7 +36,7 @@ having control over one or more physical entitites. OperatorInput profBroccoli = new OperatorInput( UUID.fromString("f15105c4-a2de-4ab8-a621-4bc98e372d92"), - "Univ.-Prof. Dr. rer. hort. Klaus-Dieter Brokkoli" + "Univ.-Prof. Dr. rer. hort. Klaus-Dieter Broccoli" ) ``` From 7606ecc626bfb9d1d27c356ad9281b3bc96f9b7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:36:08 +0000 Subject: [PATCH 259/310] Bump sphinx from 8.1.3 to 8.2.0 in /docs/readthedocs (#1247) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index 5276d296a..257fa67e1 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 -Sphinx==8.1.3 +Sphinx==8.2.0 sphinx-rtd-theme==3.0.2 myst-parser==4.0.1 markdown-it-py==3.0.0 From 8c73ded10dda10b75233e2406f862c08bb96eec6 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 20 Feb 2025 16:58:54 +0100 Subject: [PATCH 260/310] fix wording in docs --- docs/readthedocs/models/input/thermal/cylindricalstorage.md | 2 +- .../readthedocs/models/input/thermal/domestichotwaterstorage.md | 2 +- .../readthedocs/models/result/participant/cylindricalstorage.md | 2 +- .../models/result/participant/domestichotwaterstorage.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 7ae0994da..5da1828df 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -2,7 +2,7 @@ # Cylindrical Thermal Storage -Model of a cylindrical thermal storage using a fluent to store thermal energy. +Model of a cylindrical thermal storage using a fluid to store thermal energy. ## Attributes, Units and Remarks diff --git a/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md b/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md index 81b84879c..4b675451a 100644 --- a/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md +++ b/docs/readthedocs/models/input/thermal/domestichotwaterstorage.md @@ -2,7 +2,7 @@ # Domestic Hot Water Storage -Model of a domestic hot water storage using a fluent to store thermal energy. +Model of a domestic hot water storage using a fluid to store thermal energy. ## Attributes, Units and Remarks diff --git a/docs/readthedocs/models/result/participant/cylindricalstorage.md b/docs/readthedocs/models/result/participant/cylindricalstorage.md index b8a83dbf7..9fe8c5df5 100644 --- a/docs/readthedocs/models/result/participant/cylindricalstorage.md +++ b/docs/readthedocs/models/result/participant/cylindricalstorage.md @@ -2,7 +2,7 @@ # Cylindrical Thermal Storage -Result of a cylindrical thermal storage using a fluent to store thermal energy. +Result of a cylindrical thermal storage using a fluid to store thermal energy. ## Attributes, Units and Remarks diff --git a/docs/readthedocs/models/result/participant/domestichotwaterstorage.md b/docs/readthedocs/models/result/participant/domestichotwaterstorage.md index 122841944..f0cefcd59 100644 --- a/docs/readthedocs/models/result/participant/domestichotwaterstorage.md +++ b/docs/readthedocs/models/result/participant/domestichotwaterstorage.md @@ -2,7 +2,7 @@ # Domestic Hot Water Storage -Result of a domestic hot water storage using a fluent to store thermal energy. +Result of a domestic hot water storage using a fluid to store thermal energy. ## Attributes, Units and Remarks From d8515fcd36bf51e124036d3419fd154889e74cf6 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 20 Feb 2025 17:13:12 +0100 Subject: [PATCH 261/310] remove redundant methods that are already in superior class --- .../thermal/DomesticHotWaterStorageInput.java | 61 ------------------- 1 file changed, 61 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 35c827b3f..044b2a89e 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -115,66 +115,5 @@ public static class DomesticHotWaterStorageInputCopyBuilder public DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); } - - @Override - public DomesticHotWaterStorageInputCopyBuilder storageVolumeLvl( - ComparableQuantity storageVolumeLvl) { - this.storageVolumeLvl = storageVolumeLvl; - return this; - } - - @Override - public DomesticHotWaterStorageInputCopyBuilder inletTemp( - ComparableQuantity inletTemp) { - this.inletTemp = inletTemp; - return this; - } - - @Override - public DomesticHotWaterStorageInputCopyBuilder returnTemp( - ComparableQuantity returnTemp) { - this.returnTemp = returnTemp; - return this; - } - - @Override - public DomesticHotWaterStorageInputCopyBuilder c(ComparableQuantity c) { - this.c = c; - return this; - } - - @Override - public DomesticHotWaterStorageInputCopyBuilder pThermalMax( - ComparableQuantity pThermalMax) { - this.pThermalMax = pThermalMax; - return this; - } - - @Override - public DomesticHotWaterStorageInputCopyBuilder scale(Double factor) { - storageVolumeLvl(this.storageVolumeLvl.multiply(factor)); - pThermalMax(this.pThermalMax.multiply(factor)); - return this; - } - - @Override - public DomesticHotWaterStorageInput build() { - return new DomesticHotWaterStorageInput( - getUuid(), - getId(), - getOperator(), - getOperationTime(), - getThermalBus(), - this.storageVolumeLvl, - this.inletTemp, - this.returnTemp, - this.c, - this.pThermalMax); - } - - @Override - protected DomesticHotWaterStorageInputCopyBuilder thisInstance() { - return this; - } } } From eef015a9159cafd559bfa85ab95028a8f31b3449 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Thu, 20 Feb 2025 17:14:46 +0100 Subject: [PATCH 262/310] introduced AbstractThermalStorageInputFactory and make factories of cylindrical and domestic storage extending it --- .../AbstractThermalStorageInputFactory.java | 54 +++++++++++++++++++ .../input/CylindricalStorageInputFactory.java | 39 +++----------- .../DomesticHotWaterStorageInputFactory.java | 39 +++----------- 3 files changed, 68 insertions(+), 64 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java new file mode 100644 index 000000000..3686c3abe --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java @@ -0,0 +1,54 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.input; + +import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.AssetInput; +import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; +import javax.measure.quantity.Power; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Volume; +import tech.units.indriya.ComparableQuantity; + +public abstract class AbstractThermalStorageInputFactory +extends AssetInputEntityFactory { + + private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; + private static final String INLET_TEMP = "inletTemp"; + private static final String RETURN_TEMP = "returnTemp"; + private static final String C = "c"; + private static final String P_THERMAL_MAX = "pThermalMax"; + + public AbstractThermalStorageInputFactory(Class clazz) { + super(clazz); + } + + @Override + protected String[] getAdditionalFields() { + return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX}; + } + + protected ComparableQuantity getStorageVolumeLvl(ThermalUnitInputEntityData data) { + return data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); + } + + protected ComparableQuantity getInletTemp(ThermalUnitInputEntityData data) { + return data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); + } + + protected ComparableQuantity getReturnTemp(ThermalUnitInputEntityData data) { + return data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); + } + + protected ComparableQuantity getSpecificHeatCapacity( + ThermalUnitInputEntityData data) { + return data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); + } + + protected ComparableQuantity getMaxThermalPower(ThermalUnitInputEntityData data) { + return data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 0e1b7d9f8..541aa7f56 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -6,34 +6,18 @@ package edu.ie3.datamodel.io.factory.input; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; import java.util.UUID; -import javax.measure.quantity.Power; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Volume; -import tech.units.indriya.ComparableQuantity; public class CylindricalStorageInputFactory - extends AssetInputEntityFactory { - private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; - private static final String INLET_TEMP = "inletTemp"; - private static final String RETURN_TEMP = "returnTemp"; - private static final String C = "c"; - private static final String P_THERMAL_MAX = "pThermalMax"; + extends AbstractThermalStorageInputFactory { public CylindricalStorageInputFactory() { super(CylindricalStorageInput.class); } - @Override - protected String[] getAdditionalFields() { - return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX}; - } - @Override protected CylindricalStorageInput buildModel( ThermalUnitInputEntityData data, @@ -41,27 +25,18 @@ protected CylindricalStorageInput buildModel( String id, OperatorInput operator, OperationTime operationTime) { + final ThermalBusInput bus = data.getBusInput(); - final ComparableQuantity storageVolumeLvl = - data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); - final ComparableQuantity inletTemp = - data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); - final ComparableQuantity returnTemp = - data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); - final ComparableQuantity c = - data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); - final ComparableQuantity pThermalMax = - data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); return new CylindricalStorageInput( uuid, id, operator, operationTime, bus, - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); + getStorageVolumeLvl(data), + getInletTemp(data), + getReturnTemp(data), + getSpecificHeatCapacity(data), + getMaxThermalPower(data)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java index 442e1903c..b59ed35bb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/DomesticHotWaterStorageInputFactory.java @@ -6,34 +6,18 @@ package edu.ie3.datamodel.io.factory.input; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.thermal.DomesticHotWaterStorageInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; import java.util.UUID; -import javax.measure.quantity.Power; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Volume; -import tech.units.indriya.ComparableQuantity; public class DomesticHotWaterStorageInputFactory - extends AssetInputEntityFactory { - private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; - private static final String INLET_TEMP = "inletTemp"; - private static final String RETURN_TEMP = "returnTemp"; - private static final String C = "c"; - private static final String P_THERMAL_MAX = "pThermalMax"; + extends AbstractThermalStorageInputFactory { public DomesticHotWaterStorageInputFactory() { super(DomesticHotWaterStorageInput.class); } - @Override - protected String[] getAdditionalFields() { - return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX}; - } - @Override protected DomesticHotWaterStorageInput buildModel( ThermalUnitInputEntityData data, @@ -41,27 +25,18 @@ protected DomesticHotWaterStorageInput buildModel( String id, OperatorInput operator, OperationTime operationTime) { + final ThermalBusInput bus = data.getBusInput(); - final ComparableQuantity storageVolumeLvl = - data.getQuantity(STORAGE_VOLUME_LVL, StandardUnits.VOLUME); - final ComparableQuantity inletTemp = - data.getQuantity(INLET_TEMP, StandardUnits.TEMPERATURE); - final ComparableQuantity returnTemp = - data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); - final ComparableQuantity c = - data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); - final ComparableQuantity pThermalMax = - data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); return new DomesticHotWaterStorageInput( uuid, id, operator, operationTime, bus, - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); + getStorageVolumeLvl(data), + getInletTemp(data), + getReturnTemp(data), + getSpecificHeatCapacity(data), + getMaxThermalPower(data)); } } From b74c37ddcc7816d992aad6f5e8e95a7f0cce8e70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:37:44 +0000 Subject: [PATCH 263/310] Bump testcontainersVersion from 1.20.4 to 1.20.5 (#1248) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 609d0872c..4ec934847 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ ext { javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" groovyBinaryVersion = "4.0.25" - testcontainersVersion = '1.20.4' + testcontainersVersion = '1.20.5' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins } From d9e37fb5836ed08ce2ee0a70f24e02dfec52a0bf Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 09:16:04 +0100 Subject: [PATCH 264/310] make inputs private again in CylindricalStorageInput --- .../input/thermal/CylindricalStorageInput.java | 12 ++++++------ .../input/thermal/DomesticHotWaterStorageInput.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 125fdf6e6..e51d1efbc 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -163,13 +163,13 @@ public String toString() { public static class CylindricalStorageInputCopyBuilder extends ThermalStorageInputCopyBuilder { - ComparableQuantity storageVolumeLvl; - ComparableQuantity inletTemp; - ComparableQuantity returnTemp; - ComparableQuantity c; - ComparableQuantity pThermalMax; + private ComparableQuantity storageVolumeLvl; + private ComparableQuantity inletTemp; + private ComparableQuantity returnTemp; + private ComparableQuantity c; + private ComparableQuantity pThermalMax; - CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { + protected CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); this.storageVolumeLvl = entity.getStorageVolumeLvl(); this.inletTemp = entity.getInletTemp(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 044b2a89e..64866069d 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -112,7 +112,7 @@ public String toString() { public static class DomesticHotWaterStorageInputCopyBuilder extends CylindricalStorageInputCopyBuilder { - public DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { + protected DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); } } From 2023385faed916a913807041d9e8b4e9b41669c2 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 09:16:34 +0100 Subject: [PATCH 265/310] split both storages in ThermalValidationUtils --- .../utils/validation/ThermalValidationUtils.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java index cbd63a98a..72ddf489f 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java @@ -14,7 +14,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.stream.Stream; import javax.measure.Quantity; public class ThermalValidationUtils extends ValidationUtils { @@ -88,12 +87,13 @@ private ThermalValidationUtils() { exceptions.addAll(checkThermalHouse(house)); } - // Validate storages - for (ThermalStorageInput storage : - Stream.concat( - thermalGrid.heatStorages().stream(), - thermalGrid.domesticHotWaterStorages().stream()) - .toList()) { + // Validate heat storages + for (ThermalStorageInput storage : thermalGrid.heatStorages()) { + exceptions.addAll(check(storage)); + } + + // Validate domestic hot water storages + for (ThermalStorageInput storage : thermalGrid.domesticHotWaterStorages()) { exceptions.addAll(check(storage)); } From e0a719dddace17365f47a8f05d0d8f8963735a81 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 09:18:13 +0100 Subject: [PATCH 266/310] avoiding concat for getThermalStorages --- .../java/edu/ie3/datamodel/io/source/ThermalSource.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 07f56a611..0b9b2feb0 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -11,6 +11,7 @@ import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.thermal.*; import edu.ie3.datamodel.utils.Try; +import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -125,7 +126,8 @@ public Map getThermalBuses(Map opera * @return a map of UUID to object- and uuid-unique {@link ThermalStorageInput} entities */ public Map getThermalStorages() throws SourceException { - return Stream.concat(getCylindricalStorages().stream(), getDomesticHotWaterStorages().stream()) + return Stream.of(getCylindricalStorages(), getDomesticHotWaterStorages()) + .flatMap(Collection::stream) .collect(Collectors.toMap(ThermalStorageInput::getUuid, storage -> storage)); } @@ -151,9 +153,8 @@ public Map getThermalStorages() throws SourceExceptio public Map getThermalStorages( Map operators, Map thermalBuses) throws SourceException { - return Stream.concat( - getCylindricalStorages(operators, thermalBuses).stream(), - getDomesticHotWaterStorages(operators, thermalBuses).stream()) + return Stream.of(getCylindricalStorages(), getDomesticHotWaterStorages()) + .flatMap(Collection::stream) .collect(Collectors.toMap(ThermalStorageInput::getUuid, storage -> storage)); } From 52dd01c7afffcd24b9cf47d6aa48a46703e0ae7d Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 09:18:21 +0100 Subject: [PATCH 267/310] fmt --- .../io/factory/input/AbstractThermalStorageInputFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java index 3686c3abe..f286217c7 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/AbstractThermalStorageInputFactory.java @@ -14,7 +14,7 @@ import tech.units.indriya.ComparableQuantity; public abstract class AbstractThermalStorageInputFactory -extends AssetInputEntityFactory { + extends AssetInputEntityFactory { private static final String STORAGE_VOLUME_LVL = "storageVolumeLvl"; private static final String INLET_TEMP = "inletTemp"; From aa05e6f2736b70d68cb6aed014416d32bc9eb129 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 09:20:30 +0100 Subject: [PATCH 268/310] use specific methods for thermal storages in CsvThermalGridSource --- .../io/source/csv/CsvThermalGridSource.java | 15 +++++---------- src/main/java/edu/ie3/datamodel/utils/Try.java | 3 ++- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java index 8673875e1..85b151635 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java @@ -14,10 +14,7 @@ import edu.ie3.datamodel.io.source.TypeSource; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.container.ThermalGrid; -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; -import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; -import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; -import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput; +import edu.ie3.datamodel.models.input.thermal.*; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.util.*; @@ -70,13 +67,11 @@ public static List read( Try, SourceException> houses = Try.of( () -> thermalSource.getThermalHouses(operators, buses).values(), SourceException.class); - Try, SourceException> heatStorages = + Try, SourceException> heatStorages = + Try.of(() -> thermalSource.getCylindricalStorages(operators, buses), SourceException.class); + Try, SourceException> waterStorages = Try.of( - () -> thermalSource.getThermalStorages(operators, buses).values(), - SourceException.class); - Try, SourceException> waterStorages = - Try.of( - () -> thermalSource.getThermalStorages(operators, buses).values(), + () -> thermalSource.getDomesticHotWaterStorages(operators, buses), SourceException.class); List exceptions = Try.getExceptions(houses, heatStorages, waterStorages); diff --git a/src/main/java/edu/ie3/datamodel/utils/Try.java b/src/main/java/edu/ie3/datamodel/utils/Try.java index ffe006407..495a8eef8 100644 --- a/src/main/java/edu/ie3/datamodel/utils/Try.java +++ b/src/main/java/edu/ie3/datamodel/utils/Try.java @@ -8,6 +8,7 @@ import static java.util.stream.Collectors.partitioningBy; import edu.ie3.datamodel.exceptions.FailureException; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.TryException; import java.util.*; import java.util.function.BiFunction; @@ -638,7 +639,7 @@ public int hashCode() { */ @FunctionalInterface public interface TrySupplier { - T get() throws E; + T get() throws E, SourceException; } /** From df5abb25b420c8696b37a3b40c0781d8b831becb Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 09:33:55 +0100 Subject: [PATCH 269/310] update comment --- .../edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java index 85b151635..03e647c55 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvThermalGridSource.java @@ -63,7 +63,6 @@ public static List read( Map operators = typeSource.getOperators(); Map buses = thermalSource.getThermalBuses(); - // calling Map.values() because we want to map the inputs to their thermal bus Try, SourceException> houses = Try.of( () -> thermalSource.getThermalHouses(operators, buses).values(), SourceException.class); From d38ded08afc7d0473123ff0af3e4e01eb763f2b9 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 10:01:02 +0100 Subject: [PATCH 270/310] split into AbstractThermalStorageInput --- .../thermal/AbstractThermalStorageInput.java | 221 ++++++++++++++++++ .../thermal/CylindricalStorageInput.java | 181 ++------------ .../thermal/DomesticHotWaterStorageInput.java | 35 +-- 3 files changed, 239 insertions(+), 198 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java new file mode 100644 index 000000000..940717377 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java @@ -0,0 +1,221 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.thermal; + +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; +import java.util.Objects; +import java.util.UUID; +import javax.measure.quantity.Power; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Volume; +import tech.units.indriya.ComparableQuantity; + +public abstract class AbstractThermalStorageInput extends ThermalStorageInput { + + /** + * @param uuid Unique identifier of a cylindrical storage + * @param id Identifier of the thermal unit + * @param operator operator of the asset + * @param operationTime operation time of the asset + * @param bus Thermal bus, a thermal unit is connected to /** Available storage volume (typically + * in m³) + */ + private final ComparableQuantity storageVolumeLvl; + /** Temperature of the inlet (typically in C) */ + private final ComparableQuantity inletTemp; + /** Temperature of the outlet (typically in C) */ + private final ComparableQuantity returnTemp; + /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ + private final ComparableQuantity c; + /** Maximum permissible thermal power (typically in kW) */ + private final ComparableQuantity pThermalMax; + + AbstractThermalStorageInput( + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime, + ThermalBusInput bus, + ComparableQuantity storageVolumeLvl, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(uuid, id, operator, operationTime, bus); + this.storageVolumeLvl = storageVolumeLvl; + this.inletTemp = inletTemp; + this.returnTemp = returnTemp; + this.c = c; + this.pThermalMax = pThermalMax; + } + + AbstractThermalStorageInput( + UUID uuid, + String id, + ThermalBusInput bus, + ComparableQuantity storageVolumeLvl, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(uuid, id, bus); + this.storageVolumeLvl = storageVolumeLvl; + this.inletTemp = inletTemp; + this.returnTemp = returnTemp; + this.c = c; + this.pThermalMax = pThermalMax; + } + + public ComparableQuantity getStorageVolumeLvl() { + return storageVolumeLvl; + } + + public ComparableQuantity getInletTemp() { + return inletTemp; + } + + public ComparableQuantity getReturnTemp() { + return returnTemp; + } + + public ComparableQuantity getC() { + return c; + } + + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + + @Override + public AbstractThermalStorageInputCopyBuilder copy() { + return new AbstractThermalStorageInputCopyBuilder(this); + } + + /** + * A builder pattern based approach to create copies of {@link AbstractThermalStorageInput} + * entities with altered field values. For detailed field descriptions refer to java docs of + * {@link AbstractThermalStorageInput} + */ + public static class AbstractThermalStorageInputCopyBuilder + extends ThermalStorageInputCopyBuilder { + + private ComparableQuantity storageVolumeLvl; + private ComparableQuantity inletTemp; + private ComparableQuantity returnTemp; + private ComparableQuantity c; + private ComparableQuantity pThermalMax; + + protected AbstractThermalStorageInputCopyBuilder(AbstractThermalStorageInput entity) { + super(entity); + this.storageVolumeLvl = entity.getStorageVolumeLvl(); + this.inletTemp = entity.getInletTemp(); + this.returnTemp = entity.getReturnTemp(); + this.c = entity.getC(); + this.pThermalMax = entity.getpThermalMax(); + } + + public AbstractThermalStorageInputCopyBuilder storageVolumeLvl( + ComparableQuantity storageVolumeLvl) { + this.storageVolumeLvl = storageVolumeLvl; + return this; + } + + public AbstractThermalStorageInputCopyBuilder inletTemp( + ComparableQuantity inletTemp) { + this.inletTemp = inletTemp; + return this; + } + + public AbstractThermalStorageInputCopyBuilder returnTemp( + ComparableQuantity returnTemp) { + this.returnTemp = returnTemp; + return this; + } + + public AbstractThermalStorageInputCopyBuilder c(ComparableQuantity c) { + this.c = c; + return this; + } + + public AbstractThermalStorageInputCopyBuilder pThermalMax( + ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return this; + } + + @Override + public AbstractThermalStorageInputCopyBuilder scale(Double factor) { + storageVolumeLvl(storageVolumeLvl.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); + return this; + } + + @Override + public CylindricalStorageInput build() { + return new CylindricalStorageInput( + getUuid(), + getId(), + getOperator(), + getOperationTime(), + getThermalBus(), + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); + } + + @Override + protected AbstractThermalStorageInputCopyBuilder thisInstance() { + return this; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CylindricalStorageInput that)) return false; + if (!super.equals(o)) return false; + return storageVolumeLvl.equals(that.getStorageVolumeLvl()) + && inletTemp.equals(that.getInletTemp()) + && returnTemp.equals(that.getReturnTemp()) + && c.equals(that.getC()) + && pThermalMax.equals(that.getpThermalMax()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); + } + + @Override + public String toString() { + return "CylindricalStorageInput{" + + "uuid=" + + getUuid() + + ", id=" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", bus=" + + getThermalBus().getUuid() + + ", storageVolumeLvl=" + + storageVolumeLvl + + ", inletTemp=" + + inletTemp + + ", returnTemp=" + + returnTemp + + ", c=" + + c + + ", pThermalMax=" + + pThermalMax + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index e51d1efbc..9792deff4 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -6,10 +6,8 @@ package edu.ie3.datamodel.models.input.thermal; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; -import java.util.Objects; import java.util.UUID; import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; @@ -17,19 +15,10 @@ import tech.units.indriya.ComparableQuantity; /** Thermal storage with cylindrical shape */ -public class CylindricalStorageInput extends ThermalStorageInput { - /** Available storage volume (typically in m³) */ - private final ComparableQuantity storageVolumeLvl; - /** Temperature of the inlet (typically in C) */ - private final ComparableQuantity inletTemp; - /** Temperature of the outlet (typically in C) */ - private final ComparableQuantity returnTemp; - /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ - private final ComparableQuantity c; - /** Maximum permissible thermal power (typically in kW) */ - private final ComparableQuantity pThermalMax; - +public class CylindricalStorageInput extends AbstractThermalStorageInput { /** + * Constructor for CylindricalStorageInput + * * @param uuid Unique identifier of a cylindrical storage * @param id Identifier of the thermal unit * @param operator operator of the asset @@ -52,12 +41,17 @@ public CylindricalStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, operator, operationTime, bus); - this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); - this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); - this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + super( + uuid, + id, + operator, + operationTime, + bus, + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); } /** @@ -79,157 +73,14 @@ public CylindricalStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, bus); - this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); - this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); - this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); - } - - public ComparableQuantity getStorageVolumeLvl() { - return storageVolumeLvl; - } - - public ComparableQuantity getInletTemp() { - return inletTemp; - } - - public ComparableQuantity getReturnTemp() { - return returnTemp; - } - - public ComparableQuantity getC() { - return c; - } - - public ComparableQuantity getpThermalMax() { - return pThermalMax; - } - - @Override - public CylindricalStorageInputCopyBuilder copy() { - return new CylindricalStorageInputCopyBuilder(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof CylindricalStorageInput that)) return false; - if (!super.equals(o)) return false; - return storageVolumeLvl.equals(that.storageVolumeLvl) - && inletTemp.equals(that.inletTemp) - && returnTemp.equals(that.returnTemp) - && c.equals(that.c) - && pThermalMax.equals(that.pThermalMax); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); - } - - @Override - public String toString() { - return "CylindricalStorageInput{" - + "uuid=" - + getUuid() - + ", id=" - + getId() - + ", operator=" - + getOperator().getUuid() - + ", operationTime=" - + getOperationTime() - + ", bus=" - + getThermalBus().getUuid() - + ", storageVolumeLvl=" - + storageVolumeLvl - + ", inletTemp=" - + inletTemp - + ", returnTemp=" - + returnTemp - + ", c=" - + c - + ", pThermalMax=" - + pThermalMax - + '}'; + super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } - /** - * A builder pattern based approach to create copies of {@link CylindricalStorageInput} entities - * with altered field values. For detailed field descriptions refer to java docs of {@link - * CylindricalStorageInput} - */ public static class CylindricalStorageInputCopyBuilder - extends ThermalStorageInputCopyBuilder { - - private ComparableQuantity storageVolumeLvl; - private ComparableQuantity inletTemp; - private ComparableQuantity returnTemp; - private ComparableQuantity c; - private ComparableQuantity pThermalMax; + extends AbstractThermalStorageInputCopyBuilder { protected CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); - this.storageVolumeLvl = entity.getStorageVolumeLvl(); - this.inletTemp = entity.getInletTemp(); - this.returnTemp = entity.getReturnTemp(); - this.c = entity.getC(); - this.pThermalMax = entity.getpThermalMax(); - } - - public CylindricalStorageInputCopyBuilder storageVolumeLvl( - ComparableQuantity storageVolumeLvl) { - this.storageVolumeLvl = storageVolumeLvl; - return this; - } - - public CylindricalStorageInputCopyBuilder inletTemp(ComparableQuantity inletTemp) { - this.inletTemp = inletTemp; - return this; - } - - public CylindricalStorageInputCopyBuilder returnTemp( - ComparableQuantity returnTemp) { - this.returnTemp = returnTemp; - return this; - } - - public CylindricalStorageInputCopyBuilder c(ComparableQuantity c) { - this.c = c; - return this; - } - - public CylindricalStorageInputCopyBuilder pThermalMax(ComparableQuantity pThermalMax) { - this.pThermalMax = pThermalMax; - return this; - } - - @Override - public CylindricalStorageInputCopyBuilder scale(Double factor) { - storageVolumeLvl(storageVolumeLvl.multiply(factor)); - pThermalMax(pThermalMax.multiply(factor)); - return this; - } - - @Override - public CylindricalStorageInput build() { - return new CylindricalStorageInput( - getUuid(), - getId(), - getOperator(), - getOperationTime(), - getThermalBus(), - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); - } - - @Override - protected CylindricalStorageInputCopyBuilder thisInstance() { - return this; } } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 64866069d..99012f3d4 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -14,7 +14,7 @@ import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; -public class DomesticHotWaterStorageInput extends CylindricalStorageInput { +public class DomesticHotWaterStorageInput extends AbstractThermalStorageInput { /** * Constructor for DomesticHotWaterStorageInput @@ -78,39 +78,8 @@ public DomesticHotWaterStorageInput( super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } - @Override - public DomesticHotWaterStorageInputCopyBuilder copy() { - return new DomesticHotWaterStorageInputCopyBuilder(this); - } - - @Override - public String toString() { - return "DomesticHotWaterStorageInput{" - + "uuid=" - + getUuid() - + ", id=" - + getId() - + ", operator=" - + getOperator().getUuid() - + ", operationTime=" - + getOperationTime() - + ", bus=" - + getThermalBus().getUuid() - + ", storageVolumeLvl=" - + getStorageVolumeLvl() - + ", inletTemp=" - + getInletTemp() - + ", returnTemp=" - + getReturnTemp() - + ", c=" - + getC() - + ", pThermalMax=" - + getpThermalMax() - + '}'; - } - public static class DomesticHotWaterStorageInputCopyBuilder - extends CylindricalStorageInputCopyBuilder { + extends AbstractThermalStorageInputCopyBuilder { protected DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); From d7a512cc1fff4ee4518743fb481663a5e18bc3e6 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 10:16:09 +0100 Subject: [PATCH 271/310] removed double entries in changelog --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7504d61d..66a930899 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,9 +19,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) - Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) -- Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) -- Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) -- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) From 8eb059656928707ac06f16759465d662e7078fca Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Fri, 21 Feb 2025 11:49:43 +0100 Subject: [PATCH 272/310] Enhancing `CsvDataSource`. --- CHANGELOG.md | 1 + .../io/connectors/CsvFileConnector.java | 22 ++++- .../ie3/datamodel/io/source/EntitySource.java | 54 +++++++++++ .../io/source/csv/CsvDataSource.java | 29 ++++-- .../io/source/csv/CsvTimeSeriesSource.java | 2 +- src/main/resources/load/lpts_g0.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_g1.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_g2.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_g3.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_g4.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_g5.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_g6.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_h0.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_l0.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_l1.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_l2.csv | 97 +++++++++++++++++++ src/main/resources/load/lpts_random.csv | 97 +++++++++++++++++++ .../io/source/csv/CsvDataSourceTest.groovy | 25 ++++- 18 files changed, 1281 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/load/lpts_g0.csv create mode 100644 src/main/resources/load/lpts_g1.csv create mode 100644 src/main/resources/load/lpts_g2.csv create mode 100644 src/main/resources/load/lpts_g3.csv create mode 100644 src/main/resources/load/lpts_g4.csv create mode 100644 src/main/resources/load/lpts_g5.csv create mode 100644 src/main/resources/load/lpts_g6.csv create mode 100644 src/main/resources/load/lpts_h0.csv create mode 100644 src/main/resources/load/lpts_l0.csv create mode 100644 src/main/resources/load/lpts_l1.csv create mode 100644 src/main/resources/load/lpts_l2.csv create mode 100644 src/main/resources/load/lpts_random.csv diff --git a/CHANGELOG.md b/CHANGELOG.md index b35da38c7..fd3f550f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223) - Refactored `CongestionResult`, removed `ModelResultEntity` [#1234](https://github.com/ie3-institute/PowerSystemDataModel/issues/1234) - Replaced `LoadProfileInput` with `LoadProfileTimeSeries` [#1228](https://github.com/ie3-institute/PowerSystemDataModel/issues/1228) +- Enhance `CsvDataSource` [#1246](https://github.com/ie3-institute/PowerSystemDataModel/issues/1246) ## [5.1.0] - 2024-06-24 diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 43ce34b66..b2d10f5dc 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -17,6 +17,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.*; +import java.util.function.Function; import java.util.stream.Stream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,10 +35,17 @@ public class CsvFileConnector implements DataConnector { private final Map, BufferedCsvWriter> entityWriters = new HashMap<>(); private final Map timeSeriesWriters = new HashMap<>(); private final Path baseDirectory; + private final Optional> customInputStream; private static final String FILE_ENDING = ".csv"; public CsvFileConnector(Path baseDirectory) { this.baseDirectory = baseDirectory; + this.customInputStream = Optional.empty(); + } + + public CsvFileConnector(Path baseDirectory, Function inputStreamSupplier) { + this.baseDirectory = baseDirectory; + this.customInputStream = Optional.ofNullable(inputStreamSupplier); } /** Returns the base directory of this connector. */ @@ -159,9 +167,17 @@ public synchronized void closeEntityWriter(Class clz) thro * @throws FileNotFoundException if no file with the provided file name can be found */ public BufferedReader initReader(Path filePath) throws FileNotFoundException { - File fullPath = baseDirectory.resolve(filePath.toString() + FILE_ENDING).toFile(); - return new BufferedReader( - new InputStreamReader(new FileInputStream(fullPath), StandardCharsets.UTF_8), 16384); + Path fullPath = baseDirectory.resolve(filePath.toString() + FILE_ENDING); + + InputStream inputStream; + + if (customInputStream.isPresent()) { + inputStream = customInputStream.get().apply(fullPath.toString()); + } else { + inputStream = new FileInputStream(fullPath.toFile()); + } + + return new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8), 16384); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 95dd1e0dc..be0cdea31 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -9,14 +9,24 @@ import edu.ie3.datamodel.exceptions.FailedValidationException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; +import edu.ie3.datamodel.io.connectors.CsvFileConnector; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.source.csv.CsvDataSource; import edu.ie3.datamodel.models.Entity; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.utils.QuadFunction; import edu.ie3.datamodel.utils.TriFunction; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.Failure; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Path; import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; @@ -34,6 +44,9 @@ public abstract class EntitySource { protected static final Logger log = LoggerFactory.getLogger(EntitySource.class); + // file system for build-in entities + private static FileSystem jarFileSystem = null; + // convenience collectors protected static Collector> toMap() { @@ -94,6 +107,47 @@ protected static Try validate( .orElse(Try.Success.empty())); } + /** + * Method to get a source for the build in entities. + * + * @param subdirectory from the resource folder + * @return a new {@link CsvDataSource} + */ + protected static CsvDataSource getBuildInSource(Class clazz, String subdirectory) + throws SourceException { + try { + URL url = clazz.getResource(subdirectory); + + if (url == null) { + throw new SourceException("Resources not found for: " + subdirectory); + } + + URI uri = url.toURI(); + CsvFileConnector connector; + + switch (url.getProtocol()) { + case "file" -> connector = new CsvFileConnector(Path.of(uri)); + case "jar" -> { + // handling resources in jar + String[] array = uri.toString().split("!"); + + if (jarFileSystem == null) { + jarFileSystem = FileSystems.newFileSystem(URI.create(array[0]), Collections.emptyMap()); + } + + connector = + new CsvFileConnector(jarFileSystem.getPath(array[1]), clazz::getResourceAsStream); + } + default -> throw new SourceException( + "Protocol " + url.getProtocol() + " is nor supported!"); + } + + return new CsvDataSource(",", connector, new FileNamingStrategy()); + } catch (URISyntaxException | IOException e) { + throw new SourceException(e); + } + } + /** * Universal method to get a map: uuid to {@link UniqueEntity}. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java index 48078465e..3603aaa7e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvDataSource.java @@ -54,6 +54,13 @@ public CsvDataSource(String csvSep, Path directoryPath, FileNamingStrategy fileN this.fileNamingStrategy = fileNamingStrategy; } + public CsvDataSource( + String csvSep, CsvFileConnector connector, FileNamingStrategy fileNamingStrategy) { + this.csvSep = csvSep; + this.connector = connector; + this.fileNamingStrategy = fileNamingStrategy; + } + @Override public Optional> getSourceFields(Class entityClass) throws SourceException { @@ -85,6 +92,15 @@ public Stream> getSourceData(Class entityC return buildStreamWithFieldsToAttributesMap(entityClass, true).getOrThrow(); } + /** + * @param filePath to the csv file + * @return a stream of maps that represent the rows in the csv file + * @throws SourceException on error while reading the source file + */ + public Stream> getSourceData(Path filePath) throws SourceException { + return buildStreamWithFieldsToAttributesMap(filePath, true).getOrThrow(); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** Returns the set {@link FileNamingStrategy}. */ @@ -231,8 +247,7 @@ protected String[] parseCsvRow(String csvRow, String csvSep) { protected Try>, SourceException> buildStreamWithFieldsToAttributesMap( Class entityClass, boolean allowFileNotExisting) { return getFilePath(entityClass) - .flatMap( - path -> buildStreamWithFieldsToAttributesMap(entityClass, path, allowFileNotExisting)); + .flatMap(path -> buildStreamWithFieldsToAttributesMap(path, allowFileNotExisting)); } /** @@ -240,14 +255,12 @@ protected Try>, SourceException> buildStreamWithField * of (fieldName to fieldValue) mapping where each map represents one row of the .csv file. Since * the returning stream is a parallel stream, the order of the elements cannot be guaranteed. * - * @param entityClass the entity class that should be build * @param filePath the path of the file to read * @return a try containing either a parallel stream of maps, where each map represents one row of * the csv file with the mapping (fieldName to fieldValue) or an exception */ - protected - Try>, SourceException> buildStreamWithFieldsToAttributesMap( - Class entityClass, Path filePath, boolean allowFileNotExisting) { + protected Try>, SourceException> buildStreamWithFieldsToAttributesMap( + Path filePath, boolean allowFileNotExisting) { try (BufferedReader reader = connector.initReader(filePath)) { final String[] headline = parseCsvRow(reader.readLine(), csvSep); @@ -264,9 +277,7 @@ Try>, SourceException> buildStreamWithFieldsToAttribu return Failure.of(new SourceException("Unable to find file '" + filePath + "'.", e)); } } catch (IOException e) { - return Failure.of( - new SourceException( - "Cannot read file to build entity '" + entityClass.getSimpleName() + "'", e)); + return Failure.of(new SourceException("Cannot read file '" + filePath + "'.", e)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 0210b7dde..4b5acd0ba 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -163,7 +163,7 @@ protected IndividualTimeSeries buildIndividualTimeSeries( throws SourceException { Try>, SourceException> timeBasedValues = dataSource - .buildStreamWithFieldsToAttributesMap(TimeBasedValue.class, filePath, false) + .buildStreamWithFieldsToAttributesMap(filePath, false) .flatMap( stream -> Try.scanStream(stream.map(fieldToValueFunction), "TimeBasedValue") diff --git a/src/main/resources/load/lpts_g0.csv b/src/main/resources/load/lpts_g0.csv new file mode 100644 index 000000000..386b6012c --- /dev/null +++ b/src/main/resources/load/lpts_g0.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +74.6,68.8,71.5,75.8,68.3,73.0,70.0,63.2,65.5,0 +76.2,67.4,69.0,76.7,66.5,70.1,73.0,61.0,62.6,1 +77.7,65.7,66.3,77.7,64.6,67.1,75.9,58.9,59.6,2 +78.5,63.5,63.5,78.5,62.6,64.5,77.6,57.0,57.0,3 +77.9,60.9,60.9,78.5,60.3,62.3,77.1,55.3,54.8,4 +76.3,58.0,58.6,77.8,57.9,60.6,75.0,53.7,53.1,5 +74.1,55.4,56.6,76.6,55.5,59.2,72.1,52.1,51.7,6 +71.9,53.3,55.1,74.7,53.3,57.9,69.1,50.5,50.5,7 +70.2,52.0,54.2,72.6,51.2,56.7,66.8,48.7,49.4,8 +68.9,51.4,53.7,70.4,49.5,55.6,65.1,46.9,48.5,9 +67.9,51.0,53.4,68.5,48.0,54.7,64.1,45.2,47.9,10 +67.3,50.5,53.3,67.3,46.7,54.2,63.5,43.9,47.7,11 +66.9,49.6,53.1,67.0,45.7,54.1,63.4,43.0,47.9,12 +66.7,48.5,53.2,67.5,44.9,54.6,63.6,42.5,48.7,13 +66.8,47.5,54.1,68.3,44.3,55.8,64.0,42.2,50.2,14 +67.3,46.7,56.1,69.1,43.9,57.9,64.5,42.0,52.3,15 +68.0,46.4,59.4,69.7,43.6,60.9,65.0,41.9,55.1,16 +69.0,46.5,63.3,70.1,43.5,64.4,65.6,41.8,58.2,17 +70.0,46.6,67.2,70.5,43.6,68.0,66.3,41.8,61.2,18 +71.0,46.7,70.1,71.0,43.9,71.0,67.3,42.0,63.5,19 +71.8,46.6,71.4,71.8,44.5,73.2,68.5,42.6,65.0,20 +72.4,46.3,71.6,72.5,45.1,74.7,69.9,43.4,66.0,21 +72.8,46.0,71.2,73.0,45.6,75.7,71.4,44.4,67.1,22 +72.9,45.8,71.0,72.9,45.8,76.6,72.9,45.8,69.1,23 +73.0,45.9,71.5,72.2,45.6,77.7,74.4,47.4,72.5,24 +73.9,46.3,73.1,72.2,45.3,79.3,76.8,49.0,77.1,25 +77.0,47.2,75.9,74.4,45.2,81.9,81.0,50.4,82.9,26 +83.2,48.6,80.4,80.4,45.8,86.0,87.8,51.4,89.7,27 +93.3,50.5,86.6,91.0,47.2,91.9,98.0,51.8,97.6,28 +106.2,52.6,95.1,105.2,49.1,100.4,110.7,51.7,107.3,29 +120.5,54.3,106.3,121.2,51.0,111.9,124.8,51.2,119.9,30 +134.5,55.1,120.5,137.4,52.3,127.1,139.2,50.5,136.4,31 +147.2,54.8,137.8,152.1,52.8,145.9,153.0,49.6,157.1,32 +157.8,53.9,156.3,164.9,52.9,166.2,165.4,49.0,179.5,33 +166.2,53.2,173.4,175.1,53.1,185.2,175.9,48.8,200.5,34 +171.9,53.3,186.9,182.2,54.2,200.0,184.1,49.5,216.8,35 +175.0,54.7,195.0,186.1,56.4,208.5,189.5,51.3,226.2,36 +176.1,57.2,198.7,187.5,59.5,212.1,192.8,53.8,230.0,37 +176.3,60.0,199.8,187.7,62.7,212.6,195.1,56.8,230.4,38 +176.6,62.6,200.0,187.8,65.4,212.1,197.1,59.8,229.9,39 +177.7,64.5,200.6,188.7,67.2,212.2,199.8,62.6,230.0,40 +179.4,65.9,201.9,190.1,68.5,213.1,202.7,65.1,231.2,41 +181.3,67.0,203.6,191.9,69.6,214.6,205.4,67.2,233.0,42 +183.1,68.2,205.6,193.4,71.0,216.8,207.4,69.1,235.5,43 +184.4,69.7,207.6,194.5,73.1,219.2,208.4,70.8,238.1,44 +185.2,71.4,209.1,195.1,75.6,221.2,208.3,72.2,240.0,45 +185.3,73.2,209.6,195.3,78.2,222.0,207.4,73.5,240.4,46 +185.0,74.7,208.4,195.3,80.4,220.5,205.6,74.7,238.3,47 +184.1,76.0,205.1,194.9,81.9,216.3,203.0,76.0,233.0,48 +182.4,77.0,200.0,193.9,82.8,209.8,199.7,77.3,225.1,49 +179.7,77.8,193.8,191.7,83.2,201.9,195.6,78.4,215.7,50 +175.7,78.5,186.9,187.8,83.2,193.4,190.6,79.4,205.6,51 +170.1,79.1,179.9,181.9,82.8,185.0,184.6,80.1,195.7,52 +163.1,79.5,173.4,174.1,82.1,177.4,177.5,80.5,186.7,53 +154.6,79.3,168.1,164.8,80.9,170.9,168.9,80.3,179.2,54 +144.8,78.5,164.4,154.2,79.4,166.3,158.8,79.4,173.8,55 +133.9,76.8,163.0,142.6,77.5,163.9,147.2,77.8,171.0,56 +122.7,74.4,163.5,130.9,75.3,163.6,134.8,75.7,170.7,57 +112.0,71.8,165.4,119.8,73.1,165.1,122.7,73.4,172.7,58 +102.8,69.1,168.2,110.3,71.0,168.2,112.1,71.0,176.6,59 +95.7,66.8,171.5,102.7,69.2,172.5,103.8,68.9,182.1,60 +90.4,64.8,174.6,96.9,67.6,177.3,97.4,67.0,188.2,61 +86.4,63.1,177.2,92.1,66.1,181.4,92.6,65.2,193.9,62 +83.2,61.7,178.5,87.8,64.5,184.1,88.8,63.5,198.1,63 +80.3,60.4,178.2,83.6,62.8,184.5,85.6,62.0,200.1,64 +77.8,59.7,176.8,79.7,61.5,183.6,83.3,61.2,200.7,65 +75.9,59.7,175.1,76.9,61.2,182.1,82.4,61.8,200.9,66 +74.7,60.7,173.8,75.7,62.6,181.3,83.2,64.5,201.8,67 +74.4,63.0,173.2,76.5,65.9,181.5,85.8,69.5,204.0,68 +74.8,66.0,172.4,78.6,70.4,181.7,89.5,76.0,205.8,69 +75.6,69.2,170.2,81.1,75.0,180.0,93.4,82.6,205.5,70 +76.6,71.9,165.4,83.2,78.5,174.7,96.2,87.8,200.9,71 +77.6,73.9,157.1,84.1,80.1,164.8,97.4,90.8,190.7,72 +78.5,75.1,146.1,84.3,80.4,151.5,97.4,92.1,176.6,73 +79.1,76.0,133.8,84.1,80.2,137.0,96.8,92.3,160.5,74 +79.4,76.6,121.5,84.1,80.4,123.3,96.2,92.5,144.8,75 +79.4,77.3,110.1,84.7,81.4,112.1,96.3,93.1,131.3,76 +79.4,78.2,100.5,85.8,83.1,103.4,96.8,94.0,120.1,77 +79.6,79.2,93.2,87.3,85.1,97.3,97.2,94.6,111.3,78 +80.4,80.4,88.8,88.8,86.9,93.4,97.2,94.4,104.6,79 +81.9,81.6,87.4,90.1,88.1,91.6,96.3,93.0,100.0,80 +83.9,82.9,88.1,91.2,88.7,91.1,94.8,90.8,96.7,81 +85.7,83.8,89.6,91.7,88.6,91.1,92.8,88.0,94.1,82 +86.9,84.1,90.6,91.6,87.8,90.6,90.6,85.0,91.6,83 +87.0,83.7,90.2,90.6,86.4,89.2,88.5,82.1,88.5,84 +86.3,82.7,88.5,89.0,84.4,87.2,86.4,79.4,85.2,85 +84.9,81.2,86.3,87.1,82.0,85.0,84.3,76.9,82.1,86 +83.2,79.4,84.1,85.0,79.4,83.2,82.2,74.7,79.4,87 +81.3,77.5,82.4,83.1,76.7,82.1,80.1,72.8,77.6,88 +79.3,75.5,81.2,81.2,74.1,81.7,78.0,71.1,76.4,89 +77.4,73.3,80.3,79.4,71.5,81.6,75.9,69.3,75.6,90 +75.7,71.0,79.4,77.6,69.1,81.3,73.8,67.3,74.7,91 +74.1,68.6,78.4,75.7,67.0,80.6,71.7,65.0,73.7,92 +72.7,66.4,77.2,73.8,65.3,79.5,69.7,62.6,72.3,93 +71.3,64.6,75.7,71.9,64.1,77.9,67.6,60.4,70.5,94 +70.1,63.5,73.8,70.1,63.5,75.7,65.4,58.9,68.2,95 diff --git a/src/main/resources/load/lpts_g1.csv b/src/main/resources/load/lpts_g1.csv new file mode 100644 index 000000000..a2889f2e5 --- /dev/null +++ b/src/main/resources/load/lpts_g1.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +23.6,22.4,23.6,20.7,22.4,20.2,25.8,25.7,26.4,0 +22.5,21.8,22.5,20.8,21.9,19.7,25.2,25.0,26.4,1 +21.5,21.3,21.5,20.9,21.4,19.2,24.7,24.6,26.4,2 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,26.5,3 +20.5,20.6,20.5,20.5,20.2,18.8,25.0,25.0,26.5,4 +20.5,20.6,20.5,20.0,19.5,18.8,25.6,25.6,26.5,5 +20.7,20.7,20.6,19.4,19.1,18.9,26.2,26.2,26.5,6 +20.8,20.8,20.8,18.9,18.9,18.9,26.5,26.5,26.5,7 +20.9,20.9,21.0,18.6,19.2,18.9,26.3,26.3,26.6,8 +20.9,20.9,21.0,18.5,19.7,18.9,25.8,25.7,26.6,9 +20.9,20.8,21.0,18.6,20.3,18.9,25.1,25.1,26.6,10 +20.8,20.8,20.8,18.9,20.8,18.9,24.6,24.6,26.5,11 +20.8,20.8,20.6,19.5,21.2,19.0,24.4,24.4,26.2,12 +20.8,20.8,20.4,20.2,21.3,19.1,24.5,24.5,25.8,13 +20.8,20.9,20.5,20.7,21.2,19.1,24.6,24.6,25.3,14 +20.8,20.8,20.8,20.8,20.8,18.9,24.6,24.6,24.6,15 +20.7,20.7,21.6,20.4,20.3,18.5,24.5,24.5,23.9,16 +20.7,20.7,22.4,19.6,19.6,18.3,24.3,24.3,23.6,17 +20.7,20.7,22.9,19.0,19.1,18.9,24.3,24.3,24.3,18 +20.8,20.8,22.7,18.9,18.9,20.8,24.6,24.6,26.5,19 +21.1,21.2,21.6,19.6,19.1,24.1,25.4,25.4,27.0,20 +21.6,21.7,20.7,20.7,19.6,27.2,26.5,26.5,27.4,21 +22.1,22.2,21.2,21.9,20.3,28.1,27.6,27.6,27.9,22 +22.7,22.7,24.6,22.7,20.8,24.6,28.4,28.4,28.4,23 +23.3,23.1,31.9,22.9,21.1,27.9,28.7,28.8,31.5,24 +23.8,23.3,43.9,22.7,21.2,28.6,28.7,28.8,32.5,25 +24.2,23.2,60.8,22.5,21.1,30.8,28.5,28.6,35.3,26 +24.6,22.7,83.3,22.7,20.8,32.2,28.4,28.4,36.0,27 +24.9,21.9,111.4,23.8,20.4,74.1,28.5,28.2,90.3,28 +25.2,20.8,143.9,25.9,19.8,131.7,29.1,28.1,164.8,29 +25.7,19.8,179.2,29.3,19.3,195.3,30.2,28.2,246.8,30 +26.5,18.9,215.8,34.1,18.9,255.5,32.2,28.4,323.7,31 +27.7,18.5,251.9,40.3,18.8,304.6,35.0,28.8,385.2,32 +29.4,18.4,285.0,47.2,18.7,341.8,38.4,29.3,430.7,33 +31.5,18.5,312.3,53.6,18.8,368.0,42.0,29.9,462.0,34 +34.1,18.9,331.2,58.7,18.9,384.2,45.4,30.3,480.8,35 +37.0,19.4,340.0,61.6,19.0,391.7,48.4,30.5,489.0,36 +40.1,20.0,341.2,62.7,19.0,393.1,50.9,30.5,489.9,37 +43.0,20.5,338.3,62.8,19.0,391.5,53.0,30.4,486.7,38 +45.4,20.8,335.0,62.5,18.9,389.9,54.9,30.3,482.6,39 +47.2,20.9,334.1,62.2,18.8,390.6,56.6,30.1,480.5,40 +48.4,20.9,334.9,62.2,18.7,392.9,57.9,30.0,479.8,41 +49.0,20.8,336.3,62.3,18.8,395.7,58.7,30.0,479.6,42 +49.2,20.8,336.9,62.5,18.9,397.5,58.7,30.3,478.9,43 +49.0,21.1,335.6,62.6,19.3,397.3,57.8,30.8,476.5,44 +48.4,21.5,332.0,62.6,19.8,395.0,56.3,31.4,472.0,45 +47.3,22.0,326.2,62.0,20.4,390.6,54.6,31.9,464.8,46 +45.4,22.7,318.0,60.6,20.8,384.2,53.0,32.2,454.3,47 +42.9,23.4,307.4,58.2,21.1,375.8,51.7,32.1,440.0,48 +39.9,24.1,294.7,55.0,21.2,364.5,50.6,31.6,422.0,49 +36.8,24.5,280.4,51.3,21.2,349.3,49.3,31.0,400.2,50 +34.1,24.6,265.0,47.3,20.8,329.3,47.3,30.3,374.8,51 +31.9,24.3,249.2,43.4,20.3,304.7,44.6,29.6,346.4,52 +30.3,23.8,235.5,39.8,19.6,279.8,41.4,29.0,319.4,53 +29.2,23.2,226.5,36.6,19.1,260.3,38.4,28.5,298.8,54 +28.4,22.7,225.2,34.1,18.9,251.7,36.0,28.4,289.6,55 +27.8,22.5,232.9,32.4,19.1,257.5,34.5,28.6,294.8,56 +27.4,22.5,245.5,31.3,19.7,272.9,33.9,29.0,309.8,57 +27.0,22.6,257.4,30.7,20.3,290.9,33.9,29.6,328.0,58 +26.5,22.7,263.1,30.3,20.8,304.7,34.1,30.3,342.6,59 +25.9,22.8,258.6,29.8,21.1,309.0,34.3,30.9,348.5,60 +25.4,22.8,245.9,29.4,21.2,304.7,34.4,31.4,345.8,61 +24.9,22.8,228.5,28.9,21.1,294.3,34.4,31.9,336.4,62 +24.6,22.7,210.1,28.4,20.8,280.1,34.1,32.2,321.8,63 +24.6,22.6,193.3,27.9,20.4,264.3,33.5,32.4,303.4,64 +24.7,22.4,177.7,27.5,19.9,246.5,32.9,32.4,281.9,65 +24.8,22.5,162.3,27.0,19.4,226.2,32.4,32.4,257.6,66 +24.6,22.7,145.7,26.5,18.9,202.5,32.2,32.2,230.9,67 +24.1,23.3,127.4,26.0,18.6,175.4,32.4,31.9,202.5,68 +23.5,23.9,108.5,25.4,18.4,146.9,33.0,31.7,174.0,69 +22.9,24.5,90.7,24.9,18.5,119.7,33.6,31.7,147.5,70 +22.7,24.6,75.7,24.6,18.9,96.5,34.1,32.2,124.9,71 +23.0,24.2,64.7,24.4,19.8,79.3,34.3,33.2,107.6,72 +23.6,23.6,57.0,24.4,20.9,67.2,34.2,34.5,94.7,73 +24.3,23.0,51.6,24.5,21.9,59.0,34.1,35.5,84.6,74 +24.6,22.7,47.3,24.6,22.7,53.0,34.1,36.0,75.7,75 +24.5,23.0,43.3,24.7,23.0,48.1,34.1,35.5,66.9,76 +24.0,23.7,39.7,24.8,23.0,44.0,34.3,34.3,58.5,77 +23.3,24.3,36.5,24.7,22.9,40.7,34.3,33.1,51.1,78 +22.7,24.6,34.1,24.6,22.7,37.9,34.1,32.2,45.4,79 +22.3,24.3,32.5,24.3,22.7,35.6,33.5,31.9,41.8,80 +22.2,23.7,31.6,24.1,22.8,33.6,32.6,32.1,39.8,81 +22.3,23.0,31.0,24.1,22.8,31.9,31.5,32.3,38.7,82 +22.7,22.7,30.3,24.6,22.7,30.3,30.3,32.2,37.9,83 +23.3,23.0,29.3,25.6,22.3,28.7,29.0,31.5,36.7,84 +23.9,23.6,28.2,26.8,21.8,27.1,27.8,30.4,35.2,85 +24.4,24.3,27.2,27.9,21.3,25.7,26.9,29.2,33.6,86 +24.6,24.6,26.5,28.4,20.8,24.6,26.5,28.4,32.2,87 +24.3,24.4,26.2,28.0,20.6,23.8,26.7,28.1,30.9,88 +23.8,23.9,26.2,27.0,20.6,23.4,27.3,28.2,29.9,89 +23.2,23.2,26.4,25.8,20.7,23.0,28.0,28.4,29.1,90 +22.7,22.7,26.5,24.6,20.8,22.7,28.4,28.4,28.4,91 +22.6,22.6,26.4,23.8,21.0,22.3,28.4,28.1,27.8,92 +22.7,22.6,26.0,23.3,21.1,21.9,28.0,27.6,27.2,93 +22.8,22.8,25.4,23.0,21.0,21.4,27.3,27.0,26.8,94 +22.7,22.7,24.6,22.7,20.8,20.8,26.5,26.5,26.5,95 diff --git a/src/main/resources/load/lpts_g2.csv b/src/main/resources/load/lpts_g2.csv new file mode 100644 index 000000000..05e1ca97a --- /dev/null +++ b/src/main/resources/load/lpts_g2.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +63.1,50.6,60.8,73.1,64.2,70.5,80.6,73.7,77.4,0 +58.0,47.4,53.0,67.6,60.7,61.9,74.6,68.7,67.4,1 +53.5,44.3,46.0,62.8,56.9,54.4,69.2,63.6,58.4,2 +48.9,41.1,40.1,57.7,52.8,47.9,63.6,58.7,50.9,3 +43.6,37.9,35.4,51.6,48.3,42.5,57.1,54.4,44.9,4 +38.1,34.7,31.7,45.0,43.8,38.1,50.4,50.6,40.5,5 +33.2,31.8,29.1,38.9,39.6,34.7,44.1,47.2,37.4,6 +29.3,29.3,27.4,34.2,36.2,32.3,39.1,44.0,35.2,7 +27.2,27.4,26.5,31.6,33.8,30.8,36.0,41.0,33.9,8 +26.4,26.0,26.2,30.6,32.2,29.9,34.4,38.2,33.1,9 +26.3,25.0,26.2,30.4,31.1,29.5,33.7,35.9,32.6,10 +26.4,24.5,26.4,30.3,30.3,29.3,33.3,34.2,32.3,11 +26.3,24.2,26.5,29.8,29.5,29.2,32.7,33.3,31.9,12 +25.8,24.0,26.6,29.0,28.7,29.1,32.0,33.0,31.5,13 +25.2,23.9,26.5,28.1,27.9,29.1,31.5,33.1,31.3,14 +24.5,23.5,26.4,27.4,27.4,29.3,31.3,33.3,31.3,15 +23.8,22.8,26.3,27.0,27.1,29.9,31.5,33.3,31.6,16 +23.3,22.3,26.3,26.7,26.8,30.3,31.7,33.1,31.9,17 +23.5,22.3,26.6,26.3,26.4,30.3,31.5,32.5,31.6,18 +24.5,23.5,27.4,25.4,25.4,29.3,30.3,31.3,30.3,19 +26.5,26.1,28.9,24.1,24.1,27.5,28.1,29.7,28.0,20 +29.5,29.8,31.2,23.4,23.2,26.1,26.4,28.5,26.3,21 +33.5,34.3,34.6,24.7,24.3,26.8,27.1,29.0,27.1,22 +38.1,39.1,39.1,29.3,28.4,31.3,32.3,32.3,32.3,23 +43.3,43.7,44.8,38.0,36.2,40.6,42.9,38.9,43.0,24 +48.1,47.4,50.9,48.5,45.7,52.3,56.2,47.3,56.9,25 +51.6,49.4,56.1,58.3,54.1,63.3,68.5,54.9,70.4,26 +52.8,48.9,59.7,64.6,58.7,70.4,76.3,59.7,80.2,27 +51.2,45.6,60.8,65.4,57.7,71.5,77.0,59.9,84.0,28 +48.2,40.6,60.4,62.5,52.5,68.5,72.9,56.6,83.3,29 +45.5,35.6,59.9,58.1,45.5,64.2,67.3,51.7,80.8,30 +45.0,32.3,60.6,54.8,39.1,61.6,63.6,47.0,79.2,31 +48.0,31.9,63.6,54.5,35.3,62.9,64.5,44.0,80.5,32 +54.2,34.4,68.8,57.3,34.7,67.7,69.5,43.7,84.6,33 +62.6,39.6,75.7,63.1,37.5,75.1,77.4,46.7,90.6,34 +72.4,47.0,84.1,71.4,44.0,84.1,87.1,53.8,97.8,35 +82.8,56.2,93.5,81.9,54.2,93.8,97.4,65.2,105.6,36 +93.1,66.4,103.2,93.7,66.8,103.7,108.4,79.5,114.1,37 +102.9,76.6,112.4,105.9,80.5,113.3,119.9,94.6,123.5,38 +111.5,86.1,120.3,117.4,93.9,122.3,132.1,108.6,134.0,39 +118.6,93.9,126.5,127.4,105.7,130.2,144.7,120.0,145.5,40 +124.2,100.2,131.0,135.7,115.5,137.0,156.7,128.8,156.8,41 +128.3,105.0,134.4,142.2,123.0,142.5,166.9,135.6,166.2,42 +131.1,108.6,136.9,146.7,128.1,146.7,174.1,140.9,172.2,43 +132.7,111.1,139.0,149.3,130.8,149.6,177.4,144.9,173.6,44 +133.4,112.7,140.3,150.3,131.5,151.2,177.7,147.8,171.6,45 +133.4,113.8,140.7,150.2,131.4,151.5,176.2,149.4,167.7,46 +133.0,114.4,139.9,149.7,131.1,150.6,174.1,149.7,163.4,47 +132.5,115.0,137.8,149.0,131.3,148.8,172.6,148.5,159.9,48 +131.8,115.4,134.6,148.7,131.6,146.4,172.0,146.8,157.5,49 +131.3,115.9,131.0,148.8,131.4,143.9,172.4,145.2,155.8,50 +131.1,116.4,127.2,149.7,130.1,141.8,174.1,144.8,154.6,51 +131.1,116.9,123.7,151.4,127.3,140.6,177.1,146.0,153.7,52 +131.4,117.2,120.9,153.6,123.6,140.1,180.4,148.3,153.2,53 +131.8,116.8,119.0,155.5,120.0,140.0,183.0,151.1,153.1,54 +132.1,115.4,118.4,156.5,117.4,139.9,183.9,153.6,153.6,55 +132.1,112.9,119.2,156.3,116.5,139.7,182.4,155.1,154.7,56 +132.2,109.8,121.2,155.1,116.8,139.9,179.5,155.5,156.8,57 +132.4,107.1,124.0,153.7,117.6,141.1,176.6,155.0,160.2,58 +133.0,105.6,127.2,152.6,118.4,143.8,175.1,153.6,165.3,59 +134.2,106.0,130.4,152.3,118.4,148.4,176.0,151.4,172.2,60 +135.9,107.7,133.4,152.9,118.0,153.9,178.9,149.0,180.0,61 +137.8,110.1,136.0,154.4,117.6,159.3,182.8,147.2,187.6,62 +139.9,112.5,137.9,156.5,117.4,163.4,186.8,146.7,193.7,63 +141.9,114.4,139.2,159.3,117.9,165.3,190.3,148.1,197.6,64 +144.0,116.2,140.4,162.9,119.3,166.2,193.8,151.2,200.5,65 +146.6,118.3,142.3,167.1,122.0,167.4,197.9,155.7,203.9,66 +149.7,121.3,145.7,172.2,126.2,170.2,203.5,161.4,209.3,67 +153.5,125.5,151.2,177.8,132.0,175.7,210.8,167.8,217.7,68 +157.4,130.3,157.9,183.6,138.7,183.0,218.8,174.5,227.8,69 +160.9,135.1,164.6,188.8,145.2,190.7,226.3,180.7,237.7,70 +163.4,138.9,170.2,192.7,150.6,197.6,231.8,185.9,245.5,71 +164.2,141.3,173.9,194.9,154.2,202.6,234.4,189.5,249.8,72 +163.7,142.6,176.0,195.6,156.4,206.0,234.5,192.1,251.2,73 +162.3,143.2,177.2,195.4,157.9,208.0,233.0,193.9,250.7,74 +160.4,143.8,178.0,194.7,159.4,209.3,230.9,195.6,249.4,75 +158.4,144.6,179.1,193.9,161.5,210.2,228.7,197.5,248.2,76 +156.5,145.5,180.2,193.2,163.8,210.9,226.9,199.4,247.2,77 +154.8,146.0,181.2,192.5,165.9,211.6,225.3,200.9,246.3,78 +153.6,145.7,181.9,191.7,167.3,212.3,224.0,201.5,245.5,79 +152.8,144.4,182.1,190.9,167.6,213.1,223.0,201.0,244.7,80 +152.1,142.0,181.6,189.7,166.9,213.5,221.5,199.2,243.3,81 +150.9,138.8,180.3,187.8,165.1,213.1,218.9,196.2,240.6,82 +148.7,135.0,178.0,184.9,162.4,211.3,214.2,191.7,235.7,83 +144.9,130.6,174.6,180.5,158.7,207.6,207,185.8,228.3,84 +139.3,125.3,169.9,174.2,153.5,201.8,197,178.1,218.5,85 +131.9,118.8,163.6,165.4,146.1,194.0,184.4,168.1,206.9,86 +122.3,110.5,155.5,153.6,136.0,183.9,169.2,155.5,193.7,87 +110.7,100.5,145.6,138.6,122.8,171.7,151.8,140.2,179.5,88 +98.1,89.4,134.3,122.0,108.1,157.9,133.7,123.7,164.8,89 +85.9,78.4,122.4,105.8,93.6,143.5,116.7,107.7,150.1,90 +75.3,68.5,110.5,91.9,81.2,129.1,102.7,93.9,136,91 +67.3,60.5,99.2,82.0,72.3,115.5,93,83.8,122.8,92 +61.5,54.4,88.7,75.4,66.4,102.7,86.6,76.7,110.6,93 +57.3,50.0,78.7,70.9,62.5,91.0,82.2,71.6,99.1,94 +53.8,47.0,69.5,67.5,59.7,80.2,78.3,67.5,88.0,95 diff --git a/src/main/resources/load/lpts_g3.csv b/src/main/resources/load/lpts_g3.csv new file mode 100644 index 000000000..5a61280e8 --- /dev/null +++ b/src/main/resources/load/lpts_g3.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +99.0,94.6,98.5,92.5,87.6,91.2,95.3,87.8,94.7,0 +100.0,95.3,99.0,93.0,87.3,90.2,95.5,88.3,94.1,1 +100.9,96.0,99.4,93.7,87.4,89.4,96.2,89.0,94.1,2 +101.0,96.2,99.2,94.3,87.7,88.9,97.4,90.1,95.0,3 +99.8,95.3,98.1,94.5,88.0,88.7,98.9,91.3,96.6,4 +97.9,93.9,96.4,94.5,88.4,88.8,100.3,92.4,98.4,5 +95.8,92.4,94.8,94.3,88.9,89.1,101.0,92.9,99.8,6 +94.3,91.3,93.7,94.3,89.5,89.5,100.4,92.5,99.8,7 +94.0,91.1,93.6,94.7,90.3,90.0,98.2,91.0,98.0,8 +94.3,91.5,94.1,95.0,91.0,90.3,95.1,88.7,95.1,9 +94.8,92.1,94.7,95.0,91.2,90.2,91.9,86.4,91.9,10 +95.0,92.5,95.0,94.3,90.7,89.5,89.5,84.7,89.5,11 +94.3,92.4,94.4,92.7,89.2,88.0,88.6,84.0,88.4,12 +93.1,91.9,93.3,90.6,87.2,86.1,88.6,84.0,88.3,13 +91.7,91.2,92.2,88.3,85.1,84.0,88.7,84.0,88.3,14 +90.7,90.7,91.3,86.5,83.5,82.3,88.3,83.5,87.7,15 +90.3,90.5,91.0,85.4,82.7,81.1,86.8,82.1,86.1,16 +90.2,90.4,91.1,85.1,82.7,80.5,85.1,80.6,84.3,17 +90.1,90.1,91.1,85.1,83.1,80.4,84.2,80.1,83.5,18 +89.5,89.5,90.7,85.3,83.5,80.4,85.3,81.6,84.7,19 +88.2,88.5,89.8,85.4,83.7,80.7,89.0,85.9,88.5,20 +87.0,87.7,89.0,85.8,84.0,81.3,94.1,91.6,94.0,21 +86.7,88.2,89.2,86.9,84.8,82.5,99.3,97.0,99.5,22 +88.3,90.7,91.3,88.9,86.5,84.7,102.8,100.4,103.4,23 +92.2,95.8,95.9,92.1,89.2,87.9,103.7,100.7,104.7,24 +97.3,102.0,101.6,95.7,92.4,91.6,102.6,98.8,104.0,25 +102.2,107.6,106.9,99.0,95.4,95.2,100.7,96.2,102.4,26 +105.2,110.7,110.1,101.0,97.4,98.0,99.2,94.3,101.0,27 +105.5,110.0,110.1,101.3,97.9,99.6,99.1,94.4,100.8,28 +104.6,106.9,108.4,101.1,97.6,100.9,100.8,95.7,102.1,29 +104.6,103.1,107.1,102.3,97.3,102.8,104.4,97.6,105.3,30 +107.7,100.4,108.3,106.4,98.0,106.4,110.1,99.2,110.7,31 +115.0,100.2,113.3,114.6,100.1,112.4,117.7,99.7,118.2,32 +125.0,101.8,120.8,124.9,102.9,119.5,126.1,99.6,126.7,33 +134.9,104.0,128.9,134.7,105.4,126.3,133.9,99.2,134.7,34 +142.1,105.8,135.5,141.5,106.4,131.2,139.7,99.2,140.9,35 +144.9,106.3,139.1,143.4,105.4,133.3,142.4,99.8,144.2,36 +144.1,105.8,140.3,141.8,102.9,133.2,142.9,100.9,145.4,37 +141.8,104.8,140.3,138.6,99.9,132.1,142.4,102.1,145.5,38 +139.7,104.0,140.3,136.1,97.4,131.2,142.1,102.8,145.8,39 +139.2,103.8,141.1,135.7,96.1,131.5,142.9,102.9,147.0,40 +140.0,104.1,142.5,137.1,95.9,132.8,144.5,102.5,149.0,41 +141.4,104.5,144.0,139.3,96.3,134.7,146.3,101.8,151.2,42 +142.7,104.6,145.1,141.5,96.8,136.7,147.6,101.0,153.0,43 +143.4,104.4,145.7,143.0,96.9,138.4,147.9,100.4,154.0,44 +143.7,104.0,145.8,143.6,96.8,139.7,147.5,100.0,154.3,45 +143.7,103.9,145.9,143.7,96.6,140.6,146.8,99.8,154.3,46 +143.9,104.6,146.4,143.3,96.2,140.9,146.4,99.8,154.2,47 +144.5,106.3,147.4,142.7,95.7,140.7,146.3,100.0,154.3,48 +145.0,108.3,148.6,141.8,95.4,140.0,146.5,100.5,154.5,49 +145.0,110.1,149.1,140.8,95.1,139.0,146.2,101.0,154.3,50 +143.9,110.7,148.2,139.7,95.0,137.9,145.1,101.6,153.6,51 +141.5,109.7,145.4,138.4,95.0,136.8,142.8,102.2,152.2,52 +137.8,107.5,141.4,136.8,95.3,135.9,139.3,102.4,149.9,53 +133.3,105.0,137.2,134.5,95.6,135.0,134.6,102.1,147.0,54 +128.2,102.8,133.7,131.2,96.2,134.3,128.8,101.0,143.3,55 +123.0,101.5,131.5,126.9,96.7,133.7,122.3,98.9,139.2,56 +118.2,101.0,130.7,121.9,97.3,133.3,115.5,96.3,135.2,57 +114.1,100.9,130.9,117.1,97.5,133.1,109.4,93.8,132.1,58 +111.3,101.0,131.8,113.1,97.4,133.1,104.6,91.9,130.6,59 +110.0,100.9,133.3,110.4,96.7,133.2,101.8,91.1,131.3,60 +110.0,100.8,135.0,108.6,95.8,133.4,100.5,91.2,133.5,61 +110.6,100.6,136.6,107.5,94.9,133.6,100.2,91.8,136.2,62 +111.3,100.4,137.9,106.4,94.3,133.7,100.4,92.5,138.5,63 +111.7,100.3,138.6,105.2,94.4,133.4,100.6,93.1,139.8,64 +111.9,100.2,139.0,104.1,95.0,133.1,101.0,93.4,140.3,65 +112.1,100.3,139.2,103.5,95.9,132.9,101.9,93.6,140.5,66 +112.5,100.4,139.7,104.0,96.8,133.1,103.4,93.7,140.9,67 +113.2,100.5,140.6,105.8,97.6,133.6,105.8,93.9,142.0,68 +113.9,100.7,141.6,108.1,98.2,134.5,108.7,94.3,143.7,69 +114.2,100.6,142.4,110.2,98.8,135.6,111.5,95.2,145.8,70 +113.7,100.4,142.7,111.3,99.2,136.7,113.7,96.8,148.2,71 +112.1,99.9,142.3,110.7,99.5,137.6,115.0,99.1,150.6,72 +110.2,99.7,141.3,109.0,99.9,138.0,115.7,102.2,152.5,73 +109.0,100.2,139.9,107.1,100.5,137.6,116.3,105.7,153.3,74 +109.5,102.2,138.5,105.8,101.6,136.1,117.3,109.5,152.4,75 +112.2,105.9,137.2,105.9,103.2,133.2,119.0,113.2,149.3,76 +116.2,110.3,135.9,107.0,105.2,129.6,120.6,116.3,144.4,77 +120.2,114.5,134.3,108.7,107.4,126.1,121.4,117.9,138.4,78 +122.8,117.3,132.4,110.7,109.5,123.4,120.4,117.3,131.8,79 +123.0,117.9,130.0,112.4,111.2,122.1,117.0,114.2,125.3,80 +121.2,116.5,127.2,113.5,112.4,121.6,112.1,109.4,119.3,81 +118.3,113.9,124.1,113.9,112.5,121.1,106.8,104.2,114.3,82 +114.9,110.7,121.0,113.1,111.3,119.7,102.2,99.8,110.7,83 +111.7,107.4,117.8,111.1,108.5,117.0,99.2,97.1,108.8,84 +108.9,104.4,114.9,108.3,104.8,113.3,97.4,95.9,108.1,85 +106.5,101.8,112.2,105.1,100.8,109.4,96.4,95.4,108,86 +104.6,99.8,110.1,102.2,97.4,105.8,95.6,95.0,107.7,87 +103.2,98.5,108.5,99.9,95.0,103.2,94.5,94.1,106.6,88 +102.1,97.6,107.2,98.1,93.5,101.3,93.3,92.8,104.9,89 +101.1,96.8,106.0,96.5,92.4,99.9,92.0,91.2,103.0,90 +99.8,95.6,104.6,95.0,91.3,98.6,90.7,89.5,101.0,91 +98.2,93.8,102.9,93.1,89.9,97.1,89.6,87.8,99.3,92 +96.4,91.9,101.1,91.3,88.4,95.6,88.6,86.4,97.8,93 +95.0,90.7,99.5,89.6,87.2,94.0,88.0,85.7,96.6,94 +94.3,90.7,98.6,88.3,86.5,92.5,87.7,85.9,95.6,95 diff --git a/src/main/resources/load/lpts_g4.csv b/src/main/resources/load/lpts_g4.csv new file mode 100644 index 000000000..665fc3dab --- /dev/null +++ b/src/main/resources/load/lpts_g4.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +75.3,68.7,74.5,67.2,63.1,67.2,62.2,57.7,62.1,0 +75.5,68.3,73.6,65.9,62.2,66.1,61.2,56.4,60.8,1 +75.7,68.0,72.8,64.8,61.3,64.9,60.1,55.0,59.5,2 +75.6,67.5,72.0,63.9,60.3,63.9,59.4,54.0,58.5,3 +74.8,66.6,71.0,63.2,59.4,63.0,59.1,53.6,58.0,4 +73.6,65.6,70.0,62.7,58.6,62.2,59.2,53.6,57.8,5 +72.3,64.6,69.1,62.4,58.0,61.6,59.4,53.8,57.7,6 +71.1,63.9,68.4,62.1,57.6,61.2,59.4,54.0,57.6,7 +70.3,63.7,68.0,61.8,57.4,61.1,59.1,54.0,57.2,8 +69.8,63.7,67.9,61.6,57.4,61.1,58.6,53.7,56.6,9 +69.5,63.9,67.7,61.3,57.5,61.2,58.0,53.4,56.1,10 +69.3,63.9,67.5,61.2,57.6,61.2,57.6,53.1,55.8,11 +69.0,63.6,67.0,61.1,57.7,61.1,57.5,52.9,55.9,12 +68.8,63.0,66.4,61.1,57.7,60.9,57.5,52.7,56.2,13 +68.6,62.5,65.9,61.1,57.7,60.6,57.6,52.5,56.6,14 +68.4,62.1,65.7,61.2,57.6,60.3,57.6,52.2,56.7,15 +68.3,62.0,65.8,61.3,57.4,60.0,57.4,51.8,56.5,16 +68.3,62.0,66.1,61.4,57.3,59.8,57.2,51.6,56.2,17 +68.3,62.1,66.5,61.6,57.3,59.9,57.1,51.6,56.2,18 +68.4,62.1,66.6,62.1,57.6,60.3,57.6,52.2,56.7,19 +68.4,61.8,66.4,62.7,58.2,61.1,58.7,53.4,58.0,20 +68.3,61.5,65.9,63.3,58.9,62.1,60.2,55.2,59.8,21 +68.1,61.2,65.3,63.5,59.4,62.8,62.0,57.2,61.9,22 +67.5,61.2,64.8,63.0,59.4,63.0,63.9,59.4,63.9,23 +66.9,61.6,64.6,61.9,58.7,62.5,65.9,61.5,65.6,24 +67.7,62.5,65.4,62.0,57.7,62.2,69.3,63.3,67.8,25 +71.8,63.8,67.9,65.2,57.2,63.2,75.6,64.8,71.4,26 +81.0,65.7,72.9,73.8,57.6,66.6,86.4,65.7,77.4,27 +96.3,68.0,80.9,88.9,59.4,73.2,102.5,66.0,86.4,28 +115.4,70.4,91.6,108.6,62.0,83.3,121.9,65.7,98.4,29 +135.3,72.2,104.4,129.7,64.6,96.7,142.0,65.0,113.2,30 +153.0,72.9,118.8,149.4,66.6,113.4,160.2,63.9,130.5,31 +165.9,72.2,133.9,165.2,67.3,132.9,174.4,62.5,149.7,32 +174.7,70.5,148.8,177.2,67.0,153.2,185.0,61.1,169.1,33 +180.5,68.4,162.2,185.8,66.0,171.8,193.2,59.7,186.8,34 +184.5,66.6,172.8,191.7,64.8,186.3,199.8,58.5,200.7,35 +187.6,65.5,179.8,195.3,63.7,194.8,205.7,57.7,209.3,36 +190.3,65.1,183.9,197.3,62.8,198.7,210.9,57.3,213.7,37 +192.5,65.2,186.3,198.3,62.3,199.7,215.3,57.3,215.4,38 +194.4,65.7,188.1,198.9,62.1,199.8,218.7,57.6,216.0,39 +196.0,66.4,190.1,199.5,62.3,200.4,220.8,58.2,216.6,40 +197.5,67.3,192.2,200.2,62.9,201.5,222.0,59.2,217.4,41 +198.7,68.3,194.0,200.9,63.8,202.7,222.4,60.5,218.2,42 +199.8,69.3,195.3,201.6,64.8,203.4,222.3,62.1,218.7,43 +200.6,70.2,195.6,202.1,65.8,203.2,221.9,63.9,218.7,44 +201.4,71.1,195.3,202.7,66.7,202.3,221.4,65.7,218.2,45 +202.3,71.7,194.5,203.3,67.3,200.8,220.9,67.0,217.0,46 +203.4,72.0,193.5,204.3,67.5,198.9,220.5,67.5,215.1,47 +204.7,71.9,192.3,205.4,67.1,196.6,220.1,66.9,212.1,48 +205.5,71.6,190.3,206.1,66.2,193.3,219.4,65.4,207.8,49 +205.1,71.0,186.5,205.4,65.1,188.3,217.6,63.7,201.4,50 +202.5,70.2,180.0,202.5,63.9,180.9,214.2,62.1,192.6,51 +197.0,69.3,170.4,196.5,62.8,170.7,208.4,61.0,181.1,52 +188.7,68.5,159.3,187.7,62.0,159.4,200.2,60.3,168.7,53 +177.5,67.8,148.9,176.1,61.4,149.2,189.3,60.1,157.7,54 +163.8,67.5,141.3,162.0,61.2,142.2,175.5,60.3,150.3,55 +147.7,67.6,138.1,145.8,61.4,139.9,158.9,60.7,148.1,56 +131.0,67.9,139.2,129.0,61.9,142.2,141.2,61.4,151.0,57 +115.3,68.2,143.7,113.1,62.5,148.0,124.2,62.1,157.9,58 +102.6,68.4,151.2,99.9,63.0,156.6,109.8,63.0,168.3,59 +94.1,68.2,160.6,90.4,63.3,166.9,99.4,63.8,180.9,60 +89.2,67.8,170.6,84.1,63.4,177.6,92.5,64.6,194.1,61 +86.7,67.5,179.7,80.1,63.3,186.9,88.2,65.2,205.9,62 +85.5,67.5,186.3,77.4,63.0,193.5,85.5,65.7,214.2,63 +84.5,67.9,189.2,75.1,62.6,196.1,83.6,66.0,217.7,64 +83.5,68.5,189.5,73.3,62.3,196.0,82.5,66.5,218.2,65 +82.3,69.0,188.3,72.2,62.4,194.9,82.4,67.7,217.7,66 +81.0,69.3,187.2,72.0,63.0,194.4,83.7,70.2,218.7,67 +79.4,69.1,186.9,72.8,64.3,195.6,86.2,74.1,222.5,68 +77.8,68.7,187.2,74.0,65.9,197.4,89.3,78.8,227.3,69 +76.7,68.6,186.9,75.2,67.5,197.9,92.1,83.2,230.5,70 +76.5,69.3,185.4,75.6,68.4,195.3,93.6,86.4,229.5,71 +77.3,70.9,181.7,74.9,68.4,188.3,93.2,87.6,222.2,72 +78.7,73.0,175.7,73.7,68.0,177.7,91.8,87.5,209.9,73 +80.1,75.1,167.1,72.7,67.8,164.9,90.4,87.1,194.6,74 +81.0,76.5,155.7,72.9,68.4,151.2,90.0,87.3,178.2,75 +80.9,76.8,141.7,74.7,70.2,137.8,91.4,88.8,162.3,76 +80.3,76.5,127.2,77.6,72.8,125.5,93.7,90.9,147.6,77 +80.1,76.5,114.2,80.9,75.7,115.3,95.8,92.6,134.5,78 +81.0,77.4,105.3,83.7,78.3,108.0,96.3,92.7,123.3,79 +83.4,79.7,101.8,85.5,80.2,103.9,94.4,90.6,114.2,80 +86.7,82.7,102.3,86.1,81.3,102.1,90.8,86.8,107.0,81 +89.5,85.3,104.2,85.8,81.5,101.2,86.3,82.4,101.2,82 +90.9,86.4,105.3,84.6,81.0,99.9,81.9,78.3,96.3,83 +90.0,85.4,103.7,82.6,79.6,97.1,78.3,75.1,92.0,84 +87.5,82.7,100.0,80.2,77.7,93.2,75.5,72.7,88.0,85 +84.1,79.5,95.3,77.4,75.4,88.8,72.9,70.6,84.1,86 +81.0,76.5,90.9,74.7,72.9,84.6,70.2,68.4,80.1,87 +78.7,74.5,87.5,72.1,70.4,81.0,67.1,65.8,75.9,88 +77.1,73.2,85.2,69.9,68.1,78.1,64.0,63.0,71.8,89 +75.9,72.2,83.4,68.0,65.9,75.7,61.3,60.4,68.3,90 +74.7,71.1,81.9,66.6,63.9,73.8,59.4,58.5,65.7,91 +73.3,69.6,80.2,65.6,62.2,72.2,58.6,57.4,64.3,92 +71.8,68.0,78.6,65.0,61.0,70.8,58.5,57.1,63.7,93 +70.4,66.8,77.0,64.4,60.3,69.6,58.7,57.2,63.4,94 +69.3,66.6,75.6,63.9,60.3,68.4,58.5,57.6,63.0,95 diff --git a/src/main/resources/load/lpts_g5.csv b/src/main/resources/load/lpts_g5.csv new file mode 100644 index 000000000..5cdfc79bf --- /dev/null +++ b/src/main/resources/load/lpts_g5.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +91.8,48.8,67.4,75.6,42.5,56.0,66.6,38.9,50.1,0 +118.3,47.8,61.2,97.6,42.0,51.3,87.3,38.4,47.4,1 +145.6,46.6,54.6,121.4,41.6,46.6,111.7,38.1,44.9,2 +168.3,45.3,49.4,143.1,41.3,43.3,137.0,38.3,43.3,3 +182.2,44.3,46.7,159.4,41.1,42.4,160.7,39.2,43.0,4 +188.4,43.4,46.0,170.6,40.9,42.9,180.8,40.5,43.8,5 +189.4,42.8,45.9,177.6,41.0,43.7,195.6,41.7,45.0,6 +187.4,42.3,45.3,181.4,41.3,43.3,203.5,42.3,46.3,7 +184.6,42.0,43.9,182.9,41.9,41.4,203.7,42.0,47.5,8 +182.2,41.9,44.3,183.1,42.6,40.1,198.9,40.9,49.2,9 +181.2,42.0,50.0,182.9,43.1,42.8,192.6,39.6,52.2,10 +182.4,42.3,64.5,183.4,43.3,52.4,188.4,38.3,57.4,11 +186.5,42.8,89.7,185.2,43.0,71.0,189.1,37.4,65.9,12 +192.6,43.3,121.1,188.7,42.2,95.9,194.0,36.9,78.5,13 +199.7,43.9,152.6,193.7,41.3,123.5,201.6,36.9,96.5,14 +206.5,44.3,178.3,200.5,40.3,150.1,210.6,37.3,120.9,15 +212.3,44.6,193.7,208.8,39.5,172.6,219.6,38.0,151.7,16 +217.0,44.8,200.6,217.5,39.0,190.3,228.2,39.0,184.7,17 +221.0,45.0,202.4,225.2,38.9,203.3,236.0,40.2,214.5,18 +224.7,45.3,202.5,230.7,39.3,211.6,242.8,41.3,235.8,19 +228.3,46.0,203.8,233.1,40.4,215.4,248.4,42.3,244.7,20 +231.5,46.8,206.0,232.9,42.0,216.2,252.5,43.4,244.2,21 +234.1,48.0,208.6,231.4,44.0,215.7,255.0,44.7,238.7,22 +235.8,49.4,210.6,229.7,46.3,215.6,255.9,46.3,232.7,23 +236.2,51.0,211.5,228.7,48.8,217.2,255.1,48.5,229.8,24 +235.8,52.7,211.5,228.4,51.2,220.0,253.2,51.0,229.8,25 +234.8,54.2,211.1,228.8,53.2,223.1,250.5,53.4,231.4,26 +233.8,55.4,210.6,229.7,54.4,225.7,247.9,55.4,233.8,27 +232.6,56.2,210.3,230.9,54.8,227.0,245.4,56.8,235.7,28 +230.4,56.5,210.3,230.9,54.4,226.9,242.0,57.6,237.1,29 +225.9,56.6,210.4,228.0,53.5,225.8,236.2,57.8,237.9,30 +217.6,56.4,210.6,220.7,52.4,223.7,226.7,57.4,237.8,31 +204.9,56.2,210.8,207.9,51.3,220.8,212.7,56.6,236.9,32 +189.4,55.9,210.8,191.8,50.4,217.7,196.2,55.7,235.4,33 +173.1,55.6,210.4,175.3,50.1,214.8,180.2,54.8,233.6,34 +158.2,55.4,209.6,161.2,50.4,212.6,167.3,54.4,231.7,35 +146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,36 +137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,37 +131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,38 +128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,39 +126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,40 +125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,41 +125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,42 +124.9,71.5,177.3,121.9,68.5,184.4,130.0,66.5,197.5,43 +124.1,74.4,173.3,118.8,70.6,179.2,125.6,68.2,192.0,44 +123.2,76.7,169.7,116.9,72.4,174.3,122.7,69.6,186.8,45 +122.6,78.4,165.6,116.5,73.7,168.9,121.4,70.7,181.1,46 +122.9,79.6,160.2,117.9,74.6,162.2,121.9,71.5,174.3,47 +124.4,80.2,153.0,120.8,74.8,153.7,124.1,72.0,165.9,48 +125.9,80.1,144.7,123.8,74.4,144.2,126.4,72.1,156.2,49 +125.9,79.2,136.0,124.8,73.3,134.6,127.0,71.7,146.1,50 +122.9,77.6,128.0,121.9,71.5,125.9,123.9,70.5,136,51 +116.0,75.1,121.3,113.9,69.1,119.1,116.1,68.7,126.7,52 +106.4,72.1,116.6,102.6,66.3,114.2,105,66.3,118.7,53 +96.0,69.1,114.0,90.3,63.7,111.1,93.1,63.8,112.6,54 +86.6,66.5,113.9,79.6,61.5,109.8,82.6,61.5,108.8,55 +79.8,64.6,116.3,72.3,60.0,110.1,75.3,59.5,107.7,56 +75.6,63.5,120.1,68.1,59.3,111.4,70.8,58.0,108.4,57 +73.6,63.1,123.8,66.1,59.2,112.9,68.2,57.0,109.8,58 +73.6,63.5,125.9,65.5,59.4,113.9,66.5,56.4,110.8,59 +75.0,64.4,125.5,65.5,59.9,113.8,64.9,56.3,110.7,60 +77.2,65.7,123.0,65.7,60.4,112.9,63.5,56.5,109.5,61 +79.4,66.8,119.5,65.8,60.6,111.4,62.3,56.9,107.7,62 +80.6,67.5,115.9,65.5,60.5,109.8,61.5,57.4,105.8,63 +80.3,67.4,113.0,64.6,59.7,108.3,61.1,57.9,104.1,64 +78.8,66.8,110.9,63.6,58.9,107.1,61.5,58.6,103.1,65 +76.7,66.0,109.5,63.0,58.3,106.2,62.5,59.7,103.1,66 +74.6,65.5,108.8,63.5,58.4,105.8,64.5,61.5,104.8,67 +72.8,65.4,108.5,65.4,59.7,105.8,67.3,64.1,108.1,68 +71.2,65.5,108.2,68.2,61.5,105.8,70.5,67.1,112.2,69 +69.5,65.3,107.1,71.2,63.3,105.3,73.5,70.1,115.9,70 +67.5,64.5,104.8,73.6,64.5,103.8,75.6,72.5,117.9,71 +65.0,62.7,100.7,74.8,64.6,100.8,76.3,74,117.3,72 +62.3,60.3,95.2,74.8,63.7,96.7,75.9,74.4,114.2,73 +59.9,57.8,89.0,73.7,62.2,91.9,74.6,73.6,109.2,74 +58.4,55.4,82.6,71.5,60.5,86.6,72.5,71.5,102.8,75 +58.1,53.7,76.6,68.6,58.6,81.5,70.1,68.3,95.3,76 +58.5,52.5,71.2,65.3,56.8,76.5,67.5,64.4,87.7,77 +59.2,51.8,66.7,62.0,55.1,72.2,64.9,60.5,80.5,78 +59.4,51.4,63.5,59.4,53.4,68.5,62.5,57.4,74.6,79 +59.0,51.2,61.6,57.8,51.8,65.8,60.4,55.6,70.4,80 +57.8,51.1,60.6,56.9,50.5,63.8,58.6,54.6,67.6,81 +56.2,50.9,60.1,56.3,49.3,62.5,57.0,54.1,65.5,82 +54.4,50.4,59.4,55.4,48.4,61.5,55.4,53.4,63.5,83 +52.6,49.4,58.3,54.1,47.7,60.6,53.9,52.2,61.1,84 +51.0,48.2,57.0,52.4,47.3,59.9,52.2,50.5,58.5,85 +49.5,47.1,55.8,50.7,46.9,59.2,50.4,48.5,56.1,86 +48.4,46.3,55.4,49.4,46.3,58.4,48.4,46.3,54.4,87 +47.6,46.2,56.0,48.6,45.6,57.7,46.1,44.1,53.6,88 +47.1,46.4,57.7,48.1,44.6,57.1,43.8,42.0,53.6,89 +47.1,46.9,60.2,47.8,43.5,56.9,41.8,40.0,53.9,90 +47.4,47.4,63.5,47.4,42.3,57.4,40.3,38.3,54.4,91 +48.0,47.7,67.3,46.5,41.1,58.7,39.6,36.9,54.7,92 +48.7,47.9,70.6,45.5,40.1,60.1,39.4,36.0,54.6,93 +49.3,48.1,72.4,44.3,39.4,60.6,39.4,35.8,53.9,94 +49.4,48.4,71.5,43.3,39.3,59.4,39.3,36.3,52.4,95 diff --git a/src/main/resources/load/lpts_g6.csv b/src/main/resources/load/lpts_g6.csv new file mode 100644 index 000000000..769fdadf5 --- /dev/null +++ b/src/main/resources/load/lpts_g6.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +60.0,85.6,56.8,64.7,98.7,61,67.5,100.3,62.1,0 +59.4,79.0,52.0,63.4,91.2,54.9,67.8,91.1,55.6,1 +59.4,73.6,48.0,63.0,84.5,49.9,68.5,83.4,50.1,2 +58.9,69.3,45.0,62.4,78.5,46.2,68.1,77.4,46.2,3 +57.1,65.8,43.0,60.4,73.1,43.7,65.4,73.2,44.0,4 +54.3,63.0,41.8,57.5,68.1,42.1,61.0,70.5,43.0,5 +51.3,60.4,41.0,54.1,63.8,41.1,56.1,68.6,42.8,6 +48.5,57.7,40.4,50.8,60.0,40.4,52.0,67.0,42.7,7 +46.5,54.8,39.7,48.1,57.0,39.7,49.4,65.1,42.3,8 +45.2,51.7,39.1,45.9,54.3,39.0,48.1,63.0,41.7,9 +44.4,48.7,38.5,44.1,52.0,38.5,47.6,60.9,40.9,10 +43.9,46.2,38.1,42.7,49.7,38.1,47.3,58.9,40.4,11 +43.4,44.3,38.0,41.6,47.2,38.0,46.9,57.1,40.2,12 +43.0,42.8,38.1,40.6,44.7,38.1,46.4,55.4,40.2,13 +42.4,41.6,38.2,39.8,42.4,38.2,45.7,53.8,40.3,14 +41.6,40.4,38.1,39.3,40.4,38.1,45.0,52.0,40.4,15 +40.6,39.2,37.7,38.8,38.9,37.8,44.5,50.0,40.3,16 +39.5,38.0,37.2,38.5,37.8,37.4,44.0,48.0,40.2,17 +38.6,37.2,36.9,38.3,37.1,37.0,43.8,46.3,40.2,18 +38.1,37.0,37.0,38.1,37.0,37.0,43.9,45.0,40.4,19 +38.2,37.5,37.6,37.9,37.2,37.3,44.2,44.4,40.9,20 +38.7,38.3,38.6,37.7,37.5,37.9,44.7,44.3,41.6,21 +39.5,39.1,39.6,37.4,37.5,38.6,45.1,44.2,42.3,22 +40.4,39.3,40.4,37.0,37.0,39.3,45.0,43.9,42.7,23 +41.3,38.6,40.8,36.4,35.7,39.8,44.6,43.2,42.9,24 +42.3,37.7,41.0,36.3,34.5,40.4,44.0,42.5,43.0,25 +43.9,37.7,41.5,37.0,34.6,41.2,44.0,42.6,43.6,26 +46.2,39.3,42.7,39.3,37.0,42.7,45.0,43.9,45.0,27 +49.5,43.2,45.0,43.3,42.3,45.0,47.5,46.9,47.7,28 +53.4,49.1,48.3,48.5,49.8,48.1,51.1,51.1,51.7,29 +57.5,56.1,52.6,54.0,58.0,52.0,55.5,55.7,57.0,30 +61.2,63.5,57.7,58.9,65.8,56.6,60.0,60.0,63.5,31 +64.3,70.9,63.6,62.6,72.3,61.8,64.5,63.8,71.1,32 +67.2,78.3,69.6,65.6,78.7,67.5,68.6,68.3,79.2,33 +70.2,86.1,75.2,68.7,86.4,73.1,72.1,75.4,86.9,34 +73.9,94.7,79.7,72.8,97.0,78.5,75.1,86.6,93.5,35 +78.7,104.4,82.8,78.3,111.6,83.4,77.5,103.2,98.6,36 +84.7,115.4,85.2,85.5,129.1,88.1,80.8,123.6,102.6,37 +91.9,127.9,87.7,94.1,147.9,92.9,86.8,145.8,106.4,38 +100.5,142.0,91.2,103.9,166.3,98.2,97.0,167.4,110.9,39 +110.2,157.7,96.5,114.8,183.1,104.3,112.5,186.9,116.8,40 +120.3,173.7,103.5,126.0,198.4,111.6,131.1,203.9,124.4,41 +129.7,188.2,111.8,136.5,213.1,120.6,150.0,218.5,133.9,42 +137.4,199.8,121.3,145.5,227.5,131.6,166.3,231.0,145.5,43 +142.7,207.2,131.4,152.3,242.0,144.7,177.7,241.2,159.0,44 +145.9,211.0,141.2,157.1,255.2,158.3,184.6,249.2,172.7,45 +147.4,212.5,149.8,160.1,265.6,170.4,187.8,254.7,184.3,46 +147.8,212.5,155.9,161.7,271.4,179.0,188.2,257.5,191.7,47 +147.5,212.0,158.9,162.1,271.6,182.7,186.8,257.7,193.5,48 +146.8,211.5,159.2,161.8,267.8,182.6,184.3,256.1,191.1,49 +145.7,211.2,157.5,161.1,262.4,180.1,181.4,253.8,186.7,50 +144.3,211.3,154.7,160.5,257.5,176.7,179.0,251.7,182.5,51 +143.0,211.8,151.3,160.3,254.9,173.6,177.5,250.6,179.8,52 +142.1,211.7,147.2,160.7,253.3,170.1,177.0,249.1,177.6,53 +142.4,209.7,141.9,161.8,250.9,165.3,177.2,245.5,174.1,54 +144.3,204.4,135.1,164.0,246.0,158.2,177.8,237.9,167.4,55 +148.4,195.1,126.7,167.1,237.1,148.2,178.8,225.3,156.5,56 +154.0,183.1,117.8,170.9,225.2,136.6,179.9,209.3,143.2,57 +160.6,170.2,109.4,174.7,211.5,125.1,181.2,192.3,130.2,58 +167.4,158.2,102.8,177.8,197.5,115.5,182.5,176.7,120.1,59 +173.8,148.6,98.9,180.0,184.2,109.0,183.7,164.2,114.8,60 +179.2,141.2,97.3,181.2,171.9,105.2,184.8,154.7,113.5,61 +183.1,135.3,97.3,181.6,160.6,103.4,185.5,147.5,114.2,62 +184.8,130.5,98.2,181.3,150.1,102.8,185.9,142.0,115.5,63 +184.1,126.4,99.3,180.7,140.8,102.7,186.0,137.9,116.0,64 +182.1,123.6,100.8,180.5,133.8,103.7,186.9,136.1,116.6,65 +179.9,123.1,103.0,181.6,130.7,106.2,189.9,138.2,118.7,66 +179.0,125.9,106.2,184.8,132.8,110.9,196.3,145.5,123.6,67 +180.3,132.5,110.6,190.7,141.1,118.1,207.0,158.9,132.1,68 +183.8,142.1,115.8,198.9,154.4,127.2,220.8,176.8,143.0,69 +189.2,153.8,121.4,208.8,170.7,137.4,236.3,196.9,154.6,70 +196.3,166.3,127.0,219.4,188.2,147.8,251.7,217.1,165.1,71 +204.6,178.7,132.3,230.2,205.2,157.6,265.8,235.2,173.3,72 +213.4,190.1,137.1,240.7,220.5,166.3,277.9,249.8,179.3,73 +221.7,199.7,141.5,250.3,232.9,173.6,287.6,259.6,183.7,74 +228.6,206.7,145.5,258.7,241.3,179.0,294.5,263.3,187.1,75 +233.6,210.6,149.1,265.2,245.2,182.4,298.1,260.3,189.8,76 +236.4,212.0,152.2,269.8,245.3,184.2,298.7,252.5,192.1,77 +237.4,211.6,154.5,271.9,242.8,185.1,296.3,242.6,193.9,78 +236.7,210.2,155.9,271.4,239.0,185.9,291.0,233.3,195.2,79 +234.5,208.4,156.3,268.1,234.9,187.0,283.1,226.5,195.9,80 +231.0,206.0,155.8,262.6,230.1,188.0,273.4,221.6,195.8,81 +226.3,202.5,154.8,255.8,224.3,188.2,262.6,217.3,194.5,82 +220.6,197.5,153.6,248.3,217.1,187.1,251.7,212.5,191.7,83 +213.9,190.5,152.2,240.7,208.0,184.0,241.3,205.9,187.0,84 +206.1,182.0,150.0,232.6,197.2,178.9,231.2,197.3,180.2,85 +197.2,172.2,146.1,223.4,184.8,171.4,220.9,186.5,171.4,86 +187.1,161.7,139.7,212.5,170.9,161.7,210.2,173.2,160.5,87 +175.6,150.7,130.3,199.4,155.9,149.6,198.6,157.6,147.6,88 +163.1,139.2,118.7,184.8,140.2,136.0,186.3,140.7,133.5,89 +150.3,127.1,106.4,169.6,124.6,122.0,173.5,123.9,119.4,90 +137.4,114.3,94.7,154.7,109.7,108.5,160.5,108.5,106.2,91 +125.1,100.9,84.5,141.0,96.0,96.4,147.5,95.6,95.0,92 +113.5,87.5,76.0,128.5,83.9,85.8,134.7,84.9,85.4,93 +102.9,75.1,68.7,117.3,73.4,76.4,122.4,76.0,76.9,94 +93.5,64.7,62.4,107.4,64.7,68.1,110.9,68.1,69.3,95 diff --git a/src/main/resources/load/lpts_h0.csv b/src/main/resources/load/lpts_h0.csv new file mode 100644 index 000000000..673ac0535 --- /dev/null +++ b/src/main/resources/load/lpts_h0.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +89.8,100.1,86.3,80.2,93.4,77.8,70.8,87.5,67.6,0 +84.9,92.5,76.9,75.1,86.8,69.6,68.2,81.1,60.8,1 +80.7,85.9,68.8,70.7,81.2,62.4,65.9,75.0,54.9,2 +76.6,79.9,62.4,66.6,75.7,56.6,63.3,69.1,49.9,3 +71.7,74.1,58.0,62.3,70.1,52.5,59.5,63.4,46.2,4 +66.6,68.7,55.3,58.0,64.5,49.7,55.0,58.2,43.6,5 +61.6,63.9,53.6,54.1,59.3,47.9,50.5,53.6,41.9,6 +57.4,59.9,52.4,50.8,54.9,46.6,46.6,49.9,40.8,7 +54.5,57.0,51.3,48.4,51.7,45.5,43.9,47.3,40.1,8 +52.6,55.0,50.3,46.8,49.4,44.5,42.3,45.5,39.6,9 +51.4,53.5,49.2,45.7,47.8,43.8,41.4,44.2,39.4,10 +50.8,52.4,48.3,44.9,46.6,43.3,40.8,43.3,39.1,11 +50.3,51.5,47.5,44.4,45.5,43.0,40.3,42.4,38.8,12 +50.0,50.8,46.9,43.9,44.5,43.0,39.9,41.5,38.6,13 +49.9,50.2,46.5,43.5,43.8,43.1,39.5,40.7,38.3,14 +49.9,49.9,46.6,43.3,43.3,43.3,39.1,40.0,38.3,15 +50.1,49.9,47.1,43.1,43.1,43.4,38.8,39.3,38.4,16 +50.4,50.0,48.0,43.1,43.1,43.7,38.5,38.8,38.8,17 +50.7,50.1,49.3,43.1,43.2,44.2,38.3,38.5,39.3,18 +50.8,49.9,50.8,43.3,43.3,44.9,38.3,38.3,40.0,19 +50.8,49.5,52.7,43.6,43.3,46.3,38.5,38.3,40.9,20 +50.9,48.9,55.6,44.2,43.3,48.9,39.1,38.4,43.1,21 +51.6,48.4,60.5,45.4,43.2,53.7,40.3,38.7,47.7,22 +53.3,48.3,68.2,47.4,43.3,61.6,42.4,39.1,55.8,23 +56.2,48.7,79.2,50.5,43.5,72.9,45.6,39.7,68.0,24 +60.4,49.8,92.0,54.9,44.3,86.3,49.9,40.4,82.8,25 +65.8,51.9,104.7,60.7,46.0,100.1,55.3,41.3,98.0,26 +72.4,54.9,115.7,68.2,49.1,112.4,61.6,42.4,111.5,27 +80.0,59.2,123.5,77.5,53.9,121.8,68.9,44.0,121.6,28 +88.5,64.9,128.6,87.9,60.4,128.5,77.1,46.6,128.5,29 +97.4,72.3,132.0,98.6,68.8,132.9,86.1,51.1,132.7,30 +106.5,81.6,134.8,109.0,79.1,135.7,95.7,58.3,134.8,31 +115.6,92.9,137.8,118.4,91.1,137.2,105.8,68.6,135.4,32 +124.4,105.6,140.7,126.7,104.3,137.7,115.8,81.3,134.8,33 +132.8,119.0,143.2,133.8,118.0,137.7,124.9,95.2,133.1,34 +140.7,132.3,144.8,139.8,131.5,137.3,132.3,109.0,130.7,35 +147.8,144.8,145.3,144.7,144.2,136.9,137.6,121.9,127.7,36 +154.0,156.2,144.9,148.8,155.5,136.4,141.1,133.7,124.6,37 +158.9,166.0,143.8,152.4,165.3,135.7,143.3,144.4,121.5,38 +162.3,174.0,142.3,155.6,173.1,134.8,144.8,154.0,119.0,39 +164.1,180.0,140.8,158.9,178.8,133.7,146.0,162.6,117.3,40 +164.7,184.6,139.5,162.0,183.1,132.4,147.2,170.5,116.2,41 +165.0,188.7,138.5,164.9,187.0,131.4,148.4,178.0,115.7,42 +165.6,193.1,138.2,167.3,191.4,130.7,149.8,185.6,115.7,43 +167.1,198.3,138.6,169.2,197.0,130.6,151.5,193.3,116.1,44 +169.4,203.7,140.1,170.8,203.0,131.5,153.5,200.6,117.0,45 +172.4,208.7,142.6,172.5,208.5,133.6,156.0,206.6,118.7,46 +175.6,212.2,146.5,174.8,212.2,137.3,159.0,210.6,121.5,47 +179.0,213.7,151.5,177.7,213.5,142.6,162.4,211.8,125.4,48 +181.9,212.8,156.7,180.8,211.8,148.2,165.8,210.2,129.6,49 +183.7,209.0,160.7,183.1,207.0,152.8,168.4,205.9,133.0,50 +183.9,202.3,162.3,183.9,198.9,154.8,169.8,198.9,134.8,51 +182.1,192.4,160.5,182.7,187.6,153.2,169.4,189.6,134.2,52 +178.7,180.9,156.1,179.8,174.6,148.9,167.6,178.7,131.7,53 +174.1,169.2,150.2,175.8,161.7,143.2,164.8,167.3,128.0,54 +169.0,159.0,144.0,171.5,150.6,137.3,161.5,156.5,124.0,55 +163.7,151.4,138.4,167.2,142.8,132.4,158.1,147.0,120.2,56 +158.9,146.0,133.6,163.1,137.6,128.4,154.9,138.9,116.8,57 +154.6,141.6,129.4,159.2,133.9,124.8,151.8,132.1,113.7,58 +151.5,137.3,125.7,155.6,130.7,121.5,149.0,126.5,110.7,59 +149.6,132.4,122.4,152.3,127.1,118.1,146.5,122.0,107.9,60 +148.6,127.0,119.6,149.5,123.1,114.8,144.4,118.1,105.5,61 +148.0,121.6,117.4,147.2,119.0,111.7,142.7,114.8,103.5,62 +147.3,116.5,115.7,145.7,114.9,109.0,141.5,111.5,102.4,63 +146.2,112.2,114.6,145.0,111.0,106.9,140.9,108.3,102.2,64 +145.0,108.9,114.2,145.4,107.7,105.7,141.7,105.9,103.2,65 +144.1,106.7,114.6,146.7,105.6,105.5,144.9,105.2,105.6,66 +144.0,105.7,115.7,149.0,104.9,106.5,151.5,107.4,109.9,67 +144.9,106.1,117.6,152.3,106.0,109.1,161.9,112.9,116.0,68 +146.9,107.7,120.3,156.4,108.8,113.1,174.6,120.9,123.7,69 +150.0,110.4,123.9,161.5,113.2,118.3,187.4,130.0,132.6,70 +154.0,114.0,128.2,167.3,119.0,124.8,198.1,139.0,142.3,71 +158.8,118.3,133.2,173.7,126.0,132.4,205.2,146.8,152.4,72 +164.0,123.4,138.9,180.4,133.7,140.6,209.1,153.5,162.2,73 +169.2,129.2,145.1,186.7,141.5,149.1,211.1,159.7,171.2,74 +174.0,135.7,151.5,192.3,149.0,157.3,212.2,165.6,178.9,75 +177.8,142.8,157.9,196.5,155.5,164.9,213.2,171.5,184.7,76 +180.5,149.8,163.8,199.0,160.6,171.1,213.0,176.4,188.2,77 +181.8,155.7,168.3,199.4,163.6,175.2,210.4,179.1,188.9,78 +181.4,159.8,170.6,197.3,164.0,176.5,203.9,178.1,186.4,79 +179.3,161.4,170.4,192.4,161.5,174.5,192.9,172.9,180.7,80 +175.7,160.8,168.3,185.2,157.1,170.5,179.0,164.7,172.7,81 +171.0,159.0,165.3,176.6,152.2,165.7,164.4,155.6,163.9,82 +165.6,156.5,162.3,167.3,148.2,161.5,151.5,147.3,155.6,83 +160.1,153.9,160.1,157.9,145.9,158.9,141.9,141.4,148.9,84 +155.1,151.5,158.4,149.5,144.7,157.2,135.3,137.2,143.4,85 +151.1,149.3,156.8,142.9,143.6,155.4,131.0,133.7,138.4,86 +149.0,147.3,154.8,139.0,141.5,152.3,128.2,129.8,133.2,87 +148.9,145.4,151.9,138.3,137.5,147.2,126.1,124.8,127.2,88 +149.6,143.0,147.9,139.2,131.8,140.3,124.1,118.6,120.5,89 +149.4,139.2,142.5,139.5,124.7,132.1,121.6,111.6,113.3,90 +146.5,133.2,135.7,137.3,116.5,123.2,118.2,104.0,105.7,91 +139.8,124.4,127.2,131.1,107.6,114.0,113.4,96.2,98.0,92 +130.3,113.8,117.5,121.9,98.4,104.8,107.4,88.4,90.2,93 +119.5,102.5,107.1,111.5,89.2,95.6,100.8,80.7,82.5,94 +109.0,91.6,96.5,101.5,80.7,86.6,94.1,73.2,74.9,95 diff --git a/src/main/resources/load/lpts_l0.csv b/src/main/resources/load/lpts_l0.csv new file mode 100644 index 000000000..0d0fb954a --- /dev/null +++ b/src/main/resources/load/lpts_l0.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +67.2,62.6,66.1,71.4,64.8,70.3,73.9,68.3,72.4,0 +65.6,60.6,63.1,69.4,62.7,67.1,73.0,66.0,69.4,1 +64.3,58.9,60.5,68.0,61.3,64.3,72.6,64.3,66.9,2 +63.0,57.4,58.4,66.7,60.2,62.1,72.3,63.0,64.8,3 +61.4,56.2,56.7,65.3,59.2,60.3,71.5,62.1,63.2,4 +59.7,55.2,55.4,63.9,58.2,59.1,70.4,61.4,61.9,5 +58.0,54.4,54.4,62.4,57.3,58.1,69.1,60.8,61.0,6 +56.5,53.7,53.7,61.1,56.5,57.4,67.6,60.2,60.2,7 +55.2,53.2,53.2,60.0,55.8,56.9,66.2,59.5,59.6,8 +54.2,52.7,52.7,59.1,55.3,56.4,64.8,58.8,59.2,9 +53.4,52.3,52.3,58.3,54.9,56.0,63.4,58.0,58.8,10 +52.8,51.9,51.9,57.4,54.7,55.6,62.1,57.4,58.4,11 +52.3,51.4,51.4,56.6,54.6,55.1,60.7,57.0,57.9,12 +51.8,50.9,51.0,55.7,54.6,54.5,59.4,56.7,57.4,13 +51.4,50.5,50.5,55.1,54.7,54.1,58.3,56.6,56.9,14 +50.9,50.0,50.0,54.7,54.7,53.7,57.4,56.5,56.5,15 +50.5,49.6,49.6,54.6,54.5,53.6,56.9,56.4,56.3,16 +50.2,49.4,49.4,54.7,54.3,53.7,56.8,56.5,56.3,17 +50.0,49.5,49.5,55.1,54.3,54.0,57.0,56.8,56.6,18 +50.0,50.0,50.0,55.6,54.7,54.7,57.4,57.4,57.4,19 +50.3,51.2,51.2,56.1,55.5,55.6,58.2,58.5,58.8,20 +50.9,53.1,52.9,56.6,57.3,57.2,59.2,60.5,60.9,21 +51.7,56.0,55.3,57.4,60.3,59.8,60.5,63.7,63.8,22 +52.8,60.2,58.4,58.4,64.8,63.9,62.1,68.5,67.6,23 +54.4,65.8,62.2,59.9,71.3,69.8,64.1,75.3,72.5,24 +57.2,73.2,67.4,62.9,79.8,77.6,67.4,84.1,79.0,25 +62.2,82.6,74.8,68.8,90.6,87.6,72.9,94.8,87.7,26 +70.4,94.5,85.2,78.7,103.7,100.0,81.5,107.4,99.1,27 +82.4,108.8,98.9,93.4,119.3,114.8,93.9,121.9,113.6,28 +97.4,124.7,114.9,111.6,136.3,131.3,109.4,137.8,130.5,29 +114.2,141.0,131.8,131.4,153.8,148.6,126.9,155.0,148.9,30 +131.5,156.5,148.2,151.0,170.4,165.8,145.4,173.2,167.7,31 +148.2,170.1,162.6,168.6,185.3,181.9,163.8,191.7,185.8,32 +162.8,180.5,173.9,183.2,197.0,195.1,181.0,208.6,201.7,33 +173.8,186.6,180.6,193.7,204.6,203.4,195.6,221.4,213.6,34 +179.7,187.1,181.6,199.2,206.6,204.7,206.6,227.9,219.5,35 +179.6,181.6,176.1,198.9,202.4,198.0,212.9,226.4,218.5,36 +174.9,171.8,166.1,194.1,193.4,185.5,214.6,218.6,211.6,37 +167.2,160.1,154.1,186.2,181.5,170.6,212.1,206.6,200.8,38 +158.4,149.1,142.6,176.9,168.6,156.5,205.6,192.7,188.0,39 +150.1,140.8,133.8,167.6,156.5,145.9,195.9,178.9,175.0,40 +143.4,135.6,128.2,159.6,146.4,139.0,185.0,167.0,163.4,41 +139.1,133.7,125.8,154.0,139.6,135.5,175.4,158.1,154.5,42 +138.0,135.2,126.9,151.9,137.1,135.2,169.5,153.8,150.1,43 +140.4,139.9,131.2,153.9,139.4,137.5,168.9,154.6,150.7,44 +144.4,145.6,136.6,157.9,144.3,140.7,171.3,158.2,154.1,45 +147.5,149.8,140.9,161.3,148.8,143.1,173.5,161.5,157.4,46 +147.3,150.1,141.7,161.2,150.1,142.6,172.3,161.2,157.5,47 +142.0,144.6,137.4,155.8,146.0,138.2,165.4,155.2,152.2,48 +133.1,135.3,129.4,146.7,138.1,130.9,154.5,145.4,143.2,49 +122.7,124.5,119.9,135.9,128.5,122.5,142.0,134.4,132.7,50 +113.0,114.9,111.2,126.0,119.5,114.9,130.6,125.0,123.2,51 +105.7,108.4,104.8,118.5,112.9,109.4,122.1,119.4,116.5,52 +100.6,104.7,100.8,113.1,108.6,105.9,116.1,116.9,112.5,53 +96.8,102.8,98.5,108.8,105.7,103.9,111.6,116.1,110.3,54 +93.6,101.9,97.3,104.7,103.7,102.8,107.4,115.8,109.3,55 +90.3,101.1,96.5,100.0,102.0,102.1,102.9,114.8,108.8,56 +87.1,100.4,96.2,95.3,100.5,101.7,98.2,113.2,108.5,57 +84.4,99.7,96.2,91.1,99.2,101.4,94.0,111.3,108.4,58 +82.4,99.1,96.3,88.0,98.2,101.0,90.8,109.3,108.4,59 +81.5,98.6,96.7,86.6,97.4,100.4,88.9,107.5,108.3,60 +81.3,98.1,97.0,86.3,96.7,99.9,88.2,106.1,108.3,61 +81.4,97.7,97.2,86.7,96.1,99.4,88.0,105.4,108.6,62 +81.5,97.3,97.3,87.1,95.4,99.1,88.0,105.6,109.3,63 +81.3,96.9,97.0,87.1,94.7,99.2,87.9,106.9,110.6,64 +81.3,96.9,96.8,87.3,94.5,99.9,88.5,109.8,113.1,65 +81.8,97.5,97.1,88.5,95.8,101.6,90.9,114.4,117.4,66 +83.4,99.1,98.2,91.7,99.1,104.7,96.3,121.3,124.1,67 +86.6,102.1,100.6,97.4,105.2,109.4,105.5,130.7,133.7,68 +91.7,106.8,104.8,105.7,114.0,116.2,117.8,142.4,146.0,69 +99.2,113.7,111.5,116.2,125.3,125.6,132.7,156.1,160.5,70 +109.3,123.2,121.3,128.8,138.9,138.0,149.1,171.4,176.9,71 +122.1,135.4,134.4,142.9,154.5,153.5,166.4,187.8,194.5,72 +135.8,148.9,148.9,157.3,170.3,170.2,183.4,204.1,211.5,73 +148.6,161.8,162.6,170.7,184.6,185.8,199.0,218.5,226.1,74 +158.4,172.3,173.2,181.6,195.4,198.2,212.1,229.7,236.2,75 +163.6,178.8,178.9,188.7,201.4,205.5,221.5,236.2,240.4,76 +164.4,181.1,179.8,191.7,202.7,207.5,226.2,237.4,238.7,77 +161.5,179.2,176.5,190.6,199.9,204.7,224.9,232.9,231.5,78 +155.6,173.2,169.5,185.3,193.6,197.3,216.8,222.3,219.5,79 +147.4,163.4,159.6,175.8,184.4,185.9,201.3,205.7,203.4,80 +137.8,151.4,148.1,163.7,173.4,172.1,181.3,185.5,184.9,81 +127.9,138.9,136.4,150.5,161.6,157.7,160.3,164.7,166.1,82 +118.6,127.8,126.0,138.0,150.1,144.5,141.7,146.4,149.1,83 +110.7,119.5,117.9,127.4,139.6,133.8,128.3,132.6,135.6,84 +104.1,113.5,111.9,118.8,130.3,125.5,119.3,123.0,125.2,85 +98.5,108.8,107.1,111.6,122.1,118.8,113.2,116.3,117.3,86 +93.6,104.7,102.8,105.6,114.9,113.0,108.4,111.2,111.2,87 +88.9,100.2,98.5,100.3,108.4,107.7,103.7,106.6,106.1,88 +84.6,95.4,94.1,95.5,102.5,102.5,98.8,102.1,101.7,89 +80.6,90.4,89.6,90.9,97.0,97.6,93.9,97.6,97.7,90 +76.9,85.2,85.2,86.1,91.7,92.6,88.9,92.6,93.6,91 +73.4,80.0,81.0,81.1,86.4,87.7,84.0,87.2,89.1,92 +70.3,75.0,76.9,76.1,81.2,82.9,79.3,81.6,84.6,93 +67.4,70.5,73.1,71.5,76.4,78.3,75.0,76.5,80.1,94 +64.8,66.7,69.5,67.6,72.3,74.1,71.3,72.3,76.0,95 diff --git a/src/main/resources/load/lpts_l1.csv b/src/main/resources/load/lpts_l1.csv new file mode 100644 index 000000000..61be35c0e --- /dev/null +++ b/src/main/resources/load/lpts_l1.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +58.2,53.8,57.7,64.9,60.4,64.4,67.9,63.5,66.7,0 +57.3,53.3,56.2,63.8,59.6,62.6,67.6,62.2,64.8,1 +56.7,53.0,54.9,62.9,59.1,61.0,67.8,61.4,63.2,2 +56.1,52.6,53.7,61.9,58.4,59.6,67.8,60.8,61.9,3 +55.2,51.7,52.6,60.6,57.3,58.2,67.3,59.9,60.8,4 +54.2,50.6,51.6,59.1,56.1,57.0,66.5,59.0,59.8,5 +53.3,49.6,50.8,57.9,55.1,56.2,65.4,58.1,59.0,6 +52.6,49.1,50.2,57.2,54.9,56.1,64.3,57.2,58.4,7 +52.2,49.1,50.1,57.4,55.7,56.7,63.2,56.7,58.0,8 +52.0,49.6,50.2,58.0,57.0,57.6,62.3,56.3,57.7,9 +51.8,50.1,50.3,58.5,58.1,58.3,61.5,56.1,57.5,10 +51.4,50.2,50.2,58.4,58.4,58.4,60.8,56.1,57.2,11 +50.7,49.8,49.9,57.5,57.4,57.5,60.1,56.2,57.0,12 +49.7,48.9,49.2,55.9,55.5,55.9,59.5,56.3,56.7,13 +48.7,47.8,48.5,54.1,53.3,54.1,59.0,56.3,56.4,14 +47.9,46.7,47.9,52.6,51.4,52.6,58.4,56.1,56.1,15 +47.4,46.0,47.4,51.6,50.4,51.7,57.8,55.5,55.7,16 +47.3,45.6,47.2,51.1,50.3,51.5,57.3,54.9,55.5,17 +47.5,45.8,47.4,51.1,51.0,51.8,57.1,54.6,55.6,18 +47.9,46.7,47.9,51.4,52.6,52.6,57.2,54.9,56.1,19 +48.5,48.5,48.9,52.1,54.9,53.8,58.0,56.1,57.2,20 +49.3,51.1,50.7,53.1,58.1,55.9,59.3,58.6,59.4,21 +50.3,54.8,53.4,54.8,62.4,59.2,61.4,62.8,62.7,22 +51.4,59.6,57.2,57.2,67.8,64.3,64.3,68.9,67.8,23 +53.1,65.8,62.8,60.8,74.7,71.5,68.2,77.5,74.8,24 +57.1,75.1,71.2,67.0,84.4,81.9,74.7,89.2,84.9,25 +66.0,89.1,84.0,77.3,98.3,96.3,85.3,104.8,98.9,26 +81.8,109.8,102.8,93.5,118.0,115.7,101.6,125.0,118.0,27 +105.9,137.8,128.1,116.4,144.0,140.3,124.9,150.1,142.5,28 +135.6,169.2,156.9,144.2,173.6,168.1,153.4,178.5,170.9,29 +167.0,198.9,185.2,174.4,203.1,196.6,185.3,208.2,200.8,30 +196.3,222.0,209.1,204.5,229.0,223.1,218.5,237.2,230.2,31 +220.0,234.3,225.3,231.5,248.0,245.1,250.4,263.0,256.4,32 +235.9,236.2,232.6,252.2,258.5,259.7,276.9,282.1,276.3,33 +241.9,229.0,230.9,262.7,259.2,264.2,293.5,290.8,286.3,34 +236.0,213.8,219.6,259.4,248.9,255.9,295.6,285.1,282.7,35 +217.4,192.5,199.4,240.3,227.3,233.6,280.5,263.1,263.8,36 +190.6,168.3,174.1,210.7,198.8,202.5,252.9,230.4,234.4,37 +161.4,144.9,148.5,177.8,169.1,169.5,219.2,194.8,201.1,38 +135.5,126.2,127.3,148.4,143.7,141.4,185.8,163.6,170.6,39 +117.5,114.8,114.4,128.2,126.8,123.3,158.0,142.8,148.1,40 +107.1,109.9,108.7,116.7,117.8,114.3,137.3,131.8,133.7,41 +102.7,109.6,108.3,112.0,114.7,111.8,123.9,128.2,126.0,42 +102.8,112.2,111.0,112.2,115.7,113.3,118.0,129.7,123.8,43 +105.9,115.9,115.0,115.3,118.7,116.5,119.2,134.0,125.7,44 +109.8,119.3,118.7,119.2,122.2,119.6,124.5,138.9,129.3,45 +112.6,121.2,121.0,122.0,124.5,121.4,130.0,142.1,132.2,46 +112.2,120.3,120.3,121.5,123.8,120.3,132.0,141.4,132.0,47 +107.1,115.9,116.0,116.4,119.2,115.6,127.8,135.2,127.0,48 +98.8,108.9,109.0,108.1,111.8,108.4,119.2,125.4,118.8,49 +89.7,100.9,100.9,98.9,103.4,100.4,109.1,114.6,109.6,50 +81.8,93.5,93.5,91.1,95.8,93.5,100.5,105.1,101.6,51 +76.8,87.9,87.9,86.4,90.5,88.9,95.5,99.2,96.8,52 +74.3,84.2,84.2,84,87.3,86.4,93.4,96.4,94.6,53 +73.2,82.3,82.2,82.9,85.8,85.4,92.8,95.9,94.2,54 +72.4,81.8,81.8,81.8,85.3,85.3,92.3,97,94.6,55 +71.2,82.5,82.5,79.8,85.4,85.5,90.7,98.7,95.1,56 +69.7,84.0,83.9,77.4,85.8,85.9,88.2,100.7,95.5,57 +68.0,85.5,85.5,75.1,86.2,86.3,85.5,102.6,95.7,58 +66.6,86.5,86.5,73.6,86.5,86.5,83.0,104.0,95.8,59 +65.6,86.5,86.5,73.4,86.3,86.3,81.1,104.6,95.8,60 +65.0,85.8,85.9,74.1,85.8,86.0,79.9,104.8,95.8,61 +64.6,84.8,85.0,75.2,85.0,85.6,79.4,104.9,96.1,62 +64.3,84.1,84.1,75.9,84.1,85.3,79.4,105.1,97.0,63 +63.9,83.9,83.7,76.1,83.2,85.2,80.1,106.1,98.5,64 +63.8,84.1,83.5,76.1,82.6,85.4,81.5,107.9,101.2,65 +64.2,84.2,83.3,77.0,82.8,86.2,84.3,111.0,105.2,66 +65.4,84.1,83.0,79.4,84.1,87.6,88.8,115.7,111.0,67 +68.1,84.0,82.8,84.5,87.4,90.3,95.7,122.5,119.1,68 +74.2,86.4,85.7,93.6,94.7,96.6,106.9,133.2,131.1,69 +85.8,94.8,95.1,108.5,108.4,109.2,124.9,149.7,148.8,70 +105.1,112.2,114.5,130.9,130.9,130.9,151.9,174.1,174.1,71 +133.1,140.2,145.3,161.0,162.9,162.7,188.6,206.9,207.3,72 +164.7,173.4,181.1,194.2,198.9,198.8,229.1,242.9,243.1,73 +193.7,205.0,213.8,224.4,231.9,232.0,266.1,275.4,274.4,74 +213.8,227.8,234.8,245.3,254.7,254.7,292.1,297.9,294.4,75 +220.4,236.6,238.4,252.6,262.0,261.4,301.4,305.2,298.0,76 +215.3,232.9,227.6,247.7,256.0,254.4,295.6,298.6,287.5,77 +201.8,219.9,208.2,233.7,240.6,237.9,278.1,280.8,267.1,78 +183.4,201.0,185.8,213.8,219.6,216.1,252.4,254.7,240.7,79 +163.1,179.1,164.9,190.8,196.8,192.7,221.6,223.1,212.2,80 +142.7,156.5,146.5,167.0,173.8,169.6,189.2,189.7,183.8,81 +123.7,135.1,130.5,144.4,152.2,148.1,158.2,158.1,157.6,82 +107.5,116.8,116.8,125.0,133.2,129.7,132,132.0,135.5,83 +95.2,103.2,105.4,110.4,118,115.3,113.0,114.3,118.9,84 +86.4,93.5,96.1,99.9,106.3,104.6,100.3,103.5,107.2,85 +80.2,86.7,88.7,92.7,97.5,96.8,92.4,97.3,99.1,86 +75.9,81.8,83.0,87.6,91.1,91.1,87.6,93.5,93.5,87 +72.7,77.7,78.6,83.8,86.5,86.9,84.6,90.0,89.3,88 +70.2,74.1,75.3,80.6,83.0,83.7,82.4,86.6,86.1,89 +67.9,70.9,72.6,77.8,80.0,80.9,80.5,83.0,83.3,90 +65.4,67.8,70.1,74.8,77.1,78.3,78.3,79.4,80.6,91 +62.6,64.7,67.4,71.3,73.8,75.3,75.3,75.8,77.7,92 +59.6,61.8,64.6,67.8,70.3,72.3,71.8,72.3,74.6,93 +57.0,59.2,61.9,64.5,67.0,69.3,68.3,69.1,71.6,94 +54.9,57.2,59.6,61.9,64.3,66.6,65.4,66.6,68.9,95 diff --git a/src/main/resources/load/lpts_l2.csv b/src/main/resources/load/lpts_l2.csv new file mode 100644 index 000000000..4bc665ade --- /dev/null +++ b/src/main/resources/load/lpts_l2.csv @@ -0,0 +1,97 @@ +SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour +70.9,65.9,69.7,74.5,66.8,73.1,77.1,70.0,75.2,0 +69.3,63.7,66.6,72.3,64.3,69.3,76.3,67.4,71.9,1 +68.0,61.8,63.9,70.7,62.4,66.0,76.1,65.6,69.1,2 +66.8,60.2,61.8,69.2,61.0,63.5,75.8,64.3,66.8,3 +65.1,58.8,60.2,67.8,60.0,61.8,75.0,63.5,64.8,4 +63.1,57.7,58.9,66.2,59.1,60.7,73.7,62.9,63.2,5 +61.2,56.7,57.8,64.8,58.4,60.0,72.0,62.4,61.9,6 +59.4,56.1,56.9,63.5,57.7,59.4,70.1,61.8,61.0,7 +57.9,55.6,56.0,62.4,57.0,58.6,68.1,61.0,60.4,8 +56.8,55.2,55.1,61.4,56.2,57.7,66.2,60.1,59.9,9 +56.0,54.9,54.3,60.4,55.6,56.9,64.3,59.2,59.6,10 +55.2,54.4,53.6,59.4,55.2,56.1,62.7,58.5,59.4,11 +54.5,53.8,53.1,58.1,55.1,55.4,61.2,58.1,59.0,12 +53.9,53.1,52.7,56.9,55.2,54.9,60.0,57.9,58.7,13 +53.3,52.5,52.3,55.8,55.3,54.6,59.1,57.8,58.2,14 +52.8,51.9,51.9,55.2,55.2,54.4,58.5,57.7,57.7,15 +52.4,51.6,51.5,55.2,54.9,54.5,58.3,57.5,57.1,16 +52.1,51.6,51.3,55.6,54.7,54.7,58.3,57.3,56.7,17 +51.9,52.0,51.3,56.2,54.7,55.3,58.7,57.6,56.8,18 +51.9,52.8,51.9,56.9,55.2,56.1,59.4,58.5,57.7,19 +52.1,54.1,53.2,57.4,56.7,57.2,60.3,60.4,59.6,20 +52.6,56.1,55.2,57.9,59.1,59.0,61.3,63.3,62.3,21 +53.3,59.1,57.8,58.5,62.7,61.8,62.4,67.4,65.9,22 +54.4,63.5,61.0,59.4,67.6,65.9,63.5,72.5,70.1,23 +56.0,69.3,64.8,60.7,73.9,71.7,64.5,78.9,74.8,24 +58.4,76.3,69.4,63.2,81.5,78.9,66.2,86.5,80.4,25 +62.2,84.4,75.2,67.7,90.4,87.5,69.1,95.1,87.2,26 +67.6,93.2,82.4,75.0,100.6,97.3,74.2,104.7,95.6,27 +75.1,102.5,91.3,85.7,111.8,108,81.9,115.2,105.8,28 +84.4,112.3,101.6,98.7,123.7,119.3,91.7,126.5,117.4,29 +95.2,122.6,112.8,112.9,135.8,131,103.1,138.4,129.8,30 +107.2,133.5,124.5,127,147.6,142.6,115.4,150.9,142.6,31 +119.9,144.9,136.1,139.9,158.5,153.7,128.1,163.6,155.2,32 +132.7,155.5,146.7,151.3,168.0,163.5,141.0,175.8,167.0,33 +144.4,164.0,155.0,161.4,175.6,170.8,154.1,186.7,177.3,34 +154.2,169.0,159.9,169.8,180.5,174.8,167.3,195.4,185.5,35 +161.2,169.6,160.6,176.6,182.4,174.7,180.5,201.1,191.0,36 +165.5,166.7,157.8,181.3,181.3,171.3,192.1,203.4,193.5,37 +167.0,161.4,152.8,183.3,177.3,165.7,200.6,202.2,192.6,38 +165.7,155.0,146.7,182.2,170.6,159.1,204.4,197.0,188.0,39 +162.0,148.7,140.7,177.9,161.9,152.5,202.7,188.2,179.8,40 +157.3,143.8,135.9,172.1,152.9,146.9,197.5,177.8,170.3,41 +153.6,141.3,133.5,167.3,146.0,143.3,191.6,168.6,161.9,42 +152.5,142.6,134.4,165.7,143.4,142.6,188.0,163.2,157.5,43 +155.2,148.1,139.1,168.6,146.6,145.3,188.4,163.3,158.4,44 +159.6,155.2,145.6,173.9,153.0,149.5,191.0,166.6,162.6,45 +163.2,161.1,151.0,178.4,159.2,152.9,192.6,169.8,166.7,46 +163.2,162.4,152.5,178.9,161.6,153.3,190.4,169.8,167.3,47 +157.8,157.1,148.2,173.3,157.8,149.1,182.3,164.3,162.3,48 +148.5,147.2,139.8,163.2,149.4,141.5,170.0,154.8,153.2,49 +137.4,135.6,129.6,151.2,139.1,132.6,156.2,144.3,142.5,50 +127.0,125.3,120.4,140.1,129.4,124.5,143.4,135.2,132.7,51 +118.8,118.6,113.9,131.9,122.5,118.6,133.8,129.7,125.9,52 +112.8,114.9,109.9,125.9,118.1,114.9,126.8,126.9,121.6,53 +108.0,113.1,107.7,121.1,115.2,112.7,121.3,125.7,119.3,54 +103.9,112.1,106.3,116.2,112.9,111.3,116.2,124.5,117.9,55 +99.7,110.9,105.3,110.5,110.7,110.2,110.8,122.3,116.9,56 +95.8,109.5,104.5,104.5,108.4,109.2,105.3,119.3,116.1,57 +92.4,108.2,104.0,98.9,106.3,108.5,100.3,116.1,115.6,58 +89.9,107.2,103.9,94.8,104.7,108.0,96.5,112.9,115.4,59 +88.5,106.6,104.3,92.7,103.6,107.7,94.1,110.4,115.6,60 +88.0,106.3,104.9,92.0,102.8,107.5,92.9,108.7,116.0,61 +88.1,106.0,105.4,92.2,102.2,107.3,92.5,107.8,116.5,62 +88.2,105.5,105.5,92.3,101.4,107.2,92.3,108.0,117.1,63 +88.2,104.6,105.1,92.0,100.4,107.0,92.2,109.4,117.6,64 +88.3,104.0,104.7,91.9,99.9,107.4,92.8,112.3,119.1,65 +89.0,104.3,104.9,92.8,101.0,108.9,95.3,117.2,122.4,66 +90.7,106.3,106.3,95.6,104.7,112.1,100.6,124.5,128.6,67 +93.7,110.6,109.6,100.9,111.5,117.6,109.4,134.2,138.3,68 +98.0,116.5,114.3,108.2,120.6,124.7,120.6,145.6,150.4,69 +103.3,123.3,120.0,116.6,130.8,133.0,132.7,157.5,163.6,70 +109.6,130.3,126.1,125.3,141.0,141.8,144.3,169.0,176.4,71 +116.7,136.6,132.3,133.7,150.0,150.4,154.1,179.1,187.8,72 +123.8,142.4,138.3,141.6,157.9,158.8,162.7,187.9,197.2,73 +130.5,147.6,144.3,149.0,164.7,166.6,170.7,195.5,204.8,74 +136.0,152.5,150.0,155.8,170.6,173.9,178.9,202.0,210.2,75 +139.9,156.9,155.4,161.9,175.7,180.4,187.5,207.3,213.4,76 +142.0,160.2,159.5,166.6,179.4,185.0,194.8,210.5,213.8,77 +142.3,161.5,161.4,169.0,180.9,186.8,198.7,210.3,211.0,78 +141.0,159.9,159.9,168.2,179.7,184.7,197.0,205.3,204.4,79 +138.0,155.1,154.6,163.6,175.3,178.0,188.4,194.8,193.9,80 +133.7,148.0,146.6,156.2,168.5,168.2,175.1,180.7,180.8,81 +128.5,140.1,137.6,147.4,160.3,157.1,159.9,165.3,166.7,82 +122.8,132.7,129.4,138.5,151.7,146.7,145.9,150.9,153.3,83 +116.9,127.0,123.2,130.5,143.5,138.4,135.4,139.3,142.0,84 +111.0,122.6,118.6,123.4,135.9,131.9,127.9,130.4,132.7,85 +105.2,118.7,114.9,117.1,128.7,126.4,122.1,123.5,125.1,86 +99.7,114.6,111.3,111.3,122.0,121.2,117.1,117.9,118.7,87 +94.7,109.6,107.1,105.8,115.6,115.7,111.7,113.0,113.2,88 +90.0,103.9,102.5,100.4,109.4,109.8,105.9,108.3,108.3,89 +85.6,97.8,97.5,95.2,103.3,103.9,100,103.4,103.7,90 +81.6,91.5,92.3,89.9,97.3,98.1,94.0,98.1,98.9,91 +77.9,85.3,87.2,84.4,91.2,92.5,88.1,92.0,93.9,92 +74.4,79.5,82.3,79.2,85.3,87.2,82.6,85.8,88.7,93 +71.3,74.3,77.6,74.3,79.8,82.2,77.6,79.9,83.7,94 +68.4,70.1,73.4,70.1,75.0,77.5,73.4,75.0,79.1,95 diff --git a/src/main/resources/load/lpts_random.csv b/src/main/resources/load/lpts_random.csv new file mode 100644 index 000000000..5a90edd42 --- /dev/null +++ b/src/main/resources/load/lpts_random.csv @@ -0,0 +1,97 @@ +kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour +0.266806721687317,0.295997023582459,0.279087692499161,0.0610353946685791,0.0630703344941139,0.053140863776207,0.0357091873884201,0.0370676517486572,0.0293692331761122,0 +0.281179457902908,0.299608528614044,0.275292456150055,0.0560021996498108,0.058424074202776,0.0498424917459488,0.0319067053496838,0.0334825366735458,0.0265011098235846,1 +0.275563269853592,0.29670587182045,0.252942383289337,0.0528385005891323,0.0547995530068874,0.0472154095768929,0.0286294519901276,0.0310499873012304,0.0245211906731129,2 +0.268669873476028,0.278122246265411,0.222294941544533,0.0497889705002308,0.0522574931383133,0.0455464050173759,0.0267868731170893,0.0290201343595982,0.0230409931391478,3 +0.254242599010468,0.261944204568863,0.198370113968849,0.0480474047362804,0.0499211102724075,0.0444160588085651,0.025010583922267,0.0268981643021107,0.0216859001666307,4 +0.253653794527054,0.259219467639923,0.183828011155128,0.0465105324983597,0.0482752695679665,0.0433471724390984,0.0237453784793615,0.0254230201244354,0.0208296440541744,5 +0.232547923922539,0.22350800037384,0.151045009493828,0.0453270114958286,0.047629676759243,0.042874664068222,0.0228410512208939,0.0238813851028681,0.0201559588313103,6 +0.203599318861961,0.210258424282074,0.134497836232185,0.0445506721735001,0.0461143814027309,0.0425662696361542,0.0219020489603281,0.0230216048657894,0.0196861978620291,7 +0.161462053656578,0.199696600437164,0.119271591305733,0.0445012860000134,0.0455127842724323,0.0422079116106033,0.0207479763776064,0.0222345236688852,0.019109807908535,8 +0.132398754358292,0.181738555431366,0.0919454470276833,0.0439879409968853,0.0447122938930988,0.0418674796819687,0.0208074823021889,0.0220435112714767,0.0189618747681379,9 +0.141700059175491,0.172467365860939,0.089320495724678,0.0432550236582756,0.044278547167778,0.04146458953619,0.0204773582518101,0.0210072007030249,0.0188128501176834,10 +0.13490092754364,0.168581023812294,0.0863394215703011,0.0434850119054317,0.0437624379992485,0.0414730608463287,0.0204034727066755,0.0206510350108147,0.0187746584415436,11 +0.12891773879528,0.141391009092331,0.0815763771533966,0.0438057892024517,0.0438031405210495,0.0417981892824173,0.0202947575598955,0.020810017362237,0.0187485739588737,12 +0.0865642353892326,0.133543252944946,0.0992388054728508,0.0434134155511856,0.0436179116368294,0.0411902405321598,0.0195998474955559,0.0202769655734301,0.0186050590127707,13 +0.107326254248619,0.131506875157356,0.092495284974575,0.0422008074820042,0.0430818535387516,0.0411793626844883,0.0194479618221521,0.0201587229967117,0.0184435490518808,14 +0.12365210801363,0.138605788350105,0.0902709886431694,0.0423581749200821,0.0430288463830948,0.0415664203464985,0.0197580717504025,0.0195529088377953,0.018659807741642,15 +0.133885741233826,0.116305366158485,0.0866493508219719,0.0421508848667145,0.0430956780910492,0.0417333245277405,0.0191863905638456,0.0196987725794315,0.018691623583436,16 +0.114493139088154,0.109669730067253,0.11562417447567,0.0423808842897415,0.0430857576429844,0.0414095669984818,0.0193791724741459,0.0192934311926365,0.0187153313308954,17 +0.106474287807941,0.107617124915123,0.141828700900078,0.041958749294281,0.0426791086792946,0.0417547412216663,0.0191276986151934,0.0195350497961044,0.0195536445826292,18 +0.111373528838158,0.0949468687176705,0.143573239445686,0.0423438511788845,0.0426821634173393,0.0423176772892475,0.0193268302828074,0.0194729138165712,0.0196764413267374,19 +0.129695281386375,0.111747220158577,0.146539300680161,0.042476549744606,0.0431345589458942,0.0430354326963425,0.0200043357908726,0.0198324266821146,0.0201929099857807,20 +0.124765977263451,0.126777052879333,0.181237012147903,0.0424391217529774,0.0431524105370045,0.0431922376155853,0.0196738373488188,0.0196389146149158,0.0208003968000412,21 +0.166463151574135,0.128424167633057,0.222479611635208,0.0426704697310925,0.0434540957212448,0.0447872504591942,0.020222594961524,0.0205539185553789,0.0225220061838627,22 +0.15489549934864,0.121535487473011,0.279077500104904,0.0428037717938423,0.0438099093735218,0.0461413823068142,0.0201477259397507,0.0211283396929502,0.0241765789687634,23 +0.149270266294479,0.145163252949715,0.314658939838409,0.0454631112515926,0.0458601377904415,0.0499203614890575,0.0224028695374727,0.0220234617590904,0.0277903340756893,24 +0.190895333886147,0.153644308447838,0.411636203527451,0.0459029302000999,0.0457030460238457,0.0538441687822342,0.0229767691344023,0.0218722112476826,0.0328027196228504,25 +0.191453665494919,0.150224968791008,0.423471629619598,0.0472969971597195,0.047640148550272,0.0605787634849548,0.0232080388814211,0.0226516369730234,0.0382906869053841,26 +0.224633768200874,0.169333130121231,0.409934967756271,0.0484098829329014,0.0481277145445347,0.0650452002882957,0.0246889032423496,0.0234444178640842,0.0414291992783546,27 +0.23322768509388,0.195868730545044,0.387721389532089,0.0501904785633087,0.0495214238762856,0.0688034743070602,0.0260085947811604,0.0247648935765028,0.0444995686411858,28 +0.280531793832779,0.242264837026596,0.378016442060471,0.0515176840126514,0.0500866919755936,0.0698312446475029,0.0280240289866924,0.0263900514692068,0.044551245868206,29 +0.332535684108734,0.286791861057281,0.414923667907715,0.0538357272744179,0.0514319129288197,0.0683940351009369,0.0305218864232302,0.0274843797087669,0.0439568608999252,30 +0.356295973062515,0.335564076900482,0.428863227367401,0.055597260594368,0.0545664429664612,0.0673834607005119,0.0327046699821949,0.0305836349725723,0.0435638092458248,31 +0.381627827882767,0.356647431850433,0.41985896229744,0.0583727583289146,0.0575905330479145,0.066506527364254,0.0358871892094612,0.0332306325435638,0.042742770165205,32 +0.427426189184189,0.375110238790512,0.42010372877121,0.0632952600717545,0.0606768690049648,0.0665018707513809,0.0411307103931904,0.0364755131304264,0.0432239063084126,33 +0.418004125356674,0.411366045475006,0.413253307342529,0.0678070187568665,0.0630642250180244,0.0660132020711899,0.0440355911850929,0.0392848961055279,0.0416399873793125,34 +0.480116784572601,0.443256080150604,0.430845767259598,0.0709096193313599,0.0660979822278023,0.0664969906210899,0.0474613010883331,0.0422324053943157,0.0427436977624893,35 +0.492366999387741,0.433596074581146,0.438405454158783,0.0713961571455002,0.0694489479064941,0.0661367774009705,0.0493352487683296,0.0453926883637905,0.0428525730967522,36 +0.488669961690903,0.450059473514557,0.43893027305603,0.0731654316186905,0.0709325894713402,0.0653173625469208,0.050234030932188,0.0470801331102848,0.0422966778278351,37 +0.476427853107452,0.453100442886353,0.445331513881683,0.0735458433628082,0.0721306875348091,0.0635278075933456,0.0500484444200993,0.048948809504509,0.0411276556551456,38 +0.447788894176483,0.462226986885071,0.42346379160881,0.0715678483247757,0.0739922747015953,0.0632445514202118,0.0481005422770977,0.0500194020569324,0.0407665930688381,39 +0.448646247386932,0.481568813323975,0.437915831804276,0.0719510018825531,0.0743175819516182,0.0634156614542007,0.0479790642857552,0.0502395480871201,0.0411010235548019,40 +0.45268851518631,0.463462620973587,0.44245383143425,0.0715559348464012,0.0745281055569649,0.0629907771945,0.0486291088163853,0.0509366057813168,0.0407464392483234,41 +0.472129553556442,0.458590388298035,0.438809961080551,0.0714246481657028,0.0753235965967178,0.0624452345073223,0.0488574244081974,0.0513948574662209,0.0403173267841339,42 +0.465200632810593,0.482033789157867,0.437554955482483,0.07085170596838,0.0747058689594269,0.0618916675448418,0.0474738143384457,0.0496549904346466,0.0399090498685837,43 +0.463072091341019,0.485370546579361,0.430398672819138,0.070897750556469,0.0753868967294693,0.061828400939703,0.0477456152439117,0.0515857115387917,0.039817675948143,44 +0.504301607608795,0.495000720024109,0.421750038862228,0.071284644305706,0.0756229311227798,0.0619377642869949,0.0486843213438988,0.0521590225398541,0.0400484018027782,45 +0.494013756513596,0.502004504203796,0.431962072849274,0.0704603344202042,0.075153686106205,0.0622560419142246,0.04722835496068,0.0514012612402439,0.039880596101284,46 +0.480952113866806,0.475219011306763,0.427944034337997,0.0712133646011353,0.0757130458950996,0.0625443011522293,0.0476561672985554,0.0518420785665512,0.0402946658432484,47 +0.4861159324646,0.516651332378387,0.448401153087616,0.0710133090615273,0.0765742212533951,0.0628931447863579,0.0490181632339954,0.0527153052389622,0.0413180962204933,48 +0.505605041980743,0.523734390735626,0.470708280801773,0.0711066871881485,0.0766011476516724,0.0636289045214653,0.0492411740124226,0.0540735982358456,0.0423084460198879,49 +0.513229548931122,0.550731658935547,0.487264752388,0.0714162662625313,0.0776983126997948,0.0654886662960052,0.0496645383536816,0.0559630356729031,0.0443988926708698,50 +0.523128151893616,0.541519641876221,0.508733510971069,0.0719589814543724,0.0785757303237915,0.0667508617043495,0.0495718084275723,0.0566712841391563,0.0457895845174789,51 +0.505810618400574,0.511520206928253,0.512334108352661,0.0727487280964851,0.078390434384346,0.0674923211336136,0.0494792275130749,0.0563753582537174,0.0470927283167839,52 +0.523990094661713,0.521157741546631,0.502269566059113,0.0725650414824486,0.0767486467957497,0.0678139925003052,0.0510885566473007,0.0540808290243149,0.047186266630888,53 +0.505142688751221,0.510516762733459,0.473371058702469,0.0712223723530769,0.0750300288200378,0.067938931286335,0.0487538911402225,0.0511478036642075,0.0453384555876255,54 +0.49169534444809,0.497860074043274,0.440884381532669,0.0709625855088234,0.0743403211236,0.0676973983645439,0.0484340563416481,0.0499401353299618,0.0442236810922623,55 +0.449224293231964,0.49097341299057,0.43197637796402,0.0712493658065796,0.0736074447631836,0.0669783055782318,0.0481879562139511,0.0487863756716251,0.0432323180139065,56 +0.462083280086517,0.458611458539963,0.420163929462433,0.0710224434733391,0.0725374296307564,0.0672811642289162,0.0468299798667431,0.0484821572899818,0.0426194556057453,57 +0.466422975063324,0.431519895792007,0.411749631166458,0.0716194584965706,0.0718199908733368,0.0670692101120949,0.0491987094283104,0.0477711223065853,0.0421844013035297,58 +0.470720857381821,0.452195525169373,0.402273863554001,0.0716342553496361,0.0719970166683197,0.0668240934610367,0.0485116802155972,0.0467447564005852,0.0414865128695965,59 +0.464846402406693,0.438703387975693,0.404926747083664,0.0720167830586433,0.0727354884147644,0.0666147843003273,0.0477447547018528,0.0472656972706318,0.0414320714771748,60 +0.466590017080307,0.44343689084053,0.405802458524704,0.0720655098557472,0.072361558675766,0.0671483352780342,0.0480720065534115,0.0469786375761032,0.0417016632854939,61 +0.461378246545792,0.444682002067566,0.396851778030396,0.0718182176351547,0.0714400708675385,0.0669265314936638,0.047651831060648,0.0463756546378136,0.0415653325617313,62 +0.461525678634644,0.406780183315277,0.386990875005722,0.0716791599988937,0.0715874135494232,0.0669709593057632,0.0474572516977787,0.0466903038322926,0.0415439382195473,63 +0.447014361619949,0.414845287799835,0.384565651416779,0.0707539543509483,0.071328230202198,0.0670299381017685,0.0461493171751499,0.045212522149086,0.0411532782018185,64 +0.425164729356766,0.408224016427994,0.378880858421326,0.0712318941950798,0.0714204683899879,0.0676426440477371,0.0461742058396339,0.0446786060929298,0.0415577478706837,65 +0.406535506248474,0.39065757393837,0.390029609203339,0.0721957013010979,0.0714574679732323,0.0679289177060127,0.0468821786344051,0.0455186292529106,0.0415354371070862,66 +0.429334431886673,0.421460598707199,0.386443197727203,0.0720773190259933,0.0723162442445755,0.068557009100914,0.0471111163496971,0.0465410239994526,0.0424121767282486,67 +0.408385515213013,0.423402607440948,0.384852766990662,0.0731761381030083,0.0739946663379669,0.0693683549761772,0.0479194596409798,0.0479996241629124,0.043307401239872,68 +0.450928092002869,0.433510303497314,0.387267470359802,0.0732240453362465,0.0757285431027412,0.070844329893589,0.0488691031932831,0.0505488254129887,0.0446740724146366,69 +0.42838642001152,0.458660960197449,0.397508889436722,0.0737349465489388,0.076910100877285,0.0725433081388473,0.0485723651945591,0.0513449050486088,0.0462205372750759,70 +0.457528233528137,0.455272883176804,0.401177316904068,0.0746021792292595,0.0782865285873413,0.0737910494208336,0.0504703745245934,0.0534177497029305,0.0476498752832413,71 +0.477989226579666,0.449814409017563,0.415226876735687,0.0757969841361046,0.0819070339202881,0.0762551799416542,0.0521196164190769,0.0565894842147827,0.0500268675386906,72 +0.471660286188126,0.483049720525742,0.41699144244194,0.0772641450166702,0.0833683088421822,0.0779938697814941,0.0538835860788822,0.0582899935543537,0.0516200289130211,73 +0.462039291858673,0.484837472438812,0.417837411165237,0.0793179050087929,0.0855541229248047,0.0807979106903076,0.0558264814317226,0.0610172972083092,0.0537474788725376,74 +0.494239538908005,0.474657744169235,0.410433322191238,0.080167755484581,0.0883776918053627,0.0834952890872955,0.0563570857048035,0.0627634450793266,0.0555526539683342,75 +0.481115281581879,0.4631627202034,0.405094832181931,0.0810613483190537,0.0898661091923714,0.085809163749218,0.0574533082544804,0.063525564968586,0.0566239841282368,76 +0.481957763433456,0.444837510585785,0.392141699790955,0.0815427601337433,0.0908975899219513,0.0876085460186005,0.0575459823012352,0.0625557452440262,0.0570836253464222,77 +0.46474814414978,0.416785925626755,0.384859055280685,0.0834897756576538,0.0924627110362053,0.0896750018000603,0.0571116954088211,0.0623503513634205,0.0581204779446125,78 +0.446739017963409,0.395158112049103,0.372885912656784,0.0857851952314377,0.0973858460783958,0.0923485606908798,0.0588888488709927,0.0653925687074661,0.0595557168126106,79 +0.425965458154678,0.364043891429901,0.341714292764664,0.0874398797750473,0.102611370384693,0.0957552641630173,0.0598357506096363,0.0677491873502731,0.0603233315050602,80 +0.401139229536056,0.364588558673859,0.329459756612778,0.0885151326656342,0.102042146027088,0.097852848470211,0.0583052486181259,0.0661919564008713,0.0615657567977905,81 +0.386102288961411,0.331744521856308,0.310481607913971,0.088083989918232,0.102688789367676,0.0995604023337364,0.056625984609127,0.064409427344799,0.0617730244994164,82 +0.352426558732986,0.287841856479645,0.287958323955536,0.0899283438920975,0.103480368852615,0.100912734866142,0.0579833500087261,0.0627572685480118,0.0609871000051498,83 +0.356676459312439,0.279404014348984,0.266594916582108,0.0904190465807915,0.104584082961082,0.10176607966423,0.0583710223436356,0.0623739063739777,0.0608399920165539,84 +0.353478521108627,0.253417283296585,0.25350296497345,0.0909158438444138,0.105099938809872,0.103342562913895,0.0577074661850929,0.0616596378386021,0.0614556968212128,85 +0.299452573060989,0.232542738318443,0.223194167017937,0.0930669605731964,0.105844244360924,0.104641474783421,0.0584431923925877,0.0609173066914082,0.0607141107320786,86 +0.257176458835602,0.220698863267899,0.218866571784019,0.0945220738649368,0.107813261449337,0.104784607887268,0.0576106905937195,0.0613766200840473,0.0604684762656689,87 +0.257824391126633,0.227517262101173,0.207409575581551,0.092997707426548,0.104204557836056,0.102655082941055,0.0560135245323181,0.0604200474917889,0.058957364410162,88 +0.238055855035782,0.211737111210823,0.201141089200974,0.0910771638154984,0.0975786820054054,0.0979374051094055,0.0540145039558411,0.0561005882918835,0.0565716363489628,89 +0.238567247986794,0.227371960878372,0.204761475324631,0.0879477933049202,0.0902053341269493,0.0918598845601082,0.0529557727277279,0.0529294200241566,0.0533599480986595,90 +0.216722473502159,0.234640255570412,0.217169404029846,0.0868481546640396,0.0833379998803139,0.0849183723330498,0.0509745627641678,0.0489254035055637,0.0499787591397762,91 +0.231909289956093,0.24814073741436,0.230379953980446,0.0836911797523499,0.0766035988926888,0.0774712786078453,0.0496042557060719,0.0455812141299248,0.0460172258317471,92 +0.223331198096275,0.256241410970688,0.256796300411224,0.0792895033955574,0.070108599960804,0.0709625855088234,0.0472096875309944,0.0411984920501709,0.0422120206058025,93 +0.246469661593437,0.287815362215042,0.283796429634094,0.0738609507679939,0.0632559433579445,0.0643703117966652,0.043757751584053,0.0369679853320122,0.0378340892493725,94 +0.270621925592422,0.283220708370209,0.280689835548401,0.068959467113018,0.0578584857285023,0.0592832416296005,0.0411073453724384,0.032867755740881,0.0339051820337772,95 \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy index 9e0ca10cd..2bd412ade 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvDataSourceTest.groovy @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.source.csv import edu.ie3.datamodel.exceptions.SourceException +import edu.ie3.datamodel.io.connectors.CsvFileConnector import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme @@ -15,6 +16,7 @@ import spock.lang.Specification import java.nio.file.Files import java.nio.file.Path +import java.util.function.Function import java.util.stream.Collectors class CsvDataSourceTest extends Specification implements CsvTestDataMeta { @@ -29,6 +31,7 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { super(csvSep, folderPath, fileNamingStrategy) } + Map buildFieldsToAttributes( final String csvRow, final String[] headline) { return super.buildFieldsToAttributes(csvRow, headline) @@ -76,6 +79,22 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { dummyCsvSource.connector.entityWriters.isEmpty() } + + def "A DataSource can be created wih a custom connector correctly"() { + given: + Path resourcePath = Path.of(".", "src", "main", "resources", "load") + Function fcn = filePath -> new FileInputStream(new File(filePath)) + + CsvFileConnector connector = new CsvFileConnector(resourcePath, fcn) + + when: + def dataSource = new CsvDataSource(csvSep, connector, fileNamingStrategy) + def sourceData = dataSource.getSourceData(Path.of("lpts_g0")).toList() + + then: + sourceData.size() == 96 + } + def "A CsvDataSource should return column names from a valid CSV file as expected"() { given: DummyCsvSource source = new DummyCsvSource(csvSep, participantsFolderPath, fileNamingStrategy) @@ -363,9 +382,9 @@ class CsvDataSourceTest extends Specification implements CsvTestDataMeta { when: def actual = dummyCsvSource.getCsvIndividualTimeSeriesMetaInformation( - ColumnScheme.ENERGY_PRICE, - ColumnScheme.ACTIVE_POWER - ) + ColumnScheme.ENERGY_PRICE, + ColumnScheme.ACTIVE_POWER + ) then: actual == expected From ffbd9832775c855495d34ac2ffb7985cd4dd7b41 Mon Sep 17 00:00:00 2001 From: Marvin Heintze Date: Fri, 21 Feb 2025 15:43:23 +0100 Subject: [PATCH 273/310] updated csv files from simona_vn grid --- CHANGELOG.md | 1 + .../io/source/csv/_joint_grid/bm_input.csv | 4 +- .../source/csv/_joint_grid/bm_type_input.csv | 2 +- .../io/source/csv/_joint_grid/evcs_input.csv | 6 +- .../csv/_joint_grid/fixed_feed_in_input.csv | 4 +- ...q_8c04e94e-76b0-4369-a55c-f5e1117fb83e.csv | 4 +- .../csv/_joint_grid/line_graphic_input.csv | 530 +++++----- .../io/source/csv/_joint_grid/line_input.csv | 582 +++++----- .../csv/_joint_grid/line_type_input.csv | 297 +++++- .../io/source/csv/_joint_grid/load_input.csv | 994 +++++++++--------- .../_joint_grid/measurement_unit_input.csv | 600 +++++------ .../csv/_joint_grid/node_graphic_input.csv | 536 +++++----- .../io/source/csv/_joint_grid/node_input.csv | 534 +++++----- .../io/source/csv/_joint_grid/pv_input.csv | 128 +-- .../csv/_joint_grid/storage_type_input.csv | 4 +- .../csv/_joint_grid/time_series_mapping.csv | 4 +- .../csv/_joint_grid/transformer_2_w_input.csv | 16 +- .../transformer_2_w_type_input.csv | 11 +- .../io/source/csv/_joint_grid/wec_input.csv | 6 +- .../source/csv/_joint_grid/wec_type_input.csv | 4 +- 20 files changed, 2278 insertions(+), 1989 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b35da38c7..363dada1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223) - Refactored `CongestionResult`, removed `ModelResultEntity` [#1234](https://github.com/ie3-institute/PowerSystemDataModel/issues/1234) - Replaced `LoadProfileInput` with `LoadProfileTimeSeries` [#1228](https://github.com/ie3-institute/PowerSystemDataModel/issues/1228) +- Updated `_joint_grid` csv files from simona [#750](https://github.com/ie3-institute/PowerSystemDataModel/issues/750) ## [5.1.0] - 2024-06-24 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_input.csv index aea2e5df1..ef97e4de7 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_input.csv @@ -1,2 +1,2 @@ -"uuid","cost_controlled","feed_in_tariff","id","market_reaction","node","operates_from","operates_until","operator","q_characteristics","type" -a3b7576b-cac7-4350-90ff-06316cdca192,true,51.0,BM_Test,true,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.00,1.00)}",2fdca5f1-c11b-4169-a695-4c98f0e0a84a +uuid,cost_controlled,feed_in_tariff,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,type +a3b7576b-cac7-4350-90ff-06316cdca192,true,51.0,BM_Test,true,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.0,1.0)}",2fdca5f1-c11b-4169-a695-4c98f0e0a84a diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_type_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_type_input.csv index 8a8fe974b..835fe23af 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_type_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/bm_type_input.csv @@ -1,2 +1,2 @@ -"uuid","active_power_gradient","capex","cos_phi_rated","eta_conv","id","opex","s_rated" +uuid,active_power_gradient,capex,cos_phi_rated,eta_conv,id,opex,s_rated 2fdca5f1-c11b-4169-a695-4c98f0e0a84a,5.0,0.0,1.0,1.0,typ_01,0.05,190.0 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/evcs_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/evcs_input.csv index 48735020c..513dd62c0 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/evcs_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/evcs_input.csv @@ -1,3 +1,3 @@ -"uuid","cos_phi_rated","id","node","operates_from","operates_until","operator","q_characteristics","charging_points","type","location_type","v2gSupport" -06a14909-366e-4e94-a593-1016e1455b30,0.9,test_evcs_1,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.00,1.0)}",4,ChargingStationType1,HOME,false -104acdaa-5dc5-4197-aed2-2fddb3c4f237,0.9,test_evcs_2,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.0)}",4,ChargingStationType1,HOME,false \ No newline at end of file +uuid,charging_points,cos_phi_rated,id,location_type,node,operates_from,operates_until,operator,q_characteristics,type,v_2g_support +06a14909-366e-4e94-a593-1016e1455b30,4,0.9,test_evcs_1,HOME,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.0,1.0)}",ChargingStationType1,true +104acdaa-5dc5-4197-aed2-2fddb3c4f237,4,0.9,test_evcs_2,HOME,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",ChargingStationType1,true diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/fixed_feed_in_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/fixed_feed_in_input.csv index 369d8d550..b73efa5c5 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/fixed_feed_in_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/fixed_feed_in_input.csv @@ -1,2 +1,2 @@ -"uuid","cos_phi_rated","id","node","operates_from","operates_until","operator","q_characteristics","s_rated" -9abe950d-362e-4efe-b686-500f84d8f368,0.9,test_feed_in,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.00,0.95)}",200.0 +uuid,cos_phi_rated,id,node,operates_from,operates_until,operator,q_characteristics,s_rated +9abe950d-362e-4efe-b686-500f84d8f368,0.9,test_feed_in,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.0,0.95)}",200.0 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/its_pq_8c04e94e-76b0-4369-a55c-f5e1117fb83e.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/its_pq_8c04e94e-76b0-4369-a55c-f5e1117fb83e.csv index e6fd05fc3..a839ca52b 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/its_pq_8c04e94e-76b0-4369-a55c-f5e1117fb83e.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/its_pq_8c04e94e-76b0-4369-a55c-f5e1117fb83e.csv @@ -1,2 +1,2 @@ -"uuid","p","q","time" -4df88950-dc48-4905-b41f-63d0757eae03,3.999998968803,0.0,2011-01-01T00:00:00Z +"p","q","time" +3.999998968803,0.0,2011-01-01T00:00:00Z diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_graphic_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_graphic_input.csv index 4e44239cc..96908c5ee 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_graphic_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_graphic_input.csv @@ -1,292 +1,292 @@ -"uuid","graphic_layer","line","path" -077f10b2-79fe-4ae4-a86e-77423668cf1a,Standard,e50ba18f-8019-4824-b835-cc33c70b0196,"{""type"":""LineString"",""coordinates"":[[0.92655367,0.77868852],[0.93785311,0.77868852],[0.93220339,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d969661d-d4dc-4544-95aa-54baebea0e8f,Standard,a102f0f4-e86d-438c-95a9-d3fc6357121f,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.57377049],[0.91525424,0.57377049],[0.90960452,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0fa23de1-db57-4f60-bea0-01ea1bab1da4,Standard,82e01986-321d-4f21-8453-60220f97bbb1,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.89344262],[0.88700565,0.89344262],[0.88135593,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3c777579-8dba-4e53-8bc0-5a4a80af9988,Standard,7ad69cae-2bb0-4516-80a9-6afc7b5cb789,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.14754098],[0.74011299,0.14754098],[0.72881356,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -aba8138c-0b15-446c-94b9-67fc130f9c4b,Standard,d86488f7-cf74-41b4-9d62-e2923d00680f,"{""type"":""LineString"",""coordinates"":[[0.70621469,0.36885246],[0.68926554,0.36885246],[0.68361582,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e52aa402-4f9f-4b5f-8220-f3d4848d67ac,Standard,0c04a652-1076-4b59-a957-652790b4c963,"{""type"":""LineString"",""coordinates"":[[0.78531073,0.45901639],[0.78531073,0.47540984],[0.78531073,0.46721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -00ce0bad-3efa-443d-8eed-968cc3132cf8,Standard,75098182-83b1-40ae-baaf-95f1e1f93250,"{""type"":""LineString"",""coordinates"":[[0.63841808,0.14754098],[0.6440678,0.14754098],[0.64971751,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -077c54e5-7a8c-4c1c-8c3c-d72b4b7b0e11,Standard,97d5bd4a-ce14-4ded-90d4-4f2db25d6626,"{""type"":""LineString"",""coordinates"":[[0.74011299,0.36885246],[0.74576271,0.36885246],[0.75141243,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -8ae601e8-3dcf-497e-a258-d8ac976e95e8,Standard,106f03b3-b84e-4d36-ab09-13b3dc3403e7,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.1557377],[0.25423729,0.1557377],[0.22881291,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b038acec-bed0-4448-9ff8-a9af55865145,Standard,147bf31b-f9b1-415f-858b-f3ed430e508d,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.77868852],[0.75706215,0.77868852],[0.76271186,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -76492511-ec9c-4e2f-be35-4b6091a4d07b,Standard,ddc63e7d-e76a-489b-a05f-97e7dee40794,"{""type"":""LineString"",""coordinates"":[[0.82485876,0.77868852],[0.83050847,0.77868852],[0.83615819,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -55977fba-bd2a-41c1-8176-a95fac899ea2,Standard,f8827054-46fd-486c-aa91-9bd813187705,"{""type"":""LineString"",""coordinates"":[[0.91525424,0.57377049],[0.40677966,0.10655738],[0.92090395,0.57377049],[0.92655367,0.57377049],[0.41242938,0.10655738]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f96dad25-b70b-459a-a1fe-d704fcd6410c,Standard,473a11f4-1691-44ba-8e95-96782bc9d07f,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.14754098],[0.66101695,0.14754098],[0.67231638,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b622cf65-64b2-454b-900e-a191d7231dbc,Standard,0b1f06c3-9622-47cd-b41f-bd0314673b8d,"{""type"":""LineString"",""coordinates"":[[0.85310734,0.14754098],[0.86440678,0.14754098],[0.85875706,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b7bc8bae-9f00-497d-9d16-6b03765b5f98,Standard,e7388048-40c3-4fd7-bcbb-2e1b09e735d2,"{""type"":""LineString"",""coordinates"":[[0.80225989,0.89344262],[0.81355932,0.89344262],[0.8079096,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b6e8a3b1-e76e-4788-960f-79afcd82cd8f,Standard,1c23e300-0ad5-4b90-ac74-b9763e579268,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.0204918],[0.22033898,0.04098361],[0.22033898,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -90344d84-9485-4986-93e1-e94d73ee0aa3,Standard,91179f48-2d6c-4ae4-864c-d667f57a6e66,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.24590164],[0.11864407,0.24590164],[0.14689266,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e5cbfa13-80ac-483f-8433-c6717fa1e7c9,Standard,2d616d05-fa31-4b7f-b666-0fab28a21a82,"{""type"":""LineString"",""coordinates"":[[0.65536723,0.14754098],[0.66101695,0.14754098],[0.64971751,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -58798027-5b4e-4602-8e9f-ce34f156da4b,Standard,932d9fab-9b07-4948-9d65-4945c7700a72,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.89344262],[0.70056497,0.89344262],[0.72316384,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -88d88084-b78e-4620-837a-8afd74563b91,Standard,43394be2-5c85-4449-ad06-7866395a5c79,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.67213115],[0.92655367,0.67213115],[0.93220339,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0f375bc5-fa36-4b66-ac12-e0db266bf400,Standard,9f57100c-cb04-49b5-a9bd-f0e78f87b18a,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.36885246],[0.83615819,0.36885246],[0.84180791,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a6870226-3616-4619-9c12-e8d33ca469c5,Standard,95b47f01-829a-46c3-873a-4df11d798c49,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.89344262],[0.84745763,0.89344262],[0.85310734,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -8d9b357a-6612-45b4-baff-12849a787453,Standard,af565c79-9953-4934-9afd-91cd64ed1f06,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.89344262],[0.86440678,0.89344262],[0.8700565,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b36d0168-6936-49f6-92f3-8755988c11e9,Standard,76f097c5-173f-4fee-b6db-190792922d0e,"{""type"":""LineString"",""coordinates"":[[0.03954802,0.68032787],[0.03954802,0.57377049],[0.09039548,0.57377049],[0.03954802,0.78688525]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -54e0c3ae-10e0-4533-8679-063556715b18,Standard,52df9c70-136a-49bb-9ad4-d300123c7e99,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.18852459],[0.15819209,0.16803372],[0.15819209,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -db40acda-255e-4d7c-828a-e52619f60666,Standard,98a4759c-696b-4c99-b339-cf39ecc76ba7,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.66393443],[0.11864407,0.66393443],[0.14689266,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -37bfd165-910b-4ed1-b6b1-49633d000387,Standard,73359dab-e8bb-4cea-89e6-88b969ecb4e0,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.04098361],[0.0960452,0.07377049],[0.0960452,0.05737705]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -98c214c3-a010-494f-93d2-39d0045abbd6,Standard,f4859003-7182-4ebf-8a96-ce61b2f6191c,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.2295082],[0.22033898,0.20901733],[0.22033898,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7548e909-99a8-426b-9c9a-7551e6fc7a87,Standard,13ea7170-5fc1-4ed8-be71-0a91a9e5df99,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.67213115],[0.79096045,0.67213115],[0.78531073,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fad21258-86aa-4a48-a05b-73bbb3ad3dbd,Standard,7263918d-4331-43af-bd10-8c06bd2b8667,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.67213115],[0.72316384,0.67213115],[0.71751412,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -38d3d470-96ef-4884-80b9-b1fd23375ef1,Standard,1cfc85dd-3fb8-48a3-9ea1-b11b1b9ca8d4,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.57377049],[0.87570621,0.57377049],[0.88135593,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ccacd75f-b7ad-43cb-9747-84e2fcf53ebd,Standard,09083d14-02aa-40a3-9948-86e86883bda1,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.96721311],[0.75706215,0.96721311],[0.74011299,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -cd44faca-2232-4565-9886-8dc5b92ccb96,Standard,eb64f0fb-1810-4b49-b0a6-e94a6422be04,"{""type"":""LineString"",""coordinates"":[[0.98870056,0.39344262],[0.96610169,0.14754098],[0.98870056,0.14754098],[0.98870056,0.2704918]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3cd9d77d-adbf-442f-b570-61b69223a367,Standard,bee47575-ecc8-4f2f-96de-e9a616603bb7,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.04918033],[0.78531073,0.04918033],[0.76271186,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -54c63d34-a5b6-4547-8898-cdf835177352,Standard,84f3941b-450c-4acb-8150-c788af1e6546,"{""type"":""LineString"",""coordinates"":[[0.87570621,0.04918033],[0.8700565,0.04918033],[0.86440678,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -99333f9f-7f11-49e4-b97e-97956c7e6116,Standard,ce640cab-6f6d-4fd1-b652-009bec4c596b,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.89344262],[0.83615819,0.89344262],[0.84745763,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7ad09272-dde8-46fb-bea5-31cce9bb450e,Standard,d9d1edce-43e0-4cbd-9801-4a4e1a1dfa71,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.77868852],[0.77966102,0.77868852],[0.7740113,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d012e1ac-4919-4b5a-aaec-80cb2c8ef488,Standard,c87706ad-37ff-4419-b4bc-4607d780498e,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.25409836],[0.85310734,0.25409836],[0.86440678,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fb003e5d-a7a2-4da7-916f-94272d001ee5,Standard,f6dfa796-69c1-4deb-8e5d-78d6a29f2b6e,"{""type"":""LineString"",""coordinates"":[[0.96045198,0.25409836],[0.96610169,0.25409836],[0.95480226,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -df3c35c9-4b1b-477b-9722-3162aafc1487,Standard,2424f0ab-9f83-464e-a960-093ab14a2bb5,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.14754098],[0.7740113,0.14754098],[0.78531073,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -68ab9f6b-21c1-46eb-afde-2974072b3f9e,Standard,442c4813-6272-4cf9-b30b-22f9114bc3db,"{""type"":""LineString"",""coordinates"":[[0.68361582,0.14754098],[0.67231638,0.14754098],[0.6779661,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -28c5c34c-a3bb-4f11-88da-6bf48d718eca,Standard,0f9bf171-b79b-4009-8b0b-6ec18c523ebf,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.67213115],[0.75706215,0.67213115],[0.76271186,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -06fd80ca-ed78-4310-87f3-e023fbb23e46,Standard,60c4970b-636a-4f8a-9329-97d01107a962,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.1147541],[0.02259887,0.0942623],[0.02259887,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2aa712e6-4fbb-40e4-baac-a0c2ecd7a8be,Standard,0ffacffd-4f3f-465b-8525-bc22facc45da,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.57377049],[0.14689266,0.57377049],[0.20338983,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -94d96ee4-5d07-4b1b-a369-d8efb100c5e5,Standard,a9a94bc3-fa83-410a-9e71-38807e8d121c,"{""type"":""LineString"",""coordinates"":[[0.74576271,0.89344262],[0.75706215,0.89344262],[0.75141243,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -676cc51f-74ee-4ff5-bc99-ef52b02c1abb,Standard,7f853fc7-6d3e-4086-82b0-cc93c8257f46,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.36885246],[0.92655367,0.36885246],[0.92090395,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -acb8900a-00d8-4ad2-86d5-eb04bd663251,Standard,a2a8bc02-02a9-40d8-9495-058c04d7df89,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.77868852],[0.88135593,0.77868852],[0.88700565,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +uuid,graphic_layer,line,path +64cbd123-f34e-4732-beab-76022918e26c,Standard,87cd1ae0-2ac4-46fb-aeb8-b2f710da299b,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.77868852],[0.77966102,0.77868852],[0.78531073,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0cff94f9-313a-407e-9261-659d48c4d22a,Standard,ca425259-fab4-4dc1-99c9-c19031121645,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.77868852],[0.92655367,0.77868852],[0.91525424,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +425a1be6-d966-476e-8266-4ba140da64e2,Standard,5753e615-c90a-4008-92ec-b50c8195f95f,"{""type"":""LineString"",""coordinates"":[[0.65536723,0.67213115],[0.66666667,0.67213115],[0.66101695,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b0b7371e-66d5-4406-b7d3-a17809309afa,Standard,93cd3af7-2dbb-4804-9386-d15705b5f18e,"{""type"":""LineString"",""coordinates"":[[0.61016949,0.67213115],[0.61581921,0.67213115],[0.62146893,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +446be4bd-f603-4b51-9387-39cf2aa66b2a,Standard,5763fe56-89a4-4407-ba41-c1a528dd50a0,"{""type"":""LineString"",""coordinates"":[[0.63276836,0.89344262],[0.64971751,0.89344262],[0.65536723,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 8df4fa46-3c96-4229-9d6a-262cc80ed213,Standard,d74febce-1b8d-4f51-9721-5eb1866d6b4e,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.0],[0.15819209,0.0204918],[0.15819209,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fe3ffb5a-c30a-4f20-a70e-ed2bc99a607a,Standard,b08cf4bc-d9f2-4608-a162-74db09b16db0,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.40573864],[0.84180791,0.44262295],[0.84180791,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -09a046f1-f148-40aa-afeb-6592859da87d,Standard,094a0827-54d8-4ed9-bb8f-2766db020c87,"{""type"":""LineString"",""coordinates"":[[0.70056497,0.89344262],[0.6779661,0.89344262],[0.68361582,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f0e55d77-f8a0-4f63-b039-013a39f06539,Standard,d59a733b-b7c6-401b-8e38-653e0cb72b5c,"{""type"":""LineString"",""coordinates"":[[0.78531073,0.45901639],[0.78531073,0.44262295],[0.78531073,0.45081967]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -702afdf5-0671-4f37-b888-5342fa3474de,Standard,184c0d91-3f4b-4816-a82d-519e4bcd7ee9,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.75409836],[0.25423729,0.75409836],[0.28248588,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d923185a-03a0-484b-a66d-08f4757aadf7,Standard,2d552f15-6871-4e09-84b1-003da098d909,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.1557377],[0.11864407,0.1557377],[0.14689266,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d3484467-529b-4f61-b8a1-fa4dfae30c31,Standard,764eccc0-09cc-4c7a-bf76-33259938530c,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.77868852],[0.8700565,0.77868852],[0.86440678,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7e4b4545-d04e-4eb3-989a-ae75afbaad37,Standard,cc8bc119-79d7-479b-8767-8b108a0ba4a0,"{""type"":""LineString"",""coordinates"":[[0.75141243,0.14754098],[0.74011299,0.14754098],[0.74576271,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" f1c8cd3e-5521-4539-8e13-aa5149272297,Standard,7f2e8019-f650-42b7-bd39-6895cb9c4d9f,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.67213115],[0.8700565,0.67213115],[0.86440678,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -623fe9a8-af66-455f-bad3-251c66ecf8bb,Standard,412d395e-7ebc-4cc6-88fb-24006f54c931,"{""type"":""LineString"",""coordinates"":[[0.80225989,0.57377049],[0.8079096,0.57377049],[0.81355932,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -271af476-bfb4-4dfd-8de9-4a447259c4ea,Standard,230eae02-e233-4975-9cbb-268d0af4a492,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.36885246],[0.89265537,0.36885246],[0.89830508,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -04c0323b-b630-470f-9c69-1c9097106eaf,Standard,368c8108-0953-4e5a-90db-7c57a9057b20,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.89344262],[0.66101695,0.89344262],[0.65536723,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ddf21544-9ca4-474f-be9b-9ead99cbb17f,Standard,02d85e44-4196-4ed1-9fa4-af9211dbd753,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.52459016],[0.93785311,0.57377049],[0.93785311,0.54918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -779b60ba-822c-451f-9f5f-ecf6909582a3,Standard,d9d3a1f3-5090-4015-86a5-60be94fadcbf,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.66393443],[0.22881291,0.66393443],[0.25423729,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0ba2c517-f72b-4bf3-804c-01dea7c4e4dd,Standard,088e3b53-78f3-445a-bbc6-9da3efbda0a3,"{""type"":""LineString"",""coordinates"":[[0.97740113,0.39344262],[0.97740113,0.32377143],[0.97740113,0.25409836],[0.96610169,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bb7d1a7a-8dc5-4e59-a8ef-be64bb83f58c,Standard,24537b9f-9cb9-45d1-8bbb-f87e3a948a69,"{""type"":""LineString"",""coordinates"":[[0.85310734,0.67213115],[0.85875706,0.67213115],[0.84745763,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ee353ae3-c6e1-4529-9881-ec10d1d7b328,Standard,66651745-4425-4a9a-9a2a-3f2715252cf6,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.66393443],[0.20338983,0.66393443],[0.14689266,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b0b7371e-66d5-4406-b7d3-a17809309afa,Standard,93cd3af7-2dbb-4804-9386-d15705b5f18e,"{""type"":""LineString"",""coordinates"":[[0.61016949,0.67213115],[0.61581921,0.67213115],[0.62146893,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d031dde1-6f80-4af1-a1f2-cbb223220469,Standard,4cfd425d-6158-4904-86b5-d16dc47a4778,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.67213115],[0.89830508,0.67213115],[0.9039548,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bd830d87-73b0-44c8-9250-26afd33ac4f5,Standard,10c6a103-3132-4324-8f76-8c1858d51fcb,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.24590164],[0.17514124,0.24590164],[0.14689266,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -526bac21-e1fd-45aa-8dc1-3230569b51fa,Standard,f606c03b-66d1-4765-97e6-1319ad6ac0c3,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.75409836],[0.20338983,0.75409836],[0.14689266,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -723fb8fc-90ff-44d5-9c21-88a9f194e83a,Standard,5d1176ac-e64e-4811-8d0c-c87d9060ba2a,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.1557377],[0.05084746,0.27868852],[0.05084746,0.21721405],[0.05084746,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -816a5b4d-dae9-488c-9bed-b5e90fb62c89,Standard,21dc5686-67b6-49dc-b5aa-ecc7f7deb620,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.77868852],[0.93785311,0.77868852],[0.94915254,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bef95efd-2cd8-472f-831d-c3bd3c207aa3,Standard,58105b87-e27d-4d7f-b492-42434801bdf7,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.89344262],[0.74576271,0.89344262],[0.74011299,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -24b27c1d-1816-4855-bb80-96ca34ded7c1,Standard,f6c9e202-6548-405e-9969-bc4ae68ef7c1,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.44262295],[0.81355932,0.44262295],[0.8079096,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a8e794de-f56b-438c-af42-b40521bbb236,Standard,de25721a-7ad9-450f-9e89-f483f19bf8a7,"{""type"":""LineString"",""coordinates"":[[0.70621469,0.25409836],[0.71186441,0.25409836],[0.71751412,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c1971b4a-7f78-4488-a54f-03867b87cdf8,Standard,7614ed07-f464-4a56-8ea2-cf07772530c4,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.67213115],[0.94350282,0.67213115],[0.94915254,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -5e4cf1b3-fa4e-409b-84d1-e9a95ca0b7a6,Standard,f4ca1fb7-d17a-4d51-866d-ea2ae22c6f0c,"{""type"":""LineString"",""coordinates"":[[0.66101695,0.25409836],[0.67231638,0.25409836],[0.66666667,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4e955f6a-da29-4020-874c-7608dbf744db,Standard,ca765f8e-2a05-40fb-80b8-41e02887fa46,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.67213115],[0.75141243,0.67213115],[0.74576271,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b634d0e8-330a-40ac-bf97-0caa01370bcf,Standard,6862b157-39c8-47d2-b31c-e418e1bad9a2,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.77868852],[0.69491525,0.77868852],[0.70056497,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -274aaed5-3d6d-402b-8dbd-d56b9bac6ef5,Standard,56e0ddce-ad67-435e-ad8c-5e276c13018a,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.75409836],[0.06214689,0.78688525],[0.06214689,0.75409836],[0.06214689,0.7704918]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a93405e4-5473-437e-97d1-a0ea6a907b09,Standard,7bc8b609-baba-4afe-8cec-866d74e91e43,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.67213115],[0.88135593,0.67213115],[0.87570621,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -41239a55-df02-4249-84df-18824c2740f4,Standard,9ec195e0-4c9b-48a6-9233-0d770b34705b,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.77868852],[0.85310734,0.77868852],[0.84745763,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -14080b5a-f167-4d9f-bd93-c822c069807f,Standard,56603d19-84d5-4c2f-a42c-92777602999a,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.25409836],[0.78531073,0.25409836],[0.79661017,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -762d71ac-bff2-4b7d-a3d0-1997e7fc6c9d,Standard,7d9647cb-e7ca-4ecc-a79e-edb1bfbfb666,"{""type"":""LineString"",""coordinates"":[[0.96610169,0.14754098],[0.95480226,0.14754098],[0.96045198,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4090c3b8-35a0-45ce-aa49-9f37a5ddd55f,Standard,d54fcb7e-d472-4035-aff6-2646ce881931,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.36885246],[0.90960452,0.36885246],[0.89830508,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -272469ff-22c6-4f7f-ac31-b4bec6d952af,Standard,8a09b9b8-6c9f-4dc7-a5a5-fe5d22b5809a,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.25409836],[0.84180791,0.25409836],[0.85310734,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -600d7a2d-1aca-4b9c-ae82-095ce59eed0b,Standard,ebd1f65a-65ae-4620-b1cf-79898683c9e1,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.0204918],[0.0960452,0.04098361],[0.0960452,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a0d87b77-0767-470f-adff-3333d612e076,Standard,9039f436-9be6-4c74-86b2-b5add2446d0a,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.07377049],[0.22033898,0.1147541],[0.22033898,0.0942623]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a8182e9b-729e-4097-824c-bb1ffdf76499,Standard,2005c393-edc4-4cc4-80af-ebbde1305b8e,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.96721311],[0.72881356,0.96721311],[0.72316384,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -09c5fc01-1148-4ee9-9dca-b1f04954def6,Standard,836bf4ab-38e1-44f5-a082-723fc12e4845,"{""type"":""LineString"",""coordinates"":[[0.95480226,0.67213115],[0.96045198,0.67213115],[0.94915254,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9ebd2d6d-020f-43d0-859f-572048423fa5,Standard,5905e32c-b1d7-40d9-9759-84dbe6b14ba8,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.77868852],[0.72316384,0.77868852],[0.71751412,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e5853628-7933-41bf-8928-1cbed722d992,Standard,8dd3984e-a9f6-4829-9c19-a377e3491f9a,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.14754098],[0.71751412,0.14754098],[0.70621469,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -020d5d66-68b8-4849-a49d-7ef75c5d660a,Standard,09125a13-324b-4611-a718-5028b390f1ca,"{""type"":""LineString"",""coordinates"":[[0.96045198,0.67213115],[0.98305085,0.91803279],[0.98305085,0.79508197],[0.98305085,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -19c31421-6513-4f44-883b-586d45bbe732,Standard,8cc7bf8e-226d-41c9-9cd0-7524ea9186f7,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.89344262],[0.91525424,0.89344262],[0.92655367,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9e61a9a5-b9b7-4033-b8bc-87db9dc0665e,Standard,220f509c-9aea-4e60-8dc1-593d2e35ed21,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.77868852],[0.79661017,0.77868852],[0.80225989,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -abf466a5-497f-471d-8571-8d51f687bc26,Standard,0d6627e5-9f9e-4c40-90c1-45abd98a51cd,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.2295082],[0.0960452,0.20901733],[0.0960452,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6c612da8-8b8c-4d36-88e1-75a17fe6183c,Standard,d97f2684-22cb-4c14-b01c-b95081d4d624,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.96721311],[0.81355932,0.96721311],[0.82485876,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7d5ff8b0-0692-4a90-bd37-24f4d8d61b98,Standard,13cfe1fb-1cec-4c17-baf8-b7dcb9f744cd,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.36885246],[0.94915254,0.36885246],[0.96610169,0.39344262],[0.96610169,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0a19a747-608b-47ae-afee-68ce774e8a89,Standard,971288e4-038b-49d5-8df0-b2a7fdc0e17c,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.13114754],[0.22033898,0.14754098],[0.22033898,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +077c54e5-7a8c-4c1c-8c3c-d72b4b7b0e11,Standard,97d5bd4a-ce14-4ded-90d4-4f2db25d6626,"{""type"":""LineString"",""coordinates"":[[0.74011299,0.36885246],[0.74576271,0.36885246],[0.75141243,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +28b087ec-86fc-4701-b3b2-5a9b3c8e873e,Standard,04d02ea8-ba96-4a7f-969d-d25e201e32c6,"{""type"":""LineString"",""coordinates"":[[0.94915254,0.57377049],[0.93785311,0.57377049],[0.96045198,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d43ae4c8-5544-4df7-9c24-8d39301cf3a5,Standard,00a3c4ab-e866-42a9-854f-fbf28c7f6a43,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.77868852],[0.81355932,0.77868852],[0.80225989,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fe3ffb5a-c30a-4f20-a70e-ed2bc99a607a,Standard,b08cf4bc-d9f2-4608-a162-74db09b16db0,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.40573864],[0.84180791,0.44262295],[0.84180791,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 8429ecfe-031f-44ea-b7ff-b708c46e87cd,Standard,b13204e1-02fa-49dd-92e2-c3310a15909a,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.89344262],[0.72881356,0.89344262],[0.72316384,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 7f9e41b0-3a43-4107-98e7-e1763ebc0db8,Standard,42828cac-b67e-4d5c-b4fa-787c57f16fde,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.07377049],[0.22033898,0.04098361],[0.12429379,0.04098361],[0.02824859,0.06557377],[0.02824859,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -351b1bbd-8daf-427c-a18b-4fa6597db574,Standard,81578256-7c89-4651-8863-31fd206c628c,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.36885246],[0.70621469,0.36885246],[0.72316384,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -425a1be6-d966-476e-8266-4ba140da64e2,Standard,5753e615-c90a-4008-92ec-b50c8195f95f,"{""type"":""LineString"",""coordinates"":[[0.65536723,0.67213115],[0.66666667,0.67213115],[0.66101695,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -abe20917-26ae-41ba-8373-916d8cfe6497,Standard,03b3d5c7-cb42-45d7-a5b7-b44c60ad5268,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.07377049],[0.0960452,0.0942623],[0.0960452,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0eb4a8c0-bf8d-49c6-be95-c5e030be9dda,Standard,c64c73c4-109b-4baa-bf44-3357d4bca7d8,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.77868852],[0.89830508,0.77868852],[0.9039548,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -97ca267c-1174-4faf-9617-56bd2a90a390,Standard,3026e0ba-0a46-4d5e-afff-953c34fde207,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.04918033],[0.94350282,0.02459016],[0.94350282,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4506a9cb-e391-43f7-ba75-88f376b40cf1,Standard,d7c951cc-2e8f-40d0-b310-03fbdb9b0558,"{""type"":""LineString"",""coordinates"":[[0.88135593,0.25409836],[0.88700565,0.25409836],[0.87570621,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -eb5e4437-0f18-43c1-9e51-51bcfc038bea,Standard,37c8ebe1-5d29-4806-a84a-fc00e4279fa6,"{""type"":""LineString"",""coordinates"":[[0.22881291,0.06557377],[0.25423729,0.06557377],[0.20338983,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -69e84854-3ccd-478b-bfd4-36179f27ce1d,Standard,73c09f1f-3538-4b5f-acbf-38b686a0dbba,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.57377049],[0.93785311,0.57377049],[0.92655367,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -643e73ad-b1dd-4965-8e27-f7a5aac9b2f5,Standard,5157574f-5e67-4574-81a3-686b97a893ff,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.44262295],[0.78531073,0.44262295],[0.7740113,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b6211854-7f10-4f8b-ab3e-f4e32cbe01c8,Standard,f93f5e08-f351-4b2b-8cb0-9ec01203c1b9,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.96721311],[0.83050847,0.96721311],[0.82485876,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -69c87952-34ed-4092-8522-dd2c66ac48f5,Standard,eb1cd362-f3bd-4411-a45d-a237bcb07789,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.89344262],[0.75706215,0.89344262],[0.76271186,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d7f74d06-26c4-4f97-b45c-e51aa12ab9fe,Standard,71832b7e-b5a2-40d4-82d3-e8f1ba38ace6,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.57377049],[0.89265537,0.57377049],[0.88135593,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7c9a8ae8-b024-4bf6-ade7-154fd3f39d7a,Standard,746fa279-2acf-4aa1-b3e1-8d312d66058a,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.77868852],[0.91525424,0.77868852],[0.90960452,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -abed22cb-da71-4459-9221-9b63cb8c672b,Standard,d5d7329a-08a2-4946-8a02-d4a70746d37b,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.96721311],[0.79661017,0.96721311],[0.80225989,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -90022bb0-1fb8-4b03-8220-30c2fc7bf6c9,Standard,2770ee0b-96ca-4677-9933-8d82643501e3,"{""type"":""LineString"",""coordinates"":[[0.82485876,0.57377049],[0.81920904,0.57377049],[0.81355932,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fd9f1ff2-8ac3-44a6-a65d-9f8344c68b32,Standard,3029d722-91ec-4e45-9243-d267222b6c8e,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.25409836],[0.94350282,0.25409836],[0.93785311,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d2f946ca-00f5-4f0f-be6c-eed2c34180d5,Standard,94071ac7-ae51-4e45-8795-9d10bda616e9,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.1147541],[0.02259887,0.13114754],[0.02259887,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4bbd03a7-34fd-4fdd-9371-a77b305792e2,Standard,9085189c-48df-498a-80e5-49fe54692a66,"{""type"":""LineString"",""coordinates"":[[0.14689266,0.57377049],[0.11864407,0.57377049],[0.09039548,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7e4c4142-2c08-494c-bd3a-f8876ac8c176,Standard,8f9d19a8-8d64-4f62-b6aa-f5f01a12b566,"{""type"":""LineString"",""coordinates"":[[0.94915254,0.25409836],[0.94350282,0.25409836],[0.95480226,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -aeea1358-be04-403e-84e7-5e22226fa156,Standard,222af488-6339-4308-8f25-eac19b6e2c9c,"{""type"":""LineString"",""coordinates"":[[0.63276836,0.89344262],[0.62146893,0.89344262],[0.62711864,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d8f0a014-fdb6-44da-8b0a-abd44e7578c6,Standard,7d68b748-ebe5-430e-95b8-bd0eededa136,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.89344262],[0.92655367,0.89344262],[0.96045198,0.89344262],[0.96045198,0.91803279]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c7b49d97-2495-4f09-97e7-808764ac8b51,Standard,8c6b2196-6705-45ec-9879-8334924f968c,"{""type"":""LineString"",""coordinates"":[[0.62146893,0.36885246],[0.62711864,0.36885246],[0.61581921,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c329e8a9-931a-4efc-8e41-31cad43306de,Standard,d160ec85-06ab-42d2-9dc1-4f905306e0a6,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.36885246],[0.80225989,0.36885246],[0.8079096,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -37e7a43e-7216-4178-81c1-08c1bbc82b26,Standard,5c26821d-ea3b-4a00-8d42-1486710a2ca5,"{""type"":""LineString"",""coordinates"":[[0.78531073,0.14754098],[0.79661017,0.14754098],[0.79096045,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -57ecdb3b-20dd-453d-8333-2961984499b2,Standard,876998db-5326-4257-b2d1-a4722265f51d,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.16803372],[0.22033898,0.14754098],[0.22033898,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a8cd181f-6834-437f-aa9e-6b165504b870,Standard,f0d4491e-eb64-49a0-8fc3-44fa5bd9dcee,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.06557377],[0.25423729,0.06557377],[0.28248588,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -de4bc4d5-2d9e-405d-b63d-6e6534de49e1,Standard,ffdd2907-38ed-4a39-89de-9435e97dadc0,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.25409836],[0.7740113,0.25409836],[0.76271186,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f9f042d8-0aa6-4194-bc49-8a91adb0faab,Standard,affde1a2-90e8-468f-a0a9-eb024f791857,"{""type"":""LineString"",""coordinates"":[[1,0.04918033],[1,0.22131148],[1,0.39344262],[0.96610169,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -76c9c154-bb98-4112-acde-034bfea3eedf,Standard,2c6d3986-9cf2-4c41-9a40-400e4e0b3112,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.77868852],[0.6779661,0.77868852],[0.67231638,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -37d550c7-c9c4-48c3-b2b6-4c120c095dec,Standard,1372ca57-8429-43c6-a589-a402de4ac7f9,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.14754098],[0.93220339,0.14754098],[0.94350282,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7a5177b5-a744-436f-ba4e-8d5f1c5c72ae,Standard,edbbe75f-8d40-42e8-a6f4-857f64547cbd,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.96721311],[0.77966102,0.96721311],[0.78531073,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7cdd95e3-99fd-4221-83c6-0adb0614fef4,Standard,784bfe2a-8d23-4e74-8b05-b13141611186,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.67213115],[0.74576271,0.67213115],[0.74011299,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -99d1011b-78cd-420d-bda7-8c45c0eb6ab6,Standard,fd04cc09-6ff8-48ea-a5eb-453e9d59d6d7,"{""type"":""LineString"",""coordinates"":[[0.17513737,0.07377049],[0.13559322,0.07377049],[0.13559322,0.1557377],[0.21468281,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +271af476-bfb4-4dfd-8de9-4a447259c4ea,Standard,230eae02-e233-4975-9cbb-268d0af4a492,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.36885246],[0.89265537,0.36885246],[0.89830508,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +00ce0bad-3efa-443d-8eed-968cc3132cf8,Standard,75098182-83b1-40ae-baaf-95f1e1f93250,"{""type"":""LineString"",""coordinates"":[[0.63841808,0.14754098],[0.6440678,0.14754098],[0.64971751,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 644acdd9-9a11-4521-9e6b-30a424684207,Standard,6bbccaac-2bbe-4d0b-bb07-80dbb605ec1c,"{""type"":""LineString"",""coordinates"":[[0.74011299,0.25409836],[0.74576271,0.25409836],[0.75141243,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -78f2fb26-f4e1-453e-b1a8-037164e5859d,Standard,cfd11fa8-fcf6-4b65-9523-ee5d21e292ed,"{""type"":""LineString"",""coordinates"":[[0.90960452,0.25409836],[0.9039548,0.25409836],[0.89830508,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -98611c6a-9f1a-4f18-a95c-2abaf27112db,Standard,b5c255b5-8572-41ce-a273-a01d2a4b4e20,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.04918033],[0.82485876,0.04918033],[0.81920904,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -135be5b3-e2f0-4b70-b71f-a2369e57bc15,Standard,ec21c844-ca32-4f95-b6f3-dd8c56128f66,"{""type"":""LineString"",""coordinates"":[[0.88135593,0.14754098],[0.88700565,0.14754098],[0.87570621,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -576ebbf9-77a7-411e-84f9-192176cfe4b6,Standard,d3d211d9-22f6-42ba-a596-0d0ca1c7e943,"{""type"":""LineString"",""coordinates"":[[0.91525424,0.25409836],[0.90960452,0.25409836],[0.92090395,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9944a608-7e0a-4325-963f-76110bbe81b7,Standard,b672be06-2cbc-4510-8a96-34647985e9d5,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.14754098],[0.93220339,0.14754098],[0.92655367,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +94d96ee4-5d07-4b1b-a369-d8efb100c5e5,Standard,a9a94bc3-fa83-410a-9e71-38807e8d121c,"{""type"":""LineString"",""coordinates"":[[0.74576271,0.89344262],[0.75706215,0.89344262],[0.75141243,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e063a648-77d9-43ef-974f-10cbae21da06,Standard,63856192-b60e-48a5-83a3-94422a79e79e,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.36885246],[0.75141243,0.36885246],[0.76271186,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +79a153b2-2b64-4b59-bbe5-946a3c0073bd,Standard,c3206971-b22f-4090-826b-e08d4bc8ffad,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.24590164],[0.25423729,0.24590164],[0.22881421,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +eb5e4437-0f18-43c1-9e51-51bcfc038bea,Standard,37c8ebe1-5d29-4806-a84a-fc00e4279fa6,"{""type"":""LineString"",""coordinates"":[[0.22881291,0.06557377],[0.25423729,0.06557377],[0.20338983,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 2517024b-1ac9-4355-847e-64dc1bce6959,Standard,63be5ffd-acbc-4c4f-aab9-54c616e2dd2e,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.04918033],[0.86440678,0.04918033],[0.85310734,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e4925b18-bc90-46e6-afbd-074e7604a079,Standard,a4792ce6-c652-43e9-9156-5e9d0aa082c2,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.66393443],[0.05084746,0.66393443],[0.05084746,0.78688525],[0.05084746,0.72541077]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9aa0828c-100b-41d9-a1f9-5bc4957d27e5,Standard,a3c0115c-42eb-48a9-a6b0-64635ee66b87,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.14754098],[0.85310734,0.14754098],[0.84745763,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -064f5cc6-d674-40e8-843f-70e91d79f18f,Standard,f2c37ce1-91d3-43d3-beb3-1fc9a30c87fe,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.14754098],[0.89830508,0.14754098],[0.88700565,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c1c61c3b-ca09-4cc7-a9d7-36a3c4214338,Standard,a78fbab6-e680-4c45-9731-97c82f2fb3c8,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.07377049],[0.15819209,0.05737705],[0.15819209,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bbca471b-16c1-4981-8414-b6bf87274cae,Standard,80332374-76fe-4d06-adde-e2197f88fe6e,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.57377049],[0.80225989,0.57377049],[0.77966102,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7e70ed5b-6fc1-4d25-bef7-d65b15598927,Standard,d15c85bb-c9b1-4fa3-8bf6-4aa393b564d4,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.67213115],[0.79661017,0.67213115],[0.80225989,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0cff94f9-313a-407e-9261-659d48c4d22a,Standard,ca425259-fab4-4dc1-99c9-c19031121645,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.77868852],[0.92655367,0.77868852],[0.91525424,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -30a58ed2-09d8-4e43-9aff-7b9f1e3e1f73,Standard,7df282f5-2e54-4220-8276-087634415be8,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.44262295],[0.72881356,0.44262295],[0.74011299,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +19c31421-6513-4f44-883b-586d45bbe732,Standard,8cc7bf8e-226d-41c9-9cd0-7524ea9186f7,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.89344262],[0.91525424,0.89344262],[0.92655367,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +580f595f-8a44-4b1c-8833-ff8202075bb4,Standard,364ffff6-7541-4324-bbcf-fe626ba9de1d,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.25409836],[0.81920904,0.25409836],[0.8079096,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6c8e7b09-25bc-47fb-b94d-fda79b2a7587,Standard,5ff3f25d-ef1d-4ba2-ba1e-b387965a839a,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.36885246],[0.8079096,0.36885246],[0.81920904,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b8808d71-77bb-4645-a465-925b78180142,Standard,4c98fe8a-ca2a-4503-8843-a800cbf92c82,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.14754098],[0.83050847,0.14754098],[0.82485876,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +be192356-2248-4319-afd6-eac828fdb001,Standard,1a1550cf-77b8-40a9-90e5-5d0faef7baaa,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.89344262],[0.80225989,0.89344262],[0.79661017,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +04c0323b-b630-470f-9c69-1c9097106eaf,Standard,368c8108-0953-4e5a-90db-7c57a9057b20,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.89344262],[0.66101695,0.89344262],[0.65536723,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e5853628-7933-41bf-8928-1cbed722d992,Standard,8dd3984e-a9f6-4829-9c19-a377e3491f9a,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.14754098],[0.71751412,0.14754098],[0.70621469,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +623fe9a8-af66-455f-bad3-251c66ecf8bb,Standard,412d395e-7ebc-4cc6-88fb-24006f54c931,"{""type"":""LineString"",""coordinates"":[[0.80225989,0.57377049],[0.8079096,0.57377049],[0.81355932,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a79f2ac5-a708-48be-b910-85542d4fbb71,Standard,71c56dc9-d957-4746-872f-8ad07d4ef8a4,"{""type"":""LineString"",""coordinates"":[[0.67231638,0.36885246],[0.66101695,0.36885246],[0.66666667,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" f2ebf446-7c65-464d-96ba-5d5c3249b78d,Standard,10d957bc-fb58-4a8f-8fd2-96a0b129eb02,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.67213115],[0.69491525,0.67213115],[0.70056497,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f6674e18-ba25-4454-9fed-d7864f493e0f,Standard,5d56c97f-e15c-4676-9b1a-fc5d7efb8a24,"{""type"":""LineString"",""coordinates"":[[0.65536723,0.67213115],[0.6440678,0.67213115],[0.64971751,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7c1b6af1-952c-4304-8d69-da1a0d14b955,Standard,8add0020-bc20-4aaa-9ad3-fa1a1a5ef376,"{""type"":""LineString"",""coordinates"":[[0.7740113,0.36885246],[0.76271186,0.36885246],[0.76836158,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0d80286f-437b-44cc-959f-998de3f51893,Standard,b6b655da-54ed-41d8-a331-04e41d2286de,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.75409836],[0.11864407,0.75409836],[0.14689266,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a17da6b8-ee9a-4ea4-83b4-97ed6a95cfeb,Standard,17e2286d-65ca-4948-8a6c-63bdc13a9b50,"{""type"":""LineString"",""coordinates"":[[0.99435028,0.57377049],[0.99435028,0.91803279],[0.99435028,0.74590164],[0.96045198,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -858c83e7-a54e-4409-abc4-445313cae9d2,Standard,5adb6634-4872-43af-b9cb-39df332b64b2,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.57377049],[0.86440678,0.57377049],[0.85875706,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d557f6be-2b4b-46af-8e8b-2c2e85d210d1,Standard,ff38b3f7-e29d-4f61-946e-59a8b283295c,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.25409836],[0.92655367,0.25409836],[0.92090395,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9c4bc5d8-e9a6-4fc6-9a88-2e09c3823bc4,Standard,47cc3694-2782-4c44-8c61-e14d30dbbaa4,"{""type"":""LineString"",""coordinates"":[[0.7740113,0.36885246],[0.77966102,0.36885246],[0.78531073,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7e4c4142-2c08-494c-bd3a-f8876ac8c176,Standard,8f9d19a8-8d64-4f62-b6aa-f5f01a12b566,"{""type"":""LineString"",""coordinates"":[[0.94915254,0.25409836],[0.94350282,0.25409836],[0.95480226,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 70d56f26-5aff-44a5-b9af-e0141256ab38,Standard,76d82f19-65d7-447d-a14c-95d050139fa5,"{""type"":""LineString"",""coordinates"":[[0.90960452,0.89344262],[0.91525424,0.89344262],[0.9039548,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -731d0c51-6405-43f9-ab85-2ee7039cbef5,Standard,0a068504-0bd7-4484-a0e3-26afade14698,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.14754098],[0.0960452,0.1147541],[0.0960452,0.13114754]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +31dab450-fe89-4ede-99e2-cba361671910,Standard,b714db4a-db55-4957-b503-2300559bb81f,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.1557377],[0.14689266,0.1557377],[0.17514124,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +67fa7b51-f7ce-48c4-b9c5-9856619e2788,Standard,7297611b-fbdc-4949-87fc-1bca403708aa,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.67213115],[0.88135593,0.67213115],[0.88700565,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e52aa402-4f9f-4b5f-8220-f3d4848d67ac,Standard,0c04a652-1076-4b59-a957-652790b4c963,"{""type"":""LineString"",""coordinates"":[[0.78531073,0.45901639],[0.78531073,0.47540984],[0.78531073,0.46721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +88d88084-b78e-4620-837a-8afd74563b91,Standard,43394be2-5c85-4449-ad06-7866395a5c79,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.67213115],[0.92655367,0.67213115],[0.93220339,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bc177fc1-85f8-4475-825d-d875a935cbe1,Standard,84dcef6e-d5b1-436f-8562-369b2489bb10,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.44262295],[0.76271186,0.44262295],[0.7740113,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fd9f1ff2-8ac3-44a6-a65d-9f8344c68b32,Standard,3029d722-91ec-4e45-9243-d267222b6c8e,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.25409836],[0.94350282,0.25409836],[0.93785311,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +8ae601e8-3dcf-497e-a258-d8ac976e95e8,Standard,106f03b3-b84e-4d36-ab09-13b3dc3403e7,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.1557377],[0.25423729,0.1557377],[0.22881291,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4ec7ff3b-9815-43f8-9cba-f46af1a9f423,Standard,31f8365c-9329-4c46-8555-6ec6aadf130e,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.57377049],[0.85875706,0.57377049],[0.85310734,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e4925b18-bc90-46e6-afbd-074e7604a079,Standard,a4792ce6-c652-43e9-9156-5e9d0aa082c2,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.66393443],[0.05084746,0.66393443],[0.05084746,0.78688525],[0.05084746,0.72541077]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b622cf65-64b2-454b-900e-a191d7231dbc,Standard,0b1f06c3-9622-47cd-b41f-bd0314673b8d,"{""type"":""LineString"",""coordinates"":[[0.85310734,0.14754098],[0.86440678,0.14754098],[0.85875706,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +99d1011b-78cd-420d-bda7-8c45c0eb6ab6,Standard,fd04cc09-6ff8-48ea-a5eb-453e9d59d6d7,"{""type"":""LineString"",""coordinates"":[[0.17513737,0.07377049],[0.13559322,0.07377049],[0.13559322,0.1557377],[0.21468281,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +8b7a0eb4-e725-4416-ac52-3810059bfc5c,Standard,95644bf5-8dca-4409-bb04-7d4e9a24fa03,"{""type"":""LineString"",""coordinates"":[[0.63841808,0.14754098],[0.63276836,0.14754098],[0.62711864,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +aeea1358-be04-403e-84e7-5e22226fa156,Standard,222af488-6339-4308-8f25-eac19b6e2c9c,"{""type"":""LineString"",""coordinates"":[[0.63276836,0.89344262],[0.62146893,0.89344262],[0.62711864,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +5e94948f-0707-4691-910a-60a217ab9102,Standard,2887fb2b-fe44-4436-b28e-9f100f8288ac,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.57377049],[0.25423729,0.57377049],[0.28248588,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +274aaed5-3d6d-402b-8dbd-d56b9bac6ef5,Standard,56e0ddce-ad67-435e-ad8c-5e276c13018a,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.75409836],[0.06214689,0.78688525],[0.06214689,0.75409836],[0.06214689,0.7704918]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2e32f0e7-43fd-4f42-8376-ce687378e5aa,Standard,8885b761-4c1a-4924-be8a-b8f474d8f629,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.18852459],[0.15819209,0.20901733],[0.15819209,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +74887fe3-c3a5-4919-8b77-743e3f2c5bd4,Standard,d48db7e8-5fde-456f-8b17-02d18a5a2e32,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.1557377],[0.25423729,0.1557377],[0.28248588,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +de4bc4d5-2d9e-405d-b63d-6e6534de49e1,Standard,ffdd2907-38ed-4a39-89de-9435e97dadc0,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.25409836],[0.7740113,0.25409836],[0.76271186,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0ba2c517-f72b-4bf3-804c-01dea7c4e4dd,Standard,088e3b53-78f3-445a-bbc6-9da3efbda0a3,"{""type"":""LineString"",""coordinates"":[[0.97740113,0.39344262],[0.97740113,0.32377143],[0.97740113,0.25409836],[0.96610169,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9ebd2d6d-020f-43d0-859f-572048423fa5,Standard,5905e32c-b1d7-40d9-9759-84dbe6b14ba8,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.77868852],[0.72316384,0.77868852],[0.71751412,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 890090ef-f4f2-4ff6-b11b-9eda935b67c5,Standard,16b934cc-98c6-42b9-9005-be4bf7365693,"{""type"":""LineString"",""coordinates"":[[0.22881291,0.57377049],[0.25423729,0.57377049],[0.20338983,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0238d402-4cd5-4f04-8838-02d4ac837e48,Standard,97b9a53e-9ff2-4567-95c0-6c9aab07a43f,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.67213115],[0.72881356,0.67213115],[0.72316384,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3b3b0a7b-f2c4-4035-a97d-b86bc8c4f60e,Standard,2c4fae2c-c565-4111-b535-8488737aa358,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.25409836],[0.74011299,0.25409836],[0.73446328,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -75f3b026-fcc1-4403-844f-8c595cb797c1,Standard,a8b86d8f-a196-4eca-b248-66bc8918f9e6,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.89344262],[0.7740113,0.89344262],[0.77966102,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b143bc7f-d331-491b-bc17-b2a5efbd8624,Standard,ab23d369-ff75-41b4-8a25-25ec9c4320aa,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.67213115],[0.76836158,0.67213115],[0.7740113,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6e77b999-e8d0-40eb-91e8-fa1437071b53,Standard,ce8ea248-dbcb-40b9-a97d-22452032ad27,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.67213115],[0.84745763,0.67213115],[0.83615819,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6c8e7b09-25bc-47fb-b94d-fda79b2a7587,Standard,5ff3f25d-ef1d-4ba2-ba1e-b387965a839a,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.36885246],[0.8079096,0.36885246],[0.81920904,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 4c56b3b5-fa87-4f28-a448-8b0c18e4fa5b,Standard,d8d23da6-be08-4ace-8d93-70c0faab1505,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.04918033],[0.90960452,0.04918033],[0.91525424,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ef83135b-8f60-402c-b01b-35cbcd10dae1,Standard,815bc4d0-3418-4d15-8f85-c104a24e6b17,"{""type"":""LineString"",""coordinates"":[[0.62146893,0.14754098],[0.61581921,0.14754098],[0.62711864,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6648b930-5922-4929-ba68-61da0122ebf2,Standard,ab7c6c3c-3b7f-4475-8cad-27657bc148c6,"{""type"":""LineString"",""coordinates"":[[0.95480226,0.77868852],[0.96045198,0.77868852],[0.94915254,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7c3d59a2-9fbd-4b26-a8f5-19762ff323a5,Standard,0b6f398b-30f3-41f1-9bc2-ec93e91e8f19,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.25409836],[0.72316384,0.25409836],[0.71751412,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -75e06780-090a-411f-a47c-47c5a90a2e09,Standard,4bdb6569-72da-4d60-97b1-b5a639032d5d,"{""type"":""LineString"",""coordinates"":[[0.25423729,0.24590164],[0.28248588,0.24590164],[0.31073446,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b8808d71-77bb-4645-a465-925b78180142,Standard,4c98fe8a-ca2a-4503-8843-a800cbf92c82,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.14754098],[0.83050847,0.14754098],[0.82485876,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7d30150b-f752-417b-bbed-a6f3ecd2f823,Standard,bf6e54ab-1c74-4ce7-8371-b47e9019bd25,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.07377049],[0.02259887,0.04098361],[0.02259887,0.05737705]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7db35bba-5e4d-4964-abbe-a2e18b630f59,Standard,08d39ce3-e843-49bd-9b46-1fe927a1d4be,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.25409836],[0.7740113,0.25409836],[0.78531073,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f96dad25-b70b-459a-a1fe-d704fcd6410c,Standard,473a11f4-1691-44ba-8e95-96782bc9d07f,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.14754098],[0.66101695,0.14754098],[0.67231638,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +858c83e7-a54e-4409-abc4-445313cae9d2,Standard,5adb6634-4872-43af-b9cb-39df332b64b2,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.57377049],[0.86440678,0.57377049],[0.85875706,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +1d22d39f-e8b0-43b3-ab64-67ea9c72e892,Standard,6f875559-5af0-47a9-9f0e-f1d8332f9230,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.96721311],[0.8079096,0.96721311],[0.80225989,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +75c4a953-e8af-496f-b844-0e201f12c8da,Standard,e1315733-0b28-4465-8367-fa4535d282fa,"{""type"":""LineString"",""coordinates"":[[0.86440678,0.14754098],[0.8700565,0.14754098],[0.87570621,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +91bf20e1-1a3b-4b69-b55b-a4ab8a5b3ae9,Standard,445cc0c8-70b8-47d4-987f-308269b845a3,"{""type"":""LineString"",""coordinates"":[[0.61581921,0.89344262],[0.62146893,0.89344262],[0.61016949,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +69c87952-34ed-4092-8522-dd2c66ac48f5,Standard,eb1cd362-f3bd-4411-a45d-a237bcb07789,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.89344262],[0.75706215,0.89344262],[0.76271186,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d969661d-d4dc-4544-95aa-54baebea0e8f,Standard,a102f0f4-e86d-438c-95a9-d3fc6357121f,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.57377049],[0.91525424,0.57377049],[0.90960452,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +09a046f1-f148-40aa-afeb-6592859da87d,Standard,094a0827-54d8-4ed9-bb8f-2766db020c87,"{""type"":""LineString"",""coordinates"":[[0.70056497,0.89344262],[0.6779661,0.89344262],[0.68361582,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3de72fa7-5070-4429-b1d9-80d7f3273834,Standard,060f10e1-2ffd-4972-9ace-7fff8df78658,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.77868852],[0.72316384,0.77868852],[0.72881356,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +38d3d470-96ef-4884-80b9-b1fd23375ef1,Standard,1cfc85dd-3fb8-48a3-9ea1-b11b1b9ca8d4,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.57377049],[0.87570621,0.57377049],[0.88135593,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +13e3fc68-ff6f-4bd6-94cd-697d584f020c,Standard,a4dc31e8-e10a-4b42-90b4-f14d0f133c0c,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.25409836],[0.84180791,0.25409836],[0.83615819,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 38558b72-56a7-4b85-a4fe-db0f4e2bcb19,Standard,4dbb5675-cc27-4868-a9cc-e28ca232ba23,"{""type"":""LineString"",""coordinates"":[[0.95480226,0.14754098],[0.94915254,0.14754098],[0.94350282,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e063a648-77d9-43ef-974f-10cbae21da06,Standard,63856192-b60e-48a5-83a3-94422a79e79e,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.36885246],[0.75141243,0.36885246],[0.76271186,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c1fd7798-e4fd-4cfb-af81-2cf23744637c,Standard,5f8eb2b8-0f98-4011-bc3a-b182285be4db,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.44262295],[0.83050847,0.44262295],[0.82485876,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7548e909-99a8-426b-9c9a-7551e6fc7a87,Standard,13ea7170-5fc1-4ed8-be71-0a91a9e5df99,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.67213115],[0.79096045,0.67213115],[0.78531073,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f6991b3a-2ada-49cf-abf1-a63a965f014c,Standard,22d61b21-2a7d-4be8-b14b-f0d72e1c5ba7,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.04918033],[0.81355932,0.04918033],[0.81920904,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +8004803f-5af6-4eb8-be81-78bee4d8f302,Standard,be047b0d-9f7c-413e-bd60-f38b45d5ee80,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.89344262],[0.82485876,0.89344262],[0.83050847,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6e77b999-e8d0-40eb-91e8-fa1437071b53,Standard,ce8ea248-dbcb-40b9-a97d-22452032ad27,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.67213115],[0.84745763,0.67213115],[0.83615819,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +654af5fb-14d5-4f67-8a21-f5481a814555,Standard,52ccd989-d87b-4f9f-9d5d-a0609391f56e,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.89344262],[0.82485876,0.89344262],[0.81355932,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +5e4cf1b3-fa4e-409b-84d1-e9a95ca0b7a6,Standard,f4ca1fb7-d17a-4d51-866d-ea2ae22c6f0c,"{""type"":""LineString"",""coordinates"":[[0.66101695,0.25409836],[0.67231638,0.25409836],[0.66666667,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 2943f23e-2c36-4e11-9865-1687d782d9ff,Standard,997840bf-8c94-444f-83f1-e9c991706d7c,"{""type"":""LineString"",""coordinates"":[[0.01694915,0.06557377],[0.11864407,0.07377049],[0.06779661,0.07377049],[0.11864407,0.1557377],[0.01694915,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d1c04861-36ef-49b7-9a2b-5fa2706734ad,Standard,bfecad6c-ddda-4957-ae66-f04d30fd7104,"{""type"":""LineString"",""coordinates"":[[0.66101695,0.36885246],[0.63841808,0.36885246],[0.65536723,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -64cbd123-f34e-4732-beab-76022918e26c,Standard,87cd1ae0-2ac4-46fb-aeb8-b2f710da299b,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.77868852],[0.77966102,0.77868852],[0.78531073,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2e32f0e7-43fd-4f42-8376-ce687378e5aa,Standard,8885b761-4c1a-4924-be8a-b8f474d8f629,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.18852459],[0.15819209,0.20901733],[0.15819209,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -79eac61e-e3b2-421a-9716-9940963761f0,Standard,199bc8fc-71a0-4c78-a64d-80a87f0f6b78,"{""type"":""LineString"",""coordinates"":[[0.7740113,0.57377049],[0.75706215,0.57377049],[0.77966102,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fb4b559f-3d60-40f8-aa42-6741e8976026,Standard,81f4c585-6170-4a9e-981f-2185a0d7f2ec,"{""type"":""LineString"",""coordinates"":[[0.23163842,0.07377049],[0.23163842,0.1147541],[0.23163842,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7cdd95e3-99fd-4221-83c6-0adb0614fef4,Standard,784bfe2a-8d23-4e74-8b05-b13141611186,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.67213115],[0.74576271,0.67213115],[0.74011299,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c061601a-9997-4176-a25d-aac4510a0fbc,Standard,29747132-2fe5-4570-8d02-114d3438835c,"{""type"":""LineString"",""coordinates"":[[0.67231638,0.25409836],[0.6779661,0.25409836],[0.68361582,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2aa712e6-4fbb-40e4-baac-a0c2ecd7a8be,Standard,0ffacffd-4f3f-465b-8525-bc22facc45da,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.57377049],[0.14689266,0.57377049],[0.20338983,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +cd44faca-2232-4565-9886-8dc5b92ccb96,Standard,eb64f0fb-1810-4b49-b0a6-e94a6422be04,"{""type"":""LineString"",""coordinates"":[[0.98870056,0.39344262],[0.96610169,0.14754098],[0.98870056,0.14754098],[0.98870056,0.2704918]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +ddf21544-9ca4-474f-be9b-9ead99cbb17f,Standard,02d85e44-4196-4ed1-9fa4-af9211dbd753,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.52459016],[0.93785311,0.57377049],[0.93785311,0.54918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 606bfb84-710f-493d-8726-c3293352134c,Standard,1cf0cb95-28b9-4dc1-82b9-3466d7d870cc,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.67213115],[0.68361582,0.67213115],[0.6779661,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +28c5c34c-a3bb-4f11-88da-6bf48d718eca,Standard,0f9bf171-b79b-4009-8b0b-6ec18c523ebf,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.67213115],[0.75706215,0.67213115],[0.76271186,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d377b2a4-317a-4934-8442-33b32bf55c4b,Standard,9af99daa-1e1e-45a8-bbed-c77e47ba4f8a,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.77868852],[0.70621469,0.77868852],[0.70056497,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b6211854-7f10-4f8b-ab3e-f4e32cbe01c8,Standard,f93f5e08-f351-4b2b-8cb0-9ec01203c1b9,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.96721311],[0.83050847,0.96721311],[0.82485876,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c329e8a9-931a-4efc-8e41-31cad43306de,Standard,d160ec85-06ab-42d2-9dc1-4f905306e0a6,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.36885246],[0.80225989,0.36885246],[0.8079096,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +731d0c51-6405-43f9-ab85-2ee7039cbef5,Standard,0a068504-0bd7-4484-a0e3-26afade14698,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.14754098],[0.0960452,0.1147541],[0.0960452,0.13114754]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +1d132dc2-af13-46f5-ab50-167e6d59fb0c,Standard,c23b7659-8e54-410a-b0e9-9eccbe2457dc,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.36885246],[0.84180791,0.36885246],[0.85310734,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 3753f696-3d3c-4153-b4b2-a212393224f3,Standard,2e5bf3d7-11a5-496f-9bd5-bb9d3686a576,"{""type"":""LineString"",""coordinates"":[[0.90960452,0.67213115],[0.9039548,0.67213115],[0.91525424,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6df8c538-c0a6-4317-99f3-3068051701d1,Standard,de5aeea7-2505-4f0d-9d53-22a5287ab8b7,"{""type"":""LineString"",""coordinates"":[[0.70056497,0.25409836],[0.69491525,0.25409836],[0.70621469,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f6991b3a-2ada-49cf-abf1-a63a965f014c,Standard,22d61b21-2a7d-4be8-b14b-f0d72e1c5ba7,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.04918033],[0.81355932,0.04918033],[0.81920904,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +ae02da1d-991a-4e16-81dd-2970373ec004,Standard,83b12a0c-d66f-43cf-a5c1-1945a8a66c4c,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.77868852],[0.65536723,0.77868852],[0.66101695,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 93037ae2-ded0-404e-a453-841008d2f285,Standard,22acea8e-cde0-45a4-82e6-ce5241226aac,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.67213115],[0.70621469,0.67213115],[0.70056497,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -49330239-a43c-47c9-82cb-f65469f2265a,Standard,d00ddea9-83f7-411a-9da6-f9607ffb3c87,"{""type"":""LineString"",""coordinates"":[[0.62711864,0.67213115],[0.63276836,0.67213115],[0.62146893,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6b5fc3d8-f582-4658-b99e-a1fe3531d310,Standard,a92769d6-3f6f-4e67-98b3-303e59dd9cda,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.14754098],[0.91525424,0.14754098],[0.90960452,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2df37064-78de-4de2-8cb5-561fa8cec2d3,Standard,b11ce01e-37ce-4ea7-b3a3-4db89820fde1,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.44262295],[0.84180791,0.44262295],[0.83050847,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2591882d-ad68-4e8a-9ec1-370d33dafb29,Standard,7b7ac3b3-877f-4cba-8ad4-6171f2c5b83c,"{""type"":""LineString"",""coordinates"":[[0.91525424,0.36885246],[0.90960452,0.36885246],[0.92090395,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b175f10d-452b-48a1-a536-b8ae8fc1241e,Standard,b140dccb-7251-496b-9402-06ebd13048c2,"{""type"":""LineString"",""coordinates"":[[0.62711864,0.36885246],[0.63841808,0.36885246],[0.63276836,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -90ad029a-358f-4f05-8a01-62820461dbb2,Standard,814dec01-f6f2-4817-8f83-2e758011b033,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.24590164],[0.06214689,0.27868852],[0.06214689,0.24590164],[0.06214689,0.26229508]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -75c4a953-e8af-496f-b844-0e201f12c8da,Standard,e1315733-0b28-4465-8367-fa4535d282fa,"{""type"":""LineString"",""coordinates"":[[0.86440678,0.14754098],[0.8700565,0.14754098],[0.87570621,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -489c437d-5bf2-4b5a-b26c-c3e1b6b38b4c,Standard,b5a66c60-7189-4c86-a32a-4d1aa6568475,"{""type"":""LineString"",""coordinates"":[[0.17796675,0.1557377],[0.14124939,0.1557377],[0.21468281,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d270922a-fbc9-4da6-8b1d-33dc276757ea,Standard,5001666c-1331-43f9-8b09-3667c89951d4,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.04918033],[0.76271186,0.04918033],[0.75141243,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -8d0a5ac8-10bf-4e3e-afb5-b60f9bf317d9,Standard,0c73890d-adfa-4936-966f-8e527c06bdbe,"{""type"":""LineString"",""coordinates"":[[0.67231638,0.36885246],[0.6779661,0.36885246],[0.68361582,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -74887fe3-c3a5-4919-8b77-743e3f2c5bd4,Standard,d48db7e8-5fde-456f-8b17-02d18a5a2e32,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.1557377],[0.25423729,0.1557377],[0.28248588,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ba000052-dc52-4f14-9235-1cddc1069e4e,Standard,bdf60fc2-e400-46f6-b873-7a40663106f3,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.04918033],[0.88700565,0.04918033],[0.89830508,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -91bf20e1-1a3b-4b69-b55b-a4ab8a5b3ae9,Standard,445cc0c8-70b8-47d4-987f-308269b845a3,"{""type"":""LineString"",""coordinates"":[[0.61581921,0.89344262],[0.62146893,0.89344262],[0.61016949,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -36b52d45-0e51-46b2-9831-aa3fb3ff3c37,Standard,c49d1581-a0c6-493f-9534-39f97970492b,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.67213115],[0.81920904,0.67213115],[0.82485876,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -12de6c44-ec23-42e2-81b7-1fc0a757edf9,Standard,8ae06d94-8e5d-48f6-9d43-599596df688a,"{""type"":""LineString"",""coordinates"":[[0.86440678,0.36885246],[0.8700565,0.36885246],[0.87570621,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -533d0392-fdc3-48f9-a26b-ea150734112a,Standard,f2c9a881-eb41-4628-833c-5258e95ec457,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.96721311],[0.72316384,0.96721311],[0.71186441,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2dd6612a-8f9d-417f-b922-5a2ec2d3acc2,Standard,2497455a-888c-4ac6-aa49-582ab91fd05e,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.96721311],[0.76836158,0.96721311],[0.7740113,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bf2e4a45-726d-4ee5-9dfa-66024bcde4c0,Standard,a7a76517-7239-4a95-b9b0-0027cddfa77b,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.57377049],[0.82485876,0.57377049],[0.84180791,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -119b5881-58c5-4891-8c79-df4c5486fb64,Standard,88c3a0b5-9def-4bf3-87c1-0ee75578b5a9,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.36885246],[0.74011299,0.36885246],[0.73446328,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -635f6544-258b-43f5-959f-2f32c5345189,Standard,23abf40d-58a7-4f00-9ee8-5290a510f9b2,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.14754098],[0.15819209,0.1147541],[0.15819209,0.13114754]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9944a608-7e0a-4325-963f-76110bbe81b7,Standard,b672be06-2cbc-4510-8a96-34647985e9d5,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.14754098],[0.93220339,0.14754098],[0.92655367,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -86e07109-4192-46e7-b92a-b5df2ed6a4b0,Standard,96cc155a-9417-4ed9-911a-b06b7981a2fe,"{""type"":""LineString"",""coordinates"":[[0.77966102,1],[0.77966102,0.99180328],[0.77966102,0.98360656]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -1f1e8882-9977-48c4-aaaf-c98087dff35d,Standard,2dd402ff-ef64-4b4b-8a49-e9570364e65b,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.96721311],[0.75706215,0.96721311],[0.76271186,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -35855268-8c8d-4b4d-8f85-5f164a76dd73,Standard,dafff7d5-8ed4-4b2f-bcd3-b6d02472dfea,"{""type"":""LineString"",""coordinates"":[[0.70621469,0.14754098],[0.70056497,0.14754098],[0.69491525,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" d56c9bd7-c160-4b6b-b132-accb5da7fda4,Standard,1a56ec37-3781-4f35-aeec-0d0341c63372,"{""type"":""LineString"",""coordinates"":[[0.69491525,0.25409836],[0.68926554,0.25409836],[0.68361582,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -67fa7b51-f7ce-48c4-b9c5-9856619e2788,Standard,7297611b-fbdc-4949-87fc-1bca403708aa,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.67213115],[0.88135593,0.67213115],[0.88700565,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f023c2be-7306-483e-9169-05d9d0fab2c7,Standard,9d2b065a-9098-447d-8dbe-5eb06cc691a2,"{""type"":""LineString"",""coordinates"":[[0.74576271,0.57377049],[0.75706215,0.57377049],[0.75141243,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a6a4da26-f67b-4ef9-aef8-c072a664c473,Standard,7cc28881-dec6-4baa-ad77-d4a2ea3cdd68,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.0],[0.02259887,0.0204918],[0.02259887,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e918bf04-3eb3-4a6d-9173-20ed223f0628,Standard,31c8715f-7b85-4243-8908-69cf8b2c1525,"{""type"":""LineString"",""coordinates"":[[0.87570621,0.89344262],[0.8700565,0.89344262],[0.88135593,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -59378c39-5361-470c-9974-8dd65fcc3b2b,Standard,e8329717-1626-4c33-b60e-d83e78514014,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.77868852],[0.84745763,0.77868852],[0.83615819,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4d1fa209-9186-4e2c-862a-964d52e64d0d,Standard,66dbe72e-f2be-430d-b103-c1a84f8211a4,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.14754098],[0.8079096,0.14754098],[0.81355932,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b422e0ef-fcf8-4035-a3e1-3c851db6551e,Standard,e6882165-4c20-4589-9dd5-624b10802042,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.04918033],[0.95480226,0.04918033],[0.96610169,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fd79934e-7893-4948-8d5d-f7bad5afec35,Standard,5450f675-565b-4156-9d64-ff4cfeea96d3,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.77868852],[0.68361582,0.77868852],[0.6779661,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c41cc825-581d-4aea-a08f-794c8be52c9b,Standard,d2cd0ac6-ffbb-43f3-94c1-e10344eea594,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.14754098],[0.83615819,0.14754098],[0.83050847,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bd52fae7-5d39-4718-a9f5-737d6e4ac693,Standard,87a41d29-ad67-4bd6-a5b7-9d1414b38c6e,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.89344262],[0.9039548,0.89344262],[0.89830508,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +75f3b026-fcc1-4403-844f-8c595cb797c1,Standard,a8b86d8f-a196-4eca-b248-66bc8918f9e6,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.89344262],[0.7740113,0.89344262],[0.77966102,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3c31213f-b1cb-4f44-8503-7a95d141a04b,Standard,97ce398b-de56-4b28-925c-a37f9029e875,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.07377049],[0.22033898,0.04098361],[0.22033898,0.05737705]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +35855268-8c8d-4b4d-8f85-5f164a76dd73,Standard,dafff7d5-8ed4-4b2f-bcd3-b6d02472dfea,"{""type"":""LineString"",""coordinates"":[[0.70621469,0.14754098],[0.70056497,0.14754098],[0.69491525,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4090c3b8-35a0-45ce-aa49-9f37a5ddd55f,Standard,d54fcb7e-d472-4035-aff6-2646ce881931,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.36885246],[0.90960452,0.36885246],[0.89830508,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +84c7afaf-51f9-4c19-bf29-c7b79b2f90e2,Standard,1bb0764a-82b8-4f4c-8208-c9c58b8b92c0,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.16803372],[0.02259887,0.18852459],[0.02259887,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b634d0e8-330a-40ac-bf97-0caa01370bcf,Standard,6862b157-39c8-47d2-b31c-e418e1bad9a2,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.77868852],[0.69491525,0.77868852],[0.70056497,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f0e55d77-f8a0-4f63-b039-013a39f06539,Standard,d59a733b-b7c6-401b-8e38-653e0cb72b5c,"{""type"":""LineString"",""coordinates"":[[0.78531073,0.45901639],[0.78531073,0.44262295],[0.78531073,0.45081967]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +762d71ac-bff2-4b7d-a3d0-1997e7fc6c9d,Standard,7d9647cb-e7ca-4ecc-a79e-edb1bfbfb666,"{""type"":""LineString"",""coordinates"":[[0.96610169,0.14754098],[0.95480226,0.14754098],[0.96045198,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +8b60a817-a4d6-4051-9410-cab3ab26ce00,Standard,2cbfd089-e602-4f64-8a5b-86a6ecc56d32,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.0942623],[0.15819209,0.07377049],[0.15819209,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2df37064-78de-4de2-8cb5-561fa8cec2d3,Standard,b11ce01e-37ce-4ea7-b3a3-4db89820fde1,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.44262295],[0.84180791,0.44262295],[0.83050847,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +834e664b-3cff-4fae-8cc1-4cdd7af11516,Standard,ec6f82c5-e834-48d0-84af-a0f070979d65,"{""type"":""LineString"",""coordinates"":[[0.75141243,0.14754098],[0.76271186,0.14754098],[0.75706215,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +14080b5a-f167-4d9f-bd93-c822c069807f,Standard,56603d19-84d5-4c2f-a42c-92777602999a,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.25409836],[0.78531073,0.25409836],[0.79661017,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d7f74d06-26c4-4f97-b45c-e51aa12ab9fe,Standard,71832b7e-b5a2-40d4-82d3-e8f1ba38ace6,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.57377049],[0.89265537,0.57377049],[0.88135593,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6dd7072b-da09-4d47-a7ad-a57389a918f9,Standard,cba98774-b8c6-45f4-84cc-2fde121a77fa,"{""type"":""LineString"",""coordinates"":[[0.14689266,0.06557377],[0.11864407,0.06557377],[0.09039548,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a8182e9b-729e-4097-824c-bb1ffdf76499,Standard,2005c393-edc4-4cc4-80af-ebbde1305b8e,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.96721311],[0.72881356,0.96721311],[0.72316384,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +135be5b3-e2f0-4b70-b71f-a2369e57bc15,Standard,ec21c844-ca32-4f95-b6f3-dd8c56128f66,"{""type"":""LineString"",""coordinates"":[[0.88135593,0.14754098],[0.88700565,0.14754098],[0.87570621,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +db40acda-255e-4d7c-828a-e52619f60666,Standard,98a4759c-696b-4c99-b339-cf39ecc76ba7,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.66393443],[0.11864407,0.66393443],[0.14689266,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6b5fc3d8-f582-4658-b99e-a1fe3531d310,Standard,a92769d6-3f6f-4e67-98b3-303e59dd9cda,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.14754098],[0.91525424,0.14754098],[0.90960452,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2b5bb969-f38a-4ac9-914a-413db62ac6f0,Standard,f03440ae-d6d8-4f7b-ad5f-bbd280a9d2a6,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.44262295],[0.72881356,0.44262295],[0.72316384,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7f6d06de-5e2f-4e11-9b80-ab156b6ad570,Standard,62c21e1e-f353-4e48-bca6-8a4da341971e,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.89344262],[0.67231638,0.89344262],[0.6779661,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9b8ea76d-8054-4d43-afb3-664375202b2f,Standard,2ea48cfa-0a0b-48f0-aa66-b619c35b9929,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.67213115],[0.81355932,0.67213115],[0.80225989,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +676cc51f-74ee-4ff5-bc99-ef52b02c1abb,Standard,7f853fc7-6d3e-4086-82b0-cc93c8257f46,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.36885246],[0.92655367,0.36885246],[0.92090395,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3b3b0a7b-f2c4-4035-a97d-b86bc8c4f60e,Standard,2c4fae2c-c565-4111-b535-8488737aa358,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.25409836],[0.74011299,0.25409836],[0.73446328,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fc601178-3ca7-48f9-8a07-e9fb3751d3e0,Standard,9e9550e6-a601-4633-96a1-20220893ce00,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.89344262],[0.78531073,0.89344262],[0.77966102,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a8e794de-f56b-438c-af42-b40521bbb236,Standard,de25721a-7ad9-450f-9e89-f483f19bf8a7,"{""type"":""LineString"",""coordinates"":[[0.70621469,0.25409836],[0.71186441,0.25409836],[0.71751412,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bb7d1a7a-8dc5-4e59-a8ef-be64bb83f58c,Standard,24537b9f-9cb9-45d1-8bbb-f87e3a948a69,"{""type"":""LineString"",""coordinates"":[[0.85310734,0.67213115],[0.85875706,0.67213115],[0.84745763,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +79edb34f-6eea-4190-a0d4-2664ace2deb8,Standard,8bb29769-404b-4bf6-837e-f9ca1b389bf9,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.06557377],[0.14689266,0.06557377],[0.20338983,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +576ebbf9-77a7-411e-84f9-192176cfe4b6,Standard,d3d211d9-22f6-42ba-a596-0d0ca1c7e943,"{""type"":""LineString"",""coordinates"":[[0.91525424,0.25409836],[0.90960452,0.25409836],[0.92090395,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3427affb-2a2c-4fb5-a5e3-96141a5bc9f1,Standard,b302dc76-9715-45b6-b6ef-8da630acd168,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.77868852],[0.74576271,0.77868852],[0.74011299,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a93405e4-5473-437e-97d1-a0ea6a907b09,Standard,7bc8b609-baba-4afe-8cec-866d74e91e43,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.67213115],[0.88135593,0.67213115],[0.87570621,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d923185a-03a0-484b-a66d-08f4757aadf7,Standard,2d552f15-6871-4e09-84b1-003da098d909,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.1557377],[0.11864407,0.1557377],[0.14689266,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +90022bb0-1fb8-4b03-8220-30c2fc7bf6c9,Standard,2770ee0b-96ca-4677-9933-8d82643501e3,"{""type"":""LineString"",""coordinates"":[[0.82485876,0.57377049],[0.81920904,0.57377049],[0.81355932,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +06fd80ca-ed78-4310-87f3-e023fbb23e46,Standard,60c4970b-636a-4f8a-9329-97d01107a962,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.1147541],[0.02259887,0.0942623],[0.02259887,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2591882d-ad68-4e8a-9ec1-370d33dafb29,Standard,7b7ac3b3-877f-4cba-8ad4-6171f2c5b83c,"{""type"":""LineString"",""coordinates"":[[0.91525424,0.36885246],[0.90960452,0.36885246],[0.92090395,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fad21258-86aa-4a48-a05b-73bbb3ad3dbd,Standard,7263918d-4331-43af-bd10-8c06bd2b8667,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.67213115],[0.72316384,0.67213115],[0.71751412,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +020d5d66-68b8-4849-a49d-7ef75c5d660a,Standard,09125a13-324b-4611-a718-5028b390f1ca,"{""type"":""LineString"",""coordinates"":[[0.96045198,0.67213115],[0.98305085,0.91803279],[0.98305085,0.79508197],[0.98305085,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 00f67881-6f00-41b0-9377-489c08522513,Standard,09fdfecb-1ea0-4b99-a7bd-caad84afe160,"{""type"":""LineString"",""coordinates"":[[0.86440678,0.36885246],[0.85875706,0.36885246],[0.85310734,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -264375c8-48d3-4c14-a432-e627f7ffed82,Standard,ddc03ccc-bd8e-47f3-8183-97f3b039219d,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.14754098],[0.79661017,0.14754098],[0.80225989,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7db35bba-5e4d-4964-abbe-a2e18b630f59,Standard,08d39ce3-e843-49bd-9b46-1fe927a1d4be,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.25409836],[0.7740113,0.25409836],[0.78531073,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -835b96cb-24b4-4032-a747-129e519583b1,Standard,c4f33026-5741-4070-970c-1234541ce509,"{""type"":""LineString"",""coordinates"":[[0.88135593,0.77868852],[0.8700565,0.77868852],[0.87570621,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -217789d1-8cb9-4ff4-a7f5-12768eae95ab,Standard,8c4d9aa2-298b-466e-9982-6c4be253fbce,"{""type"":""LineString"",""coordinates"":[[0.80225989,0.25409836],[0.8079096,0.25409836],[0.79661017,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3de72fa7-5070-4429-b1d9-80d7f3273834,Standard,060f10e1-2ffd-4972-9ace-7fff8df78658,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.77868852],[0.72316384,0.77868852],[0.72881356,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d37ce273-2b19-445b-aa00-ee2a13153e14,Standard,e357bf93-aaa3-4870-b6a4-6d2cdb8967da,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.36885246],[0.87570621,0.36885246],[0.88135593,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -71572ac8-64b8-4d87-b617-dd227be40af2,Standard,3e7e4741-502d-4c8f-bad5-e0c5c6f69958,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.36885246],[0.82485876,0.36885246],[0.81920904,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4ec7ff3b-9815-43f8-9cba-f46af1a9f423,Standard,31f8365c-9329-4c46-8555-6ec6aadf130e,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.57377049],[0.85875706,0.57377049],[0.85310734,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -8b7a0eb4-e725-4416-ac52-3810059bfc5c,Standard,95644bf5-8dca-4409-bb04-7d4e9a24fa03,"{""type"":""LineString"",""coordinates"":[[0.63841808,0.14754098],[0.63276836,0.14754098],[0.62711864,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -be192356-2248-4319-afd6-eac828fdb001,Standard,1a1550cf-77b8-40a9-90e5-5d0faef7baaa,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.89344262],[0.80225989,0.89344262],[0.79661017,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -79a153b2-2b64-4b59-bbe5-946a3c0073bd,Standard,c3206971-b22f-4090-826b-e08d4bc8ffad,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.24590164],[0.25423729,0.24590164],[0.22881421,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ae02da1d-991a-4e16-81dd-2970373ec004,Standard,83b12a0c-d66f-43cf-a5c1-1945a8a66c4c,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.77868852],[0.65536723,0.77868852],[0.66101695,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -4ca6d6bc-9616-4f26-a953-b04c20364f56,Standard,1a52eb5c-a8a1-4b69-9aac-138e425d835b,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.04918033],[0.87570621,0.04918033],[0.88135593,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -31dab450-fe89-4ede-99e2-cba361671910,Standard,b714db4a-db55-4957-b503-2300559bb81f,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.1557377],[0.14689266,0.1557377],[0.17514124,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4506a9cb-e391-43f7-ba75-88f376b40cf1,Standard,d7c951cc-2e8f-40d0-b310-03fbdb9b0558,"{""type"":""LineString"",""coordinates"":[[0.88135593,0.25409836],[0.88700565,0.25409836],[0.87570621,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f6674e18-ba25-4454-9fed-d7864f493e0f,Standard,5d56c97f-e15c-4676-9b1a-fc5d7efb8a24,"{""type"":""LineString"",""coordinates"":[[0.65536723,0.67213115],[0.6440678,0.67213115],[0.64971751,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +24b27c1d-1816-4855-bb80-96ca34ded7c1,Standard,f6c9e202-6548-405e-9969-bc4ae68ef7c1,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.44262295],[0.81355932,0.44262295],[0.8079096,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +00af0ca8-e5ba-4bcc-93e2-d876e5fe5f2d,Standard,7cfd5184-c217-42b9-be09-7ed413d7a11e,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.96721311],[0.77966102,0.97540984],[0.77966102,0.98360656]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +702afdf5-0671-4f37-b888-5342fa3474de,Standard,184c0d91-3f4b-4816-a82d-519e4bcd7ee9,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.75409836],[0.25423729,0.75409836],[0.28248588,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d012e1ac-4919-4b5a-aaec-80cb2c8ef488,Standard,c87706ad-37ff-4419-b4bc-4607d780498e,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.25409836],[0.85310734,0.25409836],[0.86440678,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +31f65061-b502-4249-83c0-47d10513255c,Standard,cadd7ca5-2b70-4bcc-83d0-867df8b6d0a3,"{""type"":""LineString"",""coordinates"":[[0.63841808,0.67213115],[0.6440678,0.67213115],[0.63276836,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +8d0a5ac8-10bf-4e3e-afb5-b60f9bf317d9,Standard,0c73890d-adfa-4936-966f-8e527c06bdbe,"{""type"":""LineString"",""coordinates"":[[0.67231638,0.36885246],[0.6779661,0.36885246],[0.68361582,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +ee353ae3-c6e1-4529-9881-ec10d1d7b328,Standard,66651745-4425-4a9a-9a2a-3f2715252cf6,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.66393443],[0.20338983,0.66393443],[0.14689266,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +5afd84df-08c8-45af-b542-42eefdcb78b6,Standard,1c81ee69-fb75-4bea-bfa9-f627850f9e6b,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.04918033],[0.83050847,0.04918033],[0.85310734,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +351b1bbd-8daf-427c-a18b-4fa6597db574,Standard,81578256-7c89-4651-8863-31fd206c628c,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.36885246],[0.70621469,0.36885246],[0.72316384,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fd79934e-7893-4948-8d5d-f7bad5afec35,Standard,5450f675-565b-4156-9d64-ff4cfeea96d3,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.77868852],[0.68361582,0.77868852],[0.6779661,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +df3c35c9-4b1b-477b-9722-3162aafc1487,Standard,2424f0ab-9f83-464e-a960-093ab14a2bb5,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.14754098],[0.7740113,0.14754098],[0.78531073,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7e4b4545-d04e-4eb3-989a-ae75afbaad37,Standard,cc8bc119-79d7-479b-8767-8b108a0ba4a0,"{""type"":""LineString"",""coordinates"":[[0.75141243,0.14754098],[0.74011299,0.14754098],[0.74576271,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +272469ff-22c6-4f7f-ac31-b4bec6d952af,Standard,8a09b9b8-6c9f-4dc7-a5a5-fe5d22b5809a,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.25409836],[0.84180791,0.25409836],[0.85310734,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c7b49d97-2495-4f09-97e7-808764ac8b51,Standard,8c6b2196-6705-45ec-9879-8334924f968c,"{""type"":""LineString"",""coordinates"":[[0.62146893,0.36885246],[0.62711864,0.36885246],[0.61581921,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e918bf04-3eb3-4a6d-9173-20ed223f0628,Standard,31c8715f-7b85-4243-8908-69cf8b2c1525,"{""type"":""LineString"",""coordinates"":[[0.87570621,0.89344262],[0.8700565,0.89344262],[0.88135593,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" bf3a5270-9bfc-4edb-9ca0-2ba3273c821e,Standard,dcf3c182-18bd-4536-b11f-960c52c3b36e,"{""type"":""LineString"",""coordinates"":[[0.68926554,0.14754098],[0.68361582,0.14754098],[0.69491525,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a4ffa7f8-dfd3-4d35-ae30-1eb0b6e6d3f6,Standard,fe19ff1f-8ea4-4ffe-881b-ad8d57c4561a,"{""type"":""LineString"",""coordinates"":[[0.89830508,0.14754098],[0.90960452,0.14754098],[0.9039548,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e466da06-3a27-4cea-962d-4449f392eed1,Standard,e3b38aa2-dd38-445e-86c4-600331d108d0,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.14754098],[0.7740113,0.14754098],[0.76271186,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c1fd7798-e4fd-4cfb-af81-2cf23744637c,Standard,5f8eb2b8-0f98-4011-bc3a-b182285be4db,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.44262295],[0.83050847,0.44262295],[0.82485876,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 59151ef3-be46-4c4d-a2d4-c6a562a0952d,Standard,a5106b6a-42b2-42d0-b5b3-a4656541abfa,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.25409836],[0.75141243,0.25409836],[0.76271186,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +643e73ad-b1dd-4965-8e27-f7a5aac9b2f5,Standard,5157574f-5e67-4574-81a3-686b97a893ff,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.44262295],[0.78531073,0.44262295],[0.7740113,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c1c61c3b-ca09-4cc7-a9d7-36a3c4214338,Standard,a78fbab6-e680-4c45-9731-97c82f2fb3c8,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.07377049],[0.15819209,0.05737705],[0.15819209,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +98611c6a-9f1a-4f18-a95c-2abaf27112db,Standard,b5c255b5-8572-41ce-a273-a01d2a4b4e20,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.04918033],[0.82485876,0.04918033],[0.81920904,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0f375bc5-fa36-4b66-ac12-e0db266bf400,Standard,9f57100c-cb04-49b5-a9bd-f0e78f87b18a,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.36885246],[0.83615819,0.36885246],[0.84180791,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +ba000052-dc52-4f14-9235-1cddc1069e4e,Standard,bdf60fc2-e400-46f6-b873-7a40663106f3,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.04918033],[0.88700565,0.04918033],[0.89830508,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +86e07109-4192-46e7-b92a-b5df2ed6a4b0,Standard,96cc155a-9417-4ed9-911a-b06b7981a2fe,"{""type"":""LineString"",""coordinates"":[[0.77966102,1],[0.77966102,0.99180328],[0.77966102,0.98360656]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7c1b6af1-952c-4304-8d69-da1a0d14b955,Standard,8add0020-bc20-4aaa-9ad3-fa1a1a5ef376,"{""type"":""LineString"",""coordinates"":[[0.7740113,0.36885246],[0.76271186,0.36885246],[0.76836158,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +90ad029a-358f-4f05-8a01-62820461dbb2,Standard,814dec01-f6f2-4817-8f83-2e758011b033,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.24590164],[0.06214689,0.27868852],[0.06214689,0.24590164],[0.06214689,0.26229508]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +79eac61e-e3b2-421a-9716-9940963761f0,Standard,199bc8fc-71a0-4c78-a64d-80a87f0f6b78,"{""type"":""LineString"",""coordinates"":[[0.7740113,0.57377049],[0.75706215,0.57377049],[0.77966102,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +37e7a43e-7216-4178-81c1-08c1bbc82b26,Standard,5c26821d-ea3b-4a00-8d42-1486710a2ca5,"{""type"":""LineString"",""coordinates"":[[0.78531073,0.14754098],[0.79661017,0.14754098],[0.79096045,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +57ecdb3b-20dd-453d-8333-2961984499b2,Standard,876998db-5326-4257-b2d1-a4722265f51d,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.16803372],[0.22033898,0.14754098],[0.22033898,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b175f10d-452b-48a1-a536-b8ae8fc1241e,Standard,b140dccb-7251-496b-9402-06ebd13048c2,"{""type"":""LineString"",""coordinates"":[[0.62711864,0.36885246],[0.63841808,0.36885246],[0.63276836,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3635451d-3007-44d6-85c8-67775bfc4e48,Standard,041991a2-c961-44a7-bfec-29cccd9a7831,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.25409836],[0.87570621,0.25409836],[0.86440678,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +38c4a4da-68e5-4702-9efa-70f2a6499346,Standard,1a5bb799-bc03-4de9-a8a1-9a0616ea3add,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.77868852],[0.81355932,0.77868852],[0.82485876,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +526bac21-e1fd-45aa-8dc1-3230569b51fa,Standard,f606c03b-66d1-4765-97e6-1319ad6ac0c3,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.75409836],[0.20338983,0.75409836],[0.14689266,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7d5ff8b0-0692-4a90-bd37-24f4d8d61b98,Standard,13cfe1fb-1cec-4c17-baf8-b7dcb9f744cd,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.36885246],[0.94915254,0.36885246],[0.96610169,0.39344262],[0.96610169,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +badf084a-59db-4de6-bf6d-48f988378609,Standard,14f9eef8-8550-45fa-a3f0-f583624556e7,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.25409836],[0.82485876,0.25409836],[0.81920904,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b7bc8bae-9f00-497d-9d16-6b03765b5f98,Standard,e7388048-40c3-4fd7-bcbb-2e1b09e735d2,"{""type"":""LineString"",""coordinates"":[[0.80225989,0.89344262],[0.81355932,0.89344262],[0.8079096,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +ccacd75f-b7ad-43cb-9747-84e2fcf53ebd,Standard,09083d14-02aa-40a3-9948-86e86883bda1,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.96721311],[0.75706215,0.96721311],[0.74011299,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b36d0168-6936-49f6-92f3-8755988c11e9,Standard,76f097c5-173f-4fee-b6db-190792922d0e,"{""type"":""LineString"",""coordinates"":[[0.03954802,0.68032787],[0.03954802,0.57377049],[0.09039548,0.57377049],[0.03954802,0.78688525]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bbca471b-16c1-4981-8414-b6bf87274cae,Standard,80332374-76fe-4d06-adde-e2197f88fe6e,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.57377049],[0.80225989,0.57377049],[0.77966102,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +75e06780-090a-411f-a47c-47c5a90a2e09,Standard,4bdb6569-72da-4d60-97b1-b5a639032d5d,"{""type"":""LineString"",""coordinates"":[[0.25423729,0.24590164],[0.28248588,0.24590164],[0.31073446,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7c9a8ae8-b024-4bf6-ade7-154fd3f39d7a,Standard,746fa279-2acf-4aa1-b3e1-8d312d66058a,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.77868852],[0.91525424,0.77868852],[0.90960452,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 11bdeb21-cd02-48b2-bd54-b1adf2e96ecf,Standard,0f11e5d6-f850-463b-8d74-6fdf91fad535,"{""type"":""LineString"",""coordinates"":[[0.97175141,0.84836159],[0.97175141,0.91803279],[0.96045198,0.77868852],[0.97175141,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a79f2ac5-a708-48be-b910-85542d4fbb71,Standard,71c56dc9-d957-4746-872f-8ad07d4ef8a4,"{""type"":""LineString"",""coordinates"":[[0.67231638,0.36885246],[0.66101695,0.36885246],[0.66666667,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d2edc5bf-b3ed-4f2c-938f-8a60119a11b6,Standard,ea5f6247-4116-4acb-9595-52a7a0412897,"{""type"":""LineString"",""coordinates"":[[0.25423729,0.75409836],[0.20338983,0.75409836],[0.22881421,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3427affb-2a2c-4fb5-a5e3-96141a5bc9f1,Standard,b302dc76-9715-45b6-b6ef-8da630acd168,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.77868852],[0.74576271,0.77868852],[0.74011299,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6b457803-1a41-4ed1-a747-9810ef70b1f7,Standard,64bd5e0e-cf5a-469f-a427-113b0e16893d,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.14754098],[0.0960452,0.16803372],[0.0960452,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -5afd84df-08c8-45af-b542-42eefdcb78b6,Standard,1c81ee69-fb75-4bea-bfa9-f627850f9e6b,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.04918033],[0.83050847,0.04918033],[0.85310734,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3c31213f-b1cb-4f44-8503-7a95d141a04b,Standard,97ce398b-de56-4b28-925c-a37f9029e875,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.07377049],[0.22033898,0.04098361],[0.22033898,0.05737705]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c061601a-9997-4176-a25d-aac4510a0fbc,Standard,29747132-2fe5-4570-8d02-114d3438835c,"{""type"":""LineString"",""coordinates"":[[0.67231638,0.25409836],[0.6779661,0.25409836],[0.68361582,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -28b087ec-86fc-4701-b3b2-5a9b3c8e873e,Standard,04d02ea8-ba96-4a7f-969d-d25e201e32c6,"{""type"":""LineString"",""coordinates"":[[0.94915254,0.57377049],[0.93785311,0.57377049],[0.96045198,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +26138708-ff02-48c2-a465-a8b5e5d165a8,Standard,25a1e96e-b425-48bf-a3ae-dc54ea9da47f,"{""type"":""LineString"",""coordinates"":[[0.03954802,0.27868852],[0.03954802,0.17213115],[0.03954802,0.06557377],[0.09039548,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" a7dadc1d-7f50-4e7c-bd61-305d6c145ccf,Standard,52cd80d8-9489-41bc-931a-d82dba5d0926,"{""type"":""LineString"",""coordinates"":[[0.28248588,0.66393443],[0.31073446,0.66393443],[0.25423729,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -13e3fc68-ff6f-4bd6-94cd-697d584f020c,Standard,a4dc31e8-e10a-4b42-90b4-f14d0f133c0c,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.25409836],[0.84180791,0.25409836],[0.83615819,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +21842dba-9c70-45df-b715-87db6ec36a0f,Standard,e311729e-244e-48a6-bc48-0c7d9823c148,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.04918033],[0.40677966,0.10655738],[0.92655367,0.04918033],[0.93220339,0.04918033],[0.41242938,0.10655738]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c41cc825-581d-4aea-a08f-794c8be52c9b,Standard,d2cd0ac6-ffbb-43f3-94c1-e10344eea594,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.14754098],[0.83615819,0.14754098],[0.83050847,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +99333f9f-7f11-49e4-b97e-97956c7e6116,Standard,ce640cab-6f6d-4fd1-b652-009bec4c596b,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.89344262],[0.83615819,0.89344262],[0.84745763,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d3484467-529b-4f61-b8a1-fa4dfae30c31,Standard,764eccc0-09cc-4c7a-bf76-33259938530c,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.77868852],[0.8700565,0.77868852],[0.86440678,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +635f6544-258b-43f5-959f-2f32c5345189,Standard,23abf40d-58a7-4f00-9ee8-5290a510f9b2,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.14754098],[0.15819209,0.1147541],[0.15819209,0.13114754]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +acb8900a-00d8-4ad2-86d5-eb04bd663251,Standard,a2a8bc02-02a9-40d8-9495-058c04d7df89,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.77868852],[0.88135593,0.77868852],[0.88700565,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6e4efd5a-e82f-47e0-bee0-a226c588fd90,Standard,9d1ef0fd-3f8d-4a97-8495-25074243860c,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.77868852],[0.75141243,0.77868852],[0.74576271,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6c612da8-8b8c-4d36-88e1-75a17fe6183c,Standard,d97f2684-22cb-4c14-b01c-b95081d4d624,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.96721311],[0.81355932,0.96721311],[0.82485876,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d1c04861-36ef-49b7-9a2b-5fa2706734ad,Standard,bfecad6c-ddda-4957-ae66-f04d30fd7104,"{""type"":""LineString"",""coordinates"":[[0.66101695,0.36885246],[0.63841808,0.36885246],[0.65536723,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +49330239-a43c-47c9-82cb-f65469f2265a,Standard,d00ddea9-83f7-411a-9da6-f9607ffb3c87,"{""type"":""LineString"",""coordinates"":[[0.62711864,0.67213115],[0.63276836,0.67213115],[0.62146893,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +835b96cb-24b4-4032-a747-129e519583b1,Standard,c4f33026-5741-4070-970c-1234541ce509,"{""type"":""LineString"",""coordinates"":[[0.88135593,0.77868852],[0.8700565,0.77868852],[0.87570621,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" fe36e4d1-ecdf-4043-af93-f1c272723249,Standard,ec4d2395-23de-41c7-a366-af36aed1bf44,"{""type"":""LineString"",""coordinates"":[[0.92655367,0.67213115],[0.92090395,0.67213115],[0.91525424,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -26138708-ff02-48c2-a465-a8b5e5d165a8,Standard,25a1e96e-b425-48bf-a3ae-dc54ea9da47f,"{""type"":""LineString"",""coordinates"":[[0.03954802,0.27868852],[0.03954802,0.17213115],[0.03954802,0.06557377],[0.09039548,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +abed22cb-da71-4459-9221-9b63cb8c672b,Standard,d5d7329a-08a2-4946-8a02-d4a70746d37b,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.96721311],[0.79661017,0.96721311],[0.80225989,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d37ce273-2b19-445b-aa00-ee2a13153e14,Standard,e357bf93-aaa3-4870-b6a4-6d2cdb8967da,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.36885246],[0.87570621,0.36885246],[0.88135593,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 58b6d4fc-b31d-4909-ba77-0b4c7bb2125a,Standard,7fa87646-f182-4d67-9ffd-850f489fb24a,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.67213115],[0.67231638,0.67213115],[0.6779661,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -8b60a817-a4d6-4051-9410-cab3ab26ce00,Standard,2cbfd089-e602-4f64-8a5b-86a6ecc56d32,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.0942623],[0.15819209,0.07377049],[0.15819209,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -446be4bd-f603-4b51-9387-39cf2aa66b2a,Standard,5763fe56-89a4-4407-ba41-c1a528dd50a0,"{""type"":""LineString"",""coordinates"":[[0.63276836,0.89344262],[0.64971751,0.89344262],[0.65536723,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6dd7072b-da09-4d47-a7ad-a57389a918f9,Standard,cba98774-b8c6-45f4-84cc-2fde121a77fa,"{""type"":""LineString"",""coordinates"":[[0.14689266,0.06557377],[0.11864407,0.06557377],[0.09039548,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6e4efd5a-e82f-47e0-bee0-a226c588fd90,Standard,9d1ef0fd-3f8d-4a97-8495-25074243860c,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.77868852],[0.75141243,0.77868852],[0.74576271,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -31f65061-b502-4249-83c0-47d10513255c,Standard,cadd7ca5-2b70-4bcc-83d0-867df8b6d0a3,"{""type"":""LineString"",""coordinates"":[[0.63841808,0.67213115],[0.6440678,0.67213115],[0.63276836,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bc177fc1-85f8-4475-825d-d875a935cbe1,Standard,84dcef6e-d5b1-436f-8562-369b2489bb10,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.44262295],[0.76271186,0.44262295],[0.7740113,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9c5637b9-fd74-4119-be7e-5d22b13e2bdc,Standard,5fa6e010-393e-4bd2-a874-56eb784f9741,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.57377049],[0.89265537,0.57377049],[0.89830508,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -5d5ddcff-0cdf-42d6-a9c9-6dcd636d0c28,Standard,597126c9-f364-4968-909c-ccc064959397,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.44262295],[0.79661017,0.44262295],[0.78531073,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -5e94948f-0707-4691-910a-60a217ab9102,Standard,2887fb2b-fe44-4436-b28e-9f100f8288ac,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.57377049],[0.25423729,0.57377049],[0.28248588,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -79edb34f-6eea-4190-a0d4-2664ace2deb8,Standard,8bb29769-404b-4bf6-837e-f9ca1b389bf9,"{""type"":""LineString"",""coordinates"":[[0.17514124,0.06557377],[0.14689266,0.06557377],[0.20338983,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7e3b0ff3-5e08-407d-b36c-2077c16a8039,Standard,26d976e2-5245-4174-abcc-7e67e03d6352,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.67213115],[0.83615819,0.67213115],[0.82485876,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bf2e4a45-726d-4ee5-9dfa-66024bcde4c0,Standard,a7a76517-7239-4a95-b9b0-0027cddfa77b,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.57377049],[0.82485876,0.57377049],[0.84180791,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +ef83135b-8f60-402c-b01b-35cbcd10dae1,Standard,815bc4d0-3418-4d15-8f85-c104a24e6b17,"{""type"":""LineString"",""coordinates"":[[0.62146893,0.14754098],[0.61581921,0.14754098],[0.62711864,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +489c437d-5bf2-4b5a-b26c-c3e1b6b38b4c,Standard,b5a66c60-7189-4c86-a32a-4d1aa6568475,"{""type"":""LineString"",""coordinates"":[[0.17796675,0.1557377],[0.14124939,0.1557377],[0.21468281,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +abe20917-26ae-41ba-8373-916d8cfe6497,Standard,03b3d5c7-cb42-45d7-a5b7-b44c60ad5268,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.07377049],[0.0960452,0.0942623],[0.0960452,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +533d0392-fdc3-48f9-a26b-ea150734112a,Standard,f2c9a881-eb41-4628-833c-5258e95ec457,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.96721311],[0.72316384,0.96721311],[0.71186441,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a17da6b8-ee9a-4ea4-83b4-97ed6a95cfeb,Standard,17e2286d-65ca-4948-8a6c-63bdc13a9b50,"{""type"":""LineString"",""coordinates"":[[0.99435028,0.57377049],[0.99435028,0.91803279],[0.99435028,0.74590164],[0.96045198,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +064f5cc6-d674-40e8-843f-70e91d79f18f,Standard,f2c37ce1-91d3-43d3-beb3-1fc9a30c87fe,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.14754098],[0.89830508,0.14754098],[0.88700565,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7e70ed5b-6fc1-4d25-bef7-d65b15598927,Standard,d15c85bb-c9b1-4fa3-8bf6-4aa393b564d4,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.67213115],[0.79661017,0.67213115],[0.80225989,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0a19a747-608b-47ae-afee-68ce774e8a89,Standard,971288e4-038b-49d5-8df0-b2a7fdc0e17c,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.13114754],[0.22033898,0.14754098],[0.22033898,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4ca6d6bc-9616-4f26-a953-b04c20364f56,Standard,1a52eb5c-a8a1-4b69-9aac-138e425d835b,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.04918033],[0.87570621,0.04918033],[0.88135593,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d2edc5bf-b3ed-4f2c-938f-8a60119a11b6,Standard,ea5f6247-4116-4acb-9595-52a7a0412897,"{""type"":""LineString"",""coordinates"":[[0.25423729,0.75409836],[0.20338983,0.75409836],[0.22881421,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +abf466a5-497f-471d-8571-8d51f687bc26,Standard,0d6627e5-9f9e-4c40-90c1-45abd98a51cd,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.2295082],[0.0960452,0.20901733],[0.0960452,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7533ebc3-7178-4967-8613-437c2fd4663d,Standard,f59cd3fa-404d-4c42-820b-31346ae47c00,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.25409836],[0.89265537,0.25409836],[0.89830508,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7a5177b5-a744-436f-ba4e-8d5f1c5c72ae,Standard,edbbe75f-8d40-42e8-a6f4-857f64547cbd,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.96721311],[0.77966102,0.96721311],[0.78531073,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +217789d1-8cb9-4ff4-a7f5-12768eae95ab,Standard,8c4d9aa2-298b-466e-9982-6c4be253fbce,"{""type"":""LineString"",""coordinates"":[[0.80225989,0.25409836],[0.8079096,0.25409836],[0.79661017,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +25e39498-b841-4c6f-bbac-2365e141f950,Standard,8619b18b-8b32-4013-9b3a-6aab514b73cc,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.04918033],[0.94350282,0.04918033],[0.93220339,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +54e0c3ae-10e0-4533-8679-063556715b18,Standard,52df9c70-136a-49bb-9ad4-d300123c7e99,"{""type"":""LineString"",""coordinates"":[[0.15819209,0.18852459],[0.15819209,0.16803372],[0.15819209,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +30a58ed2-09d8-4e43-9aff-7b9f1e3e1f73,Standard,7df282f5-2e54-4220-8276-087634415be8,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.44262295],[0.72881356,0.44262295],[0.74011299,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a8cd181f-6834-437f-aa9e-6b165504b870,Standard,f0d4491e-eb64-49a0-8fc3-44fa5bd9dcee,"{""type"":""LineString"",""coordinates"":[[0.31073446,0.06557377],[0.25423729,0.06557377],[0.28248588,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +76c9c154-bb98-4112-acde-034bfea3eedf,Standard,2c6d3986-9cf2-4c41-9a40-400e4e0b3112,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.77868852],[0.6779661,0.77868852],[0.67231638,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9c4bc5d8-e9a6-4fc6-9a88-2e09c3823bc4,Standard,47cc3694-2782-4c44-8c61-e14d30dbbaa4,"{""type"":""LineString"",""coordinates"":[[0.7740113,0.36885246],[0.77966102,0.36885246],[0.78531073,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a0d87b77-0767-470f-adff-3333d612e076,Standard,9039f436-9be6-4c74-86b2-b5add2446d0a,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.07377049],[0.22033898,0.1147541],[0.22033898,0.0942623]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +90344d84-9485-4986-93e1-e94d73ee0aa3,Standard,91179f48-2d6c-4ae4-864c-d667f57a6e66,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.24590164],[0.11864407,0.24590164],[0.14689266,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7ad09272-dde8-46fb-bea5-31cce9bb450e,Standard,d9d1edce-43e0-4cbd-9801-4a4e1a1dfa71,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.77868852],[0.77966102,0.77868852],[0.7740113,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +36b52d45-0e51-46b2-9831-aa3fb3ff3c37,Standard,c49d1581-a0c6-493f-9534-39f97970492b,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.67213115],[0.81920904,0.67213115],[0.82485876,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" cea17966-e3e4-40bf-a765-2e1280d383e6,Standard,7056d4fa-aa01-47d4-af86-5c9717345607,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.44262295],[0.8079096,0.44262295],[0.80225989,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -834e664b-3cff-4fae-8cc1-4cdd7af11516,Standard,ec6f82c5-e834-48d0-84af-a0f070979d65,"{""type"":""LineString"",""coordinates"":[[0.75141243,0.14754098],[0.76271186,0.14754098],[0.75706215,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4e955f6a-da29-4020-874c-7608dbf744db,Standard,ca765f8e-2a05-40fb-80b8-41e02887fa46,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.67213115],[0.75141243,0.67213115],[0.74576271,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +98c214c3-a010-494f-93d2-39d0045abbd6,Standard,f4859003-7182-4ebf-8a96-ce61b2f6191c,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.2295082],[0.22033898,0.20901733],[0.22033898,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +723fb8fc-90ff-44d5-9c21-88a9f194e83a,Standard,5d1176ac-e64e-4811-8d0c-c87d9060ba2a,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.1557377],[0.05084746,0.27868852],[0.05084746,0.21721405],[0.05084746,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +790513bc-152b-45ac-96c6-9e89f07719c0,Standard,031633ca-bd50-401e-9159-d2258ce6309c,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.04918033],[0.90960452,0.04918033],[0.89830508,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6648b930-5922-4929-ba68-61da0122ebf2,Standard,ab7c6c3c-3b7f-4475-8cad-27657bc148c6,"{""type"":""LineString"",""coordinates"":[[0.95480226,0.77868852],[0.96045198,0.77868852],[0.94915254,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3c777579-8dba-4e53-8bc0-5a4a80af9988,Standard,7ad69cae-2bb0-4516-80a9-6afc7b5cb789,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.14754098],[0.74011299,0.14754098],[0.72881356,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a6870226-3616-4619-9c12-e8d33ca469c5,Standard,95b47f01-829a-46c3-873a-4df11d798c49,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.89344262],[0.84745763,0.89344262],[0.85310734,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +78f2fb26-f4e1-453e-b1a8-037164e5859d,Standard,cfd11fa8-fcf6-4b65-9523-ee5d21e292ed,"{""type"":""LineString"",""coordinates"":[[0.90960452,0.25409836],[0.9039548,0.25409836],[0.89830508,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +09c5fc01-1148-4ee9-9dca-b1f04954def6,Standard,836bf4ab-38e1-44f5-a082-723fc12e4845,"{""type"":""LineString"",""coordinates"":[[0.95480226,0.67213115],[0.96045198,0.67213115],[0.94915254,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7fdceb5a-d837-4672-a25c-3ef1c4b021f1,Standard,cd994d2f-b62e-4ab9-8f4c-e5357fd04af7,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.14754098],[0.72316384,0.14754098],[0.72881356,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7c3d59a2-9fbd-4b26-a8f5-19762ff323a5,Standard,0b6f398b-30f3-41f1-9bc2-ec93e91e8f19,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.25409836],[0.72316384,0.25409836],[0.71751412,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +41239a55-df02-4249-84df-18824c2740f4,Standard,9ec195e0-4c9b-48a6-9233-0d770b34705b,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.77868852],[0.85310734,0.77868852],[0.84745763,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +68ab9f6b-21c1-46eb-afde-2974072b3f9e,Standard,442c4813-6272-4cf9-b30b-22f9114bc3db,"{""type"":""LineString"",""coordinates"":[[0.68361582,0.14754098],[0.67231638,0.14754098],[0.6779661,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3cd9d77d-adbf-442f-b570-61b69223a367,Standard,bee47575-ecc8-4f2f-96de-e9a616603bb7,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.04918033],[0.78531073,0.04918033],[0.76271186,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7e3b0ff3-5e08-407d-b36c-2077c16a8039,Standard,26d976e2-5245-4174-abcc-7e67e03d6352,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.67213115],[0.83615819,0.67213115],[0.82485876,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +37bfd165-910b-4ed1-b6b1-49633d000387,Standard,73359dab-e8bb-4cea-89e6-88b969ecb4e0,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.04098361],[0.0960452,0.07377049],[0.0960452,0.05737705]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bef95efd-2cd8-472f-831d-c3bd3c207aa3,Standard,58105b87-e27d-4d7f-b492-42434801bdf7,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.89344262],[0.74576271,0.89344262],[0.74011299,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9e61a9a5-b9b7-4033-b8bc-87db9dc0665e,Standard,220f509c-9aea-4e60-8dc1-593d2e35ed21,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.77868852],[0.79661017,0.77868852],[0.80225989,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6b457803-1a41-4ed1-a747-9810ef70b1f7,Standard,64bd5e0e-cf5a-469f-a427-113b0e16893d,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.14754098],[0.0960452,0.16803372],[0.0960452,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +74efa478-92b6-442f-9c59-fb15bf064429,Standard,c6d6ca9d-042c-4525-9221-65bfa04477a4,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.36885246],[0.79096045,0.36885246],[0.78531073,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b6e8a3b1-e76e-4788-960f-79afcd82cd8f,Standard,1c23e300-0ad5-4b90-ac74-b9763e579268,"{""type"":""LineString"",""coordinates"":[[0.22033898,0.0204918],[0.22033898,0.04098361],[0.22033898,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +6df8c538-c0a6-4317-99f3-3068051701d1,Standard,de5aeea7-2505-4f0d-9d53-22a5287ab8b7,"{""type"":""LineString"",""coordinates"":[[0.70056497,0.25409836],[0.69491525,0.25409836],[0.70621469,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f9f042d8-0aa6-4194-bc49-8a91adb0faab,Standard,affde1a2-90e8-468f-a0a9-eb024f791857,"{""type"":""LineString"",""coordinates"":[[1,0.04918033],[1,0.22131148],[1,0.39344262],[0.96610169,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9c5637b9-fd74-4119-be7e-5d22b13e2bdc,Standard,5fa6e010-393e-4bd2-a874-56eb784f9741,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.57377049],[0.89265537,0.57377049],[0.89830508,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +600d7a2d-1aca-4b9c-ae82-095ce59eed0b,Standard,ebd1f65a-65ae-4620-b1cf-79898683c9e1,"{""type"":""LineString"",""coordinates"":[[0.0960452,0.0204918],[0.0960452,0.04098361],[0.0960452,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bd52fae7-5d39-4718-a9f5-737d6e4ac693,Standard,87a41d29-ad67-4bd6-a5b7-9d1414b38c6e,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.89344262],[0.9039548,0.89344262],[0.89830508,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4bbd03a7-34fd-4fdd-9371-a77b305792e2,Standard,9085189c-48df-498a-80e5-49fe54692a66,"{""type"":""LineString"",""coordinates"":[[0.14689266,0.57377049],[0.11864407,0.57377049],[0.09039548,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +76492511-ec9c-4e2f-be35-4b6091a4d07b,Standard,ddc63e7d-e76a-489b-a05f-97e7dee40794,"{""type"":""LineString"",""coordinates"":[[0.82485876,0.77868852],[0.83050847,0.77868852],[0.83615819,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a4ffa7f8-dfd3-4d35-ae30-1eb0b6e6d3f6,Standard,fe19ff1f-8ea4-4ffe-881b-ad8d57c4561a,"{""type"":""LineString"",""coordinates"":[[0.89830508,0.14754098],[0.90960452,0.14754098],[0.9039548,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0fa23de1-db57-4f60-bea0-01ea1bab1da4,Standard,82e01986-321d-4f21-8453-60220f97bbb1,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.89344262],[0.88700565,0.89344262],[0.88135593,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0d80286f-437b-44cc-959f-998de3f51893,Standard,b6b655da-54ed-41d8-a331-04e41d2286de,"{""type"":""LineString"",""coordinates"":[[0.09039548,0.75409836],[0.11864407,0.75409836],[0.14689266,0.75409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9f0829cb-1a13-482f-b372-ec6dcbbe2cda,Standard,73d786b9-377a-4807-9b70-21c80599a4d8,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.96721311],[0.83615819,0.89344262],[0.83615819,0.93032881]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +71572ac8-64b8-4d87-b617-dd227be40af2,Standard,3e7e4741-502d-4c8f-bad5-e0c5c6f69958,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.36885246],[0.82485876,0.36885246],[0.81920904,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2dd6612a-8f9d-417f-b922-5a2ec2d3acc2,Standard,2497455a-888c-4ac6-aa49-582ab91fd05e,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.96721311],[0.76836158,0.96721311],[0.7740113,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d8f0a014-fdb6-44da-8b0a-abd44e7578c6,Standard,7d68b748-ebe5-430e-95b8-bd0eededa136,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.89344262],[0.92655367,0.89344262],[0.96045198,0.89344262],[0.96045198,0.91803279]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fb003e5d-a7a2-4da7-916f-94272d001ee5,Standard,f6dfa796-69c1-4deb-8e5d-78d6a29f2b6e,"{""type"":""LineString"",""coordinates"":[[0.96045198,0.25409836],[0.96610169,0.25409836],[0.95480226,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +077f10b2-79fe-4ae4-a86e-77423668cf1a,Standard,e50ba18f-8019-4824-b835-cc33c70b0196,"{""type"":""LineString"",""coordinates"":[[0.92655367,0.77868852],[0.93785311,0.77868852],[0.93220339,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +54c63d34-a5b6-4547-8898-cdf835177352,Standard,84f3941b-450c-4acb-8150-c788af1e6546,"{""type"":""LineString"",""coordinates"":[[0.87570621,0.04918033],[0.8700565,0.04918033],[0.86440678,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +aba8138c-0b15-446c-94b9-67fc130f9c4b,Standard,d86488f7-cf74-41b4-9d62-e2923d00680f,"{""type"":""LineString"",""coordinates"":[[0.70621469,0.36885246],[0.68926554,0.36885246],[0.68361582,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 4a76fcf6-0353-4b7f-9f53-dbd4f2df9848,Standard,a8bc3d4a-1113-4f62-b01d-e59e6c35ab84,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.20901733],[0.02259887,0.18852459],[0.02259887,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -3635451d-3007-44d6-85c8-67775bfc4e48,Standard,041991a2-c961-44a7-bfec-29cccd9a7831,"{""type"":""LineString"",""coordinates"":[[0.8700565,0.25409836],[0.87570621,0.25409836],[0.86440678,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -8004803f-5af6-4eb8-be81-78bee4d8f302,Standard,be047b0d-9f7c-413e-bd60-f38b45d5ee80,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.89344262],[0.82485876,0.89344262],[0.83050847,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7f6d06de-5e2f-4e11-9b80-ab156b6ad570,Standard,62c21e1e-f353-4e48-bca6-8a4da341971e,"{""type"":""LineString"",""coordinates"":[[0.66666667,0.89344262],[0.67231638,0.89344262],[0.6779661,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -1d132dc2-af13-46f5-ab50-167e6d59fb0c,Standard,c23b7659-8e54-410a-b0e9-9eccbe2457dc,"{""type"":""LineString"",""coordinates"":[[0.84745763,0.36885246],[0.84180791,0.36885246],[0.85310734,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -580f595f-8a44-4b1c-8833-ff8202075bb4,Standard,364ffff6-7541-4324-bbcf-fe626ba9de1d,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.25409836],[0.81920904,0.25409836],[0.8079096,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d2f946ca-00f5-4f0f-be6c-eed2c34180d5,Standard,94071ac7-ae51-4e45-8795-9d10bda616e9,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.1147541],[0.02259887,0.13114754],[0.02259887,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +37d550c7-c9c4-48c3-b2b6-4c120c095dec,Standard,1372ca57-8429-43c6-a589-a402de4ac7f9,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.14754098],[0.93220339,0.14754098],[0.94350282,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0eb4a8c0-bf8d-49c6-be95-c5e030be9dda,Standard,c64c73c4-109b-4baa-bf44-3357d4bca7d8,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.77868852],[0.89830508,0.77868852],[0.9039548,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +55977fba-bd2a-41c1-8176-a95fac899ea2,Standard,f8827054-46fd-486c-aa91-9bd813187705,"{""type"":""LineString"",""coordinates"":[[0.91525424,0.57377049],[0.40677966,0.10655738],[0.92090395,0.57377049],[0.92655367,0.57377049],[0.41242938,0.10655738]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +58798027-5b4e-4602-8e9f-ce34f156da4b,Standard,932d9fab-9b07-4948-9d65-4945c7700a72,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.89344262],[0.70056497,0.89344262],[0.72316384,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b143bc7f-d331-491b-bc17-b2a5efbd8624,Standard,ab23d369-ff75-41b4-8a25-25ec9c4320aa,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.67213115],[0.76836158,0.67213115],[0.7740113,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" d6a95fd4-e44c-4fb8-951a-6aaf881cfd6a,Standard,f395e127-6036-49bb-b06f-1a3808193dfa,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.04918033],[0.78531073,0.04918033],[0.80225989,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -654af5fb-14d5-4f67-8a21-f5481a814555,Standard,52ccd989-d87b-4f9f-9d5d-a0609391f56e,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.89344262],[0.82485876,0.89344262],[0.81355932,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -38c4a4da-68e5-4702-9efa-70f2a6499346,Standard,1a5bb799-bc03-4de9-a8a1-9a0616ea3add,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.77868852],[0.81355932,0.77868852],[0.82485876,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -badf084a-59db-4de6-bf6d-48f988378609,Standard,14f9eef8-8550-45fa-a3f0-f583624556e7,"{""type"":""LineString"",""coordinates"":[[0.83050847,0.25409836],[0.82485876,0.25409836],[0.81920904,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -25e39498-b841-4c6f-bbac-2365e141f950,Standard,8619b18b-8b32-4013-9b3a-6aab514b73cc,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.04918033],[0.94350282,0.04918033],[0.93220339,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -84c7afaf-51f9-4c19-bf29-c7b79b2f90e2,Standard,1bb0764a-82b8-4f4c-8208-c9c58b8b92c0,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.16803372],[0.02259887,0.18852459],[0.02259887,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d43ae4c8-5544-4df7-9c24-8d39301cf3a5,Standard,00a3c4ab-e866-42a9-854f-fbf28c7f6a43,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.77868852],[0.81355932,0.77868852],[0.80225989,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e5cbfa13-80ac-483f-8433-c6717fa1e7c9,Standard,2d616d05-fa31-4b7f-b666-0fab28a21a82,"{""type"":""LineString"",""coordinates"":[[0.65536723,0.14754098],[0.66101695,0.14754098],[0.64971751,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d031dde1-6f80-4af1-a1f2-cbb223220469,Standard,4cfd425d-6158-4904-86b5-d16dc47a4778,"{""type"":""LineString"",""coordinates"":[[0.89265537,0.67213115],[0.89830508,0.67213115],[0.9039548,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b422e0ef-fcf8-4035-a3e1-3c851db6551e,Standard,e6882165-4c20-4589-9dd5-624b10802042,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.04918033],[0.95480226,0.04918033],[0.96610169,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +0238d402-4cd5-4f04-8838-02d4ac837e48,Standard,97b9a53e-9ff2-4567-95c0-6c9aab07a43f,"{""type"":""LineString"",""coordinates"":[[0.73446328,0.67213115],[0.72881356,0.67213115],[0.72316384,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +5d5ddcff-0cdf-42d6-a9c9-6dcd636d0c28,Standard,597126c9-f364-4968-909c-ccc064959397,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.44262295],[0.79661017,0.44262295],[0.78531073,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +69e84854-3ccd-478b-bfd4-36179f27ce1d,Standard,73c09f1f-3538-4b5f-acbf-38b686a0dbba,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.57377049],[0.93785311,0.57377049],[0.92655367,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b038acec-bed0-4448-9ff8-a9af55865145,Standard,147bf31b-f9b1-415f-858b-f3ed430e508d,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.77868852],[0.75706215,0.77868852],[0.76271186,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +816a5b4d-dae9-488c-9bed-b5e90fb62c89,Standard,21dc5686-67b6-49dc-b5aa-ecc7f7deb620,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.77868852],[0.93785311,0.77868852],[0.94915254,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +264375c8-48d3-4c14-a432-e627f7ffed82,Standard,ddc03ccc-bd8e-47f3-8183-97f3b039219d,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.14754098],[0.79661017,0.14754098],[0.80225989,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +779b60ba-822c-451f-9f5f-ecf6909582a3,Standard,d9d3a1f3-5090-4015-86a5-60be94fadcbf,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.66393443],[0.22881291,0.66393443],[0.25423729,0.66393443]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f023c2be-7306-483e-9169-05d9d0fab2c7,Standard,9d2b065a-9098-447d-8dbe-5eb06cc691a2,"{""type"":""LineString"",""coordinates"":[[0.74576271,0.57377049],[0.75706215,0.57377049],[0.75141243,0.57377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +12de6c44-ec23-42e2-81b7-1fc0a757edf9,Standard,8ae06d94-8e5d-48f6-9d43-599596df688a,"{""type"":""LineString"",""coordinates"":[[0.86440678,0.36885246],[0.8700565,0.36885246],[0.87570621,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d270922a-fbc9-4da6-8b1d-33dc276757ea,Standard,5001666c-1331-43f9-8b09-3667c89951d4,"{""type"":""LineString"",""coordinates"":[[0.75706215,0.04918033],[0.76271186,0.04918033],[0.75141243,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +4d1fa209-9186-4e2c-862a-964d52e64d0d,Standard,66dbe72e-f2be-430d-b103-c1a84f8211a4,"{""type"":""LineString"",""coordinates"":[[0.81920904,0.14754098],[0.8079096,0.14754098],[0.81355932,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +8d9b357a-6612-45b4-baff-12849a787453,Standard,af565c79-9953-4934-9afd-91cd64ed1f06,"{""type"":""LineString"",""coordinates"":[[0.85875706,0.89344262],[0.86440678,0.89344262],[0.8700565,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +59378c39-5361-470c-9974-8dd65fcc3b2b,Standard,e8329717-1626-4c33-b60e-d83e78514014,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.77868852],[0.84745763,0.77868852],[0.83615819,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +119b5881-58c5-4891-8c79-df4c5486fb64,Standard,88c3a0b5-9def-4bf3-87c1-0ee75578b5a9,"{""type"":""LineString"",""coordinates"":[[0.72881356,0.36885246],[0.74011299,0.36885246],[0.73446328,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e466da06-3a27-4cea-962d-4449f392eed1,Standard,e3b38aa2-dd38-445e-86c4-600331d108d0,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.14754098],[0.7740113,0.14754098],[0.76271186,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +9aa0828c-100b-41d9-a1f9-5bc4957d27e5,Standard,a3c0115c-42eb-48a9-a6b0-64635ee66b87,"{""type"":""LineString"",""coordinates"":[[0.84180791,0.14754098],[0.85310734,0.14754098],[0.84745763,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +1f1e8882-9977-48c4-aaaf-c98087dff35d,Standard,2dd402ff-ef64-4b4b-8a49-e9570364e65b,"{""type"":""LineString"",""coordinates"":[[0.76836158,0.96721311],[0.75706215,0.96721311],[0.76271186,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fb4b559f-3d60-40f8-aa42-6741e8976026,Standard,81f4c585-6170-4a9e-981f-2185a0d7f2ec,"{""type"":""LineString"",""coordinates"":[[0.23163842,0.07377049],[0.23163842,0.1147541],[0.23163842,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 4bb29460-65cf-42ff-baed-c79ec00af1ec,Standard,0d6a5b4a-db92-4772-a91c-4e18ff35c0be,"{""type"":""LineString"",""coordinates"":[[0.74576271,0.44262295],[0.76271186,0.44262295],[0.74011299,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -00af0ca8-e5ba-4bcc-93e2-d876e5fe5f2d,Standard,7cfd5184-c217-42b9-be09-7ed413d7a11e,"{""type"":""LineString"",""coordinates"":[[0.77966102,0.96721311],[0.77966102,0.97540984],[0.77966102,0.98360656]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7d30150b-f752-417b-bbed-a6f3ecd2f823,Standard,bf6e54ab-1c74-4ce7-8371-b47e9019bd25,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.07377049],[0.02259887,0.04098361],[0.02259887,0.05737705]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7fdceb5a-d837-4672-a25c-3ef1c4b021f1,Standard,cd994d2f-b62e-4ab9-8f4c-e5357fd04af7,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.14754098],[0.72316384,0.14754098],[0.72881356,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -790513bc-152b-45ac-96c6-9e89f07719c0,Standard,031633ca-bd50-401e-9159-d2258ce6309c,"{""type"":""LineString"",""coordinates"":[[0.9039548,0.04918033],[0.90960452,0.04918033],[0.89830508,0.04918033]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -1d22d39f-e8b0-43b3-ab64-67ea9c72e892,Standard,6f875559-5af0-47a9-9f0e-f1d8332f9230,"{""type"":""LineString"",""coordinates"":[[0.81355932,0.96721311],[0.8079096,0.96721311],[0.80225989,0.96721311]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9b8ea76d-8054-4d43-afb3-664375202b2f,Standard,2ea48cfa-0a0b-48f0-aa66-b619c35b9929,"{""type"":""LineString"",""coordinates"":[[0.8079096,0.67213115],[0.81355932,0.67213115],[0.80225989,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7533ebc3-7178-4967-8613-437c2fd4663d,Standard,f59cd3fa-404d-4c42-820b-31346ae47c00,"{""type"":""LineString"",""coordinates"":[[0.88700565,0.25409836],[0.89265537,0.25409836],[0.89830508,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2b5bb969-f38a-4ac9-914a-413db62ac6f0,Standard,f03440ae-d6d8-4f7b-ad5f-bbd280a9d2a6,"{""type"":""LineString"",""coordinates"":[[0.71751412,0.44262295],[0.72881356,0.44262295],[0.72316384,0.44262295]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9f0829cb-1a13-482f-b372-ec6dcbbe2cda,Standard,73d786b9-377a-4807-9b70-21c80599a4d8,"{""type"":""LineString"",""coordinates"":[[0.83615819,0.96721311],[0.83615819,0.89344262],[0.83615819,0.93032881]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -74efa478-92b6-442f-9c59-fb15bf064429,Standard,c6d6ca9d-042c-4525-9221-65bfa04477a4,"{""type"":""LineString"",""coordinates"":[[0.79661017,0.36885246],[0.79096045,0.36885246],[0.78531073,0.36885246]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d377b2a4-317a-4934-8442-33b32bf55c4b,Standard,9af99daa-1e1e-45a8-bbed-c77e47ba4f8a,"{""type"":""LineString"",""coordinates"":[[0.71186441,0.77868852],[0.70621469,0.77868852],[0.70056497,0.77868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -21842dba-9c70-45df-b715-87db6ec36a0f,Standard,e311729e-244e-48a6-bc48-0c7d9823c148,"{""type"":""LineString"",""coordinates"":[[0.92090395,0.04918033],[0.40677966,0.10655738],[0.92655367,0.04918033],[0.93220339,0.04918033],[0.41242938,0.10655738]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fc601178-3ca7-48f9-8a07-e9fb3751d3e0,Standard,9e9550e6-a601-4633-96a1-20220893ce00,"{""type"":""LineString"",""coordinates"":[[0.79096045,0.89344262],[0.78531073,0.89344262],[0.77966102,0.89344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +97ca267c-1174-4faf-9617-56bd2a90a390,Standard,3026e0ba-0a46-4d5e-afff-953c34fde207,"{""type"":""LineString"",""coordinates"":[[0.94350282,0.04918033],[0.94350282,0.02459016],[0.94350282,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a6a4da26-f67b-4ef9-aef8-c072a664c473,Standard,7cc28881-dec6-4baa-ad77-d4a2ea3cdd68,"{""type"":""LineString"",""coordinates"":[[0.02259887,0.0],[0.02259887,0.0204918],[0.02259887,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +d557f6be-2b4b-46af-8e8b-2c2e85d210d1,Standard,ff38b3f7-e29d-4f61-946e-59a8b283295c,"{""type"":""LineString"",""coordinates"":[[0.93220339,0.25409836],[0.92655367,0.25409836],[0.92090395,0.25409836]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bd830d87-73b0-44c8-9250-26afd33ac4f5,Standard,10c6a103-3132-4324-8f76-8c1858d51fcb,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.24590164],[0.17514124,0.24590164],[0.14689266,0.24590164]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c1971b4a-7f78-4488-a54f-03867b87cdf8,Standard,7614ed07-f464-4a56-8ea2-cf07772530c4,"{""type"":""LineString"",""coordinates"":[[0.93785311,0.67213115],[0.94350282,0.67213115],[0.94915254,0.67213115]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_input.csv index a69e6309f..bd6493357 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_input.csv @@ -1,292 +1,292 @@ uuid,geo_position,id,length,node_a,node_b,olm_characteristic,operates_from,operates_until,operator,parallel_devices,type -97ce398b-de56-4b28-925c-a37f9029e875,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_05-MS4_06,0.4000000059604645,ee384ace-040e-4f21-8a8a-d702ab51af55,fa6d5184-b205-4b1b-839f-7b21ac956c29,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -f6c9e202-6548-405e-9969-bc4ae68ef7c1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(30)-NS_NET126_F1_(29),0.029999999329447746,519ace7e-fd3f-4797-b14b-36c1694b00cd,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -81f4c585-6170-4a9e-981f-2185a0d7f2ec,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_3-HS_NET1_Station_4,20.0,33f29587-f63e-45b7-960b-037bda37a3cb,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,"olm:{(0.0,1.0)}",,,,1,c940e435-0523-419a-90bc-f3dbf2e463f7 -2dd402ff-ef64-4b4b-8a49-e9570364e65b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(36)-NS_NET146_F1_(35),0.019999999552965164,8f80e777-ccbd-4630-b10e-238e824113fd,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -5c26821d-ea3b-4a00-8d42-1486710a2ca5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(16)-NS_NET126_F3_(17),0.029999999329447746,6232b760-b2e0-485e-9c61-f9721a366a81,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -14f9eef8-8550-45fa-a3f0-f583624556e7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(13)-NS_NET126_F2_(14),0.02199999988079071,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,9ce9d92c-5583-4b16-bec6-9f67834663cb,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -9af99daa-1e1e-45a8-bbed-c77e47ba4f8a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(23)-NS_NET146_F2_(24),0.02800000086426735,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,970cf93c-36c5-4938-a7e4-3f184a7035f0,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d86488f7-cf74-41b4-9d62-e2923d00680f,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(20)-NS_NET126_F1_(21),0.05999999865889549,36cda100-86ae-4a20-ac71-20af603ac0cf,14ae9865-cb9b-4518-9f2a-c0fda3455a42,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -ea5f6247-4116-4acb-9595-52a7a0412897,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_3-NS_NET136_S1_4,0.029999999329447746,eb95ff15-56db-4463-bb54-0ee131167812,ed4697fd-016c-40c2-a66b-e793878dadea,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -3026e0ba-0a46-4d5e-afff-953c34fde207,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(17)-NS_NET126_F4_(2),0.10000000149011612,7125de08-1d28-409a-8b23-023a0294def5,c7e09266-c778-433b-b01a-5fb9e298ea8e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -97d5bd4a-ce14-4ded-90d4-4f2db25d6626,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(17)-NS_NET126_F1_(18),0.02500000037252903,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,2f64bf67-cee9-44bb-8c13-ff96878932af,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -09083d14-02aa-40a3-9948-86e86883bda1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(37)-NS_NET146_F1_(36),0.054999999701976776,450426ac-a560-4d17-b1fc-9e169530a655,8f80e777-ccbd-4630-b10e-238e824113fd,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -de25721a-7ad9-450f-9e89-f483f19bf8a7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(23)-NS_NET126_F2_(24),0.02800000086426735,9b509c7d-4647-40fd-b03e-7ab919215cc6,625bdd2c-a75f-46ef-850c-ca4704d56e55,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -7d68b748-ebe5-430e-95b8-bd0eededa136,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(1)-NS_NET146_ONS,0.12099999934434891,4f28e734-5148-4caf-ac64-270231740cbf,3da4fd3d-ac5e-409d-91fa-36516673cf57,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -7f853fc7-6d3e-4086-82b0-cc93c8257f46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(1)-NS_NET126_F1_(2),0.023000000044703484,4303784e-7193-454a-9be4-3591400b4eeb,a7ebd30b-b843-405f-9fae-ca6b489601f9,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -5d56c97f-e15c-4676-9b1a-fc5d7efb8a24,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(28)-NS_NET146_F3_(29),0.02199999988079071,c72a08bc-4685-49b1-b8ef-803aebc8c388,15345698-c319-461f-b969-37d50fb84220,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d9d1edce-43e0-4cbd-9801-4a4e1a1dfa71,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(17)-NS_NET146_F2_(18),0.023000000044703484,40537c84-c812-4231-bd23-0ba81922e937,21359dd1-7a23-4932-b656-c196fbffe751,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -81578256-7c89-4651-8863-31fd206c628c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(19)-NS_NET126_F1_(20),0.04399999976158142,d2aff632-fc26-4595-931c-92e266247ac8,36cda100-86ae-4a20-ac71-20af603ac0cf,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -8c6b2196-6705-45ec-9879-8334924f968c,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(25)-NS_NET126_F1_(26),0.028999999165534973,3a2f199c-2966-4b9a-939b-3a6c9924341c,3802b603-d08d-4031-b7d7-e29734bcc122,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -b672be06-2cbc-4510-8a96-34647985e9d5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(4)-NS_NET126_F3_(5),0.017999999225139618,bf7e7268-2fb6-4948-ace6-9037ae148fa3,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -815bc4d0-3418-4d15-8f85-c104a24e6b17,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(31)-NS_NET126_F3_(32),0.026000000536441803,67af7db0-0fd8-4657-bb4f-43a2141b9f73,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -8619b18b-8b32-4013-9b3a-6aab514b73cc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(2)-NS_NET126_F4_(3),0.04699999839067459,c7e09266-c778-433b-b01a-5fb9e298ea8e,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -84dcef6e-d5b1-436f-8562-369b2489bb10,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(34)-NS_NET126_F1_(33),0.019999999552965164,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,b425b28e-48a8-4ec4-a15a-387fcfb79895,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -c6d6ca9d-042c-4525-9221-65bfa04477a4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(13)-NS_NET126_F1_(14),0.03200000151991844,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,b7baa286-cbe2-4143-a08f-4e025af47529,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -95b47f01-829a-46c3-873a-4df11d798c49,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(7)-NS_NET146_F1_(8),0.01899999938905239,67c1746c-3af8-403f-983e-1c7c047383df,d5489e1b-0e7e-4ca9-a362-09c23576a622,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -64bd5e0e-cf5a-469f-a427-113b0e16893d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_02-MS2_03,0.5,535843a3-cf93-412f-b4d7-585337791ba8,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -e6882165-4c20-4589-9dd5-624b10802042,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(2)-NS_NET126_F4_(1),0.07100000232458115,c7e09266-c778-433b-b01a-5fb9e298ea8e,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -a7a76517-7239-4a95-b9b0-0027cddfa77b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(10)-NS_NET146_F4_(11),0.07599999755620956,ffcaf979-d707-4d25-8f46-f436f9792d7f,8b3e3802-5213-46d0-a498-15eb6e5852b5,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -9f57100c-cb04-49b5-a9bd-f0e78f87b18a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(10)-NS_NET126_F1_(9),0.03099999949336052,f6a31362-8b0d-4926-b0d0-10bb61db20df,5dfd45b8-48e7-42fd-ac53-cc57455486b5,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -445cc0c8-70b8-47d4-987f-308269b845a3,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(25)-NS_NET146_F1_(26),0.028999999165534973,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,154e9a99-467b-4f65-9928-8ebb14149baa,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -73c09f1f-3538-4b5f-acbf-38b686a0dbba,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(2)-NS_NET146_F4_(3),0.04699999839067459,b37ea333-65e1-4211-8449-993b67e8e0e2,b5548457-5923-4d52-b3c9-fdb75a1df98e,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -29747132-2fe5-4570-8d02-114d3438835c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(26)-NS_NET126_F2_(27),0.02800000086426735,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,daed3552-e382-4153-95be-97f17e2c53e5,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -c3206971-b22f-4090-826b-e08d4bc8ffad,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_3-NS_NET116_S1_4,0.029999999329447746,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,b3a7431d-89b0-41cb-87a9-5853890796cd,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -76f097c5-173f-4fee-b6db-190792922d0e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_ONS-NS_NET136_S3_1,0.029999999329447746,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,416fa5eb-2f72-46c3-978f-6a0ebb714a40,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -7f2e8019-f650-42b7-bd39-6895cb9c4d9f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(9)-NS_NET146_F3_(10),0.03200000151991844,6570535c-0d2e-4846-9951-21559902f67a,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -0f11e5d6-f850-463b-8d74-6fdf91fad535,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(1)-NS_NET146_ONS,0.02199999988079071,2c520ab6-507e-4dcf-ab05-8f238e9b9385,3da4fd3d-ac5e-409d-91fa-36516673cf57,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -b6b655da-54ed-41d8-a331-04e41d2286de,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_1-NS_NET136_S1_2,0.029999999329447746,535b3fa4-ed67-4ab1-9a68-e7db83e05967,032768b4-2426-4abf-806b-83813ac5137a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -ec6f82c5-e834-48d0-84af-a0f070979d65,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(19)-NS_NET126_F3_(20),0.019999999552965164,922a6375-b97c-412e-a6c9-b0ea55a23f76,732f83b0-b9c5-4b8e-86fe-753c26f40e78,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -cadd7ca5-2b70-4bcc-83d0-867df8b6d0a3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(29)-NS_NET146_F3_(30),0.028999999165534973,15345698-c319-461f-b969-37d50fb84220,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -13ea7170-5fc1-4ed8-be71-0a91a9e5df99,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(16)-NS_NET146_F3_(17),0.029999999329447746,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,0f3ba59d-a9ce-4669-aa12-bebec42238b7,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -2497455a-888c-4ac6-aa49-582ab91fd05e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(35)-NS_NET146_F1_(32),0.028999999165534973,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,033d0230-4aee-47cf-91f9-81f5f40e60b0,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -21dc5686-67b6-49dc-b5aa-ecc7f7deb620,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(2)-NS_NET146_F2_(3),0.01899999938905239,69efeb2d-9845-49ac-8500-5e017a7a64ef,0170837a-1876-45f9-a613-666f9991964d,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -31f8365c-9329-4c46-8555-6ec6aadf130e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(9)-NS_NET146_F4_(10),0.032999999821186066,9b889b73-c108-4b38-b6eb-3377841e0c83,ffcaf979-d707-4d25-8f46-f436f9792d7f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -8dd3984e-a9f6-4829-9c19-a377e3491f9a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(23)-NS_NET126_F3_(24),0.023000000044703484,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,97ae0aa4-bf05-4b88-8020-83cbda415d22,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -10c6a103-3132-4324-8f76-8c1858d51fcb,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_2-NS_NET116_S1_3,0.029999999329447746,3e21f3a1-2c9c-4138-bcc9-466b004609ed,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -91179f48-2d6c-4ae4-864c-d667f57a6e66,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_1-NS_NET116_S1_2,0.029999999329447746,8a50fb37-81cf-47c9-8850-a12b4391e2e7,3e21f3a1-2c9c-4138-bcc9-466b004609ed,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -7263918d-4331-43af-bd10-8c06bd2b8667,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(22)-NS_NET146_F3_(23),0.02500000037252903,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -e357bf93-aaa3-4870-b6a4-6d2cdb8967da,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(5)-NS_NET126_F1_(6),0.017999999225139618,eb21d716-1b54-4dba-bdc2-d1f6752aef85,99e26ef8-75e2-46f3-aafc-6287bf5e3905,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -7cfd5184-c217-42b9-be09-7ed413d7a11e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(32)-NS_NET146_F1_(33),0.03099999949336052,033d0230-4aee-47cf-91f9-81f5f40e60b0,543f7e9f-b9be-486b-b365-2bae79010758,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -37c8ebe1-5d29-4806-a84a-fc00e4279fa6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_3-NS_NET116_S3_4,0.029999999329447746,d69efff2-ba8b-4aa6-a4a1-27267964147a,36dccefc-f04c-493f-bb88-11343583bf9f,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -09125a13-324b-4611-a718-5028b390f1ca,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(1)-NS_NET146_ONS,0.03099999949336052,22e58399-428f-4633-9ee4-e5fa0db68d6d,3da4fd3d-ac5e-409d-91fa-36516673cf57,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -d9d3a1f3-5090-4015-86a5-60be94fadcbf,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_3-NS_NET136_S2_4,0.029999999329447746,fd534474-cd65-47aa-8005-dc50d17d6920,81cd3f38-867b-4a71-ba22-cb33834e0e58,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -d54fcb7e-d472-4035-aff6-2646ce881931,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(3)-NS_NET126_F1_(4),0.019999999552965164,04f29760-9e52-4943-8563-62e1fbd5ed52,ff947647-b551-41ae-bcfd-6af228250c96,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -041991a2-c961-44a7-bfec-29cccd9a7831,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(9)-NS_NET126_F2_(10),0.017999999225139618,a286f73a-20ee-4056-8129-c7963b34ecd9,3d81adf5-73d1-4708-b03b-3afc7db017f4,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -3029d722-91ec-4e45-9243-d267222b6c8e,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(3)-NS_NET126_F2_(4),0.026000000536441803,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -de5aeea7-2505-4f0d-9d53-22a5287ab8b7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(24)-NS_NET126_F2_(25),0.028999999165534973,625bdd2c-a75f-46ef-850c-ca4704d56e55,1dcddd06-f41a-405b-9686-7f7942852196,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -2e5bf3d7-11a5-496f-9bd5-bb9d3686a576,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(5)-NS_NET146_F3_(6),0.02500000037252903,ce71377d-63ea-462a-9290-67e51946a098,01bdd8b2-145f-42b3-80e3-a2366dea1044,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -e7388048-40c3-4fd7-bcbb-2e1b09e735d2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(11)-NS_NET146_F1_(12),0.01899999938905239,666757e2-292e-473c-ac9c-04c0786574bc,3b879239-20c8-4adf-bd51-92924327ee71,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -66651745-4425-4a9a-9a2a-3f2715252cf6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_2-NS_NET136_S2_3,0.029999999329447746,cbcfc3b6-ac90-4215-975c-a033f5cf9912,fd534474-cd65-47aa-8005-dc50d17d6920,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -1a1550cf-77b8-40a9-90e5-5d0faef7baaa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(12)-NS_NET146_F1_(13),0.02199999988079071,3b879239-20c8-4adf-bd51-92924327ee71,f1e55c8b-357f-45a7-9d57-e299f9b207f3,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -bfecad6c-ddda-4957-ae66-f04d30fd7104,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(23)-NS_NET126_F1_(24),0.05000000074505806,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,4f2402e8-664a-40f2-970a-abc098a2a0d1,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -5157574f-5e67-4574-81a3-686b97a893ff,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(33)-NS_NET126_F1_(32),0.028999999165534973,b425b28e-48a8-4ec4-a15a-387fcfb79895,49b511fa-8cff-45f4-9a59-54faaaf90abf,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -a4dc31e8-e10a-4b42-90b4-f14d0f133c0c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(12)-NS_NET126_F2_(13),0.02800000086426735,9d02ea80-98d8-4cd0-a635-9104a14a56dd,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -a8bc3d4a-1113-4f62-b01d-e59e6c35ab84,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_01-MS1_02,2.0,f5839ade-5968-4879-a824-90b5fb3552cd,32b3bb19-c52a-4a19-890a-94a8918d38a9,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -7cc28881-dec6-4baa-ad77-d4a2ea3cdd68,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_06-MS1_07,6.0,b22c9299-5fb4-46a7-b566-fc17e0d51d60,7546df1d-8a62-4650-bf2e-d1e441b38d70,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -23abf40d-58a7-4f00-9ee8-5290a510f9b2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_03-MS3_04,6.0,e4502c52-b4d7-4082-a583-b5688d8244e0,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -746fa279-2acf-4aa1-b3e1-8d312d66058a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(5)-NS_NET146_F2_(6),0.028999999165534973,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,5071dd8c-bbc1-4c8d-a180-4492f80e183d,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -094a0827-54d8-4ed9-bb8f-2766db020c87,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(20)-NS_NET146_F1_(21),0.05999999865889549,7d45f0ab-1e6b-452f-b665-c4846cf046f5,92cb5065-2e57-4099-8e29-75cbc0c80370,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -25a1e96e-b425-48bf-a3ae-dc54ea9da47f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_ONS-NS_NET116_S3_1,0.029999999329447746,31a2b9bf-e785-4475-aa44-1c34646e8c79,4a6f6058-e654-464d-9367-2dca7185c6d7,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d5d7329a-08a2-4946-8a02-d4a70746d37b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(31)-NS_NET146_F1_(30),0.019999999552965164,5e213f42-d93e-45c5-a295-adbe09105746,9f95c733-71e2-4bf0-a27a-70144518ea2c,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -ab7c6c3c-3b7f-4475-8cad-27657bc148c6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(2)-NS_NET146_F2_(1),0.028999999165534973,69efeb2d-9845-49ac-8500-5e017a7a64ef,2c520ab6-507e-4dcf-ab05-8f238e9b9385,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -97b9a53e-9ff2-4567-95c0-6c9aab07a43f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(21)-NS_NET146_F3_(22),0.027000000700354576,a4a44d93-48d6-4b87-8053-87fe0778e75c,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -7b7ac3b3-877f-4cba-8ad4-6171f2c5b83c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(2)-NS_NET126_F1_(3),0.027000000700354576,a7ebd30b-b843-405f-9fae-ca6b489601f9,04f29760-9e52-4943-8563-62e1fbd5ed52,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -63856192-b60e-48a5-83a3-94422a79e79e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(16)-NS_NET126_F1_(17),0.03200000151991844,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -0c04a652-1076-4b59-a957-652790b4c963,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(38)-NS_NET126_F1_(39),0.027000000700354576,06b7f21a-d6d7-4ec0-94c6-141845f14986,60173008-809d-4d8f-b06a-3c4a838dd989,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -764eccc0-09cc-4c7a-bf76-33259938530c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(9)-NS_NET146_F2_(10),0.017999999225139618,a5c73608-5a85-495d-bea0-df77b6ce66ea,41414318-73e3-4bdc-8147-570a96b28d37,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -03b3d5c7-cb42-45d7-a5b7-b44c60ad5268,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_04-MS2_05,0.800000011920929,5f1c776c-6935-40f7-ba9e-60646e08992b,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -2d552f15-6871-4e09-84b1-003da098d909,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_1-NS_NET116_S2_2,0.029999999329447746,39112046-8953-4e73-a5d9-6a8183a77436,d53ff076-dadd-44f8-85d4-68f48991f7d0,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -2d616d05-fa31-4b7f-b666-0fab28a21a82,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(28)-NS_NET126_F3_(29),0.02199999988079071,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -1a5bb799-bc03-4de9-a8a1-9a0616ea3add,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(13)-NS_NET146_F2_(14),0.02199999988079071,49e14db3-a4bc-464a-b606-653ac8a604dd,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -784bfe2a-8d23-4e74-8b05-b13141611186,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(20)-NS_NET146_F3_(21),0.020999999716877937,0ebf0088-f596-4cd1-9ae0-5da02dc40335,a4a44d93-48d6-4b87-8053-87fe0778e75c,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -56603d19-84d5-4c2f-a42c-92777602999a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(16)-NS_NET126_F2_(17),0.024000000208616257,d8c35123-b389-4199-84f9-d417d24bb78d,c5457e35-ad81-4427-9d3a-99e4c44ccae8,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -b5a66c60-7189-4c86-a32a-4d1aa6568475,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_4-HS_NET1_Station_1,30.0,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,00d03670-7833-47ee-ad52-04d18d1c64fd,"olm:{(0.0,1.0)}",,,,1,9ac19e4c-0379-4aaf-a96a-b2e71462abb3 -d97f2684-22cb-4c14-b01c-b95081d4d624,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(29)-NS_NET146_F1_(28),0.02500000037252903,867c4b4d-0f38-4f28-82ce-135f2cc63808,012c9eee-86c2-494c-adcc-bbfc481e4a46,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -2005c393-edc4-4cc4-80af-ebbde1305b8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(38)-NS_NET146_F1_(37),0.028999999165534973,32507a10-1eed-4a3f-820c-bc187f3b052e,450426ac-a560-4d17-b1fc-9e169530a655,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -f2c37ce1-91d3-43d3-beb3-1fc9a30c87fe,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(7)-NS_NET126_F3_(8),0.03200000151991844,50164699-2018-4b17-b3f1-74b082f27403,6dcdc87b-a719-416f-9da1-21a701048f3a,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -1c81ee69-fb75-4bea-bfa9-f627850f9e6b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(10)-NS_NET126_F4_(11),0.07599999755620956,857c264a-7072-4bb7-af56-2f01539b2a2e,95ced3b5-69fd-4171-9c34-f18802064e22,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -0b6f398b-30f3-41f1-9bc2-ec93e91e8f19,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(22)-NS_NET126_F2_(23),0.027000000700354576,177a20fe-83b1-46df-94a3-4faa54348d10,9b509c7d-4647-40fd-b03e-7ab919215cc6,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -220f509c-9aea-4e60-8dc1-593d2e35ed21,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(15)-NS_NET146_F2_(16),0.017999999225139618,d82fae59-844a-4c85-997e-326dd876137c,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -0c73890d-adfa-4936-966f-8e527c06bdbe,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(21)-NS_NET126_F1_(22),0.03200000151991844,14ae9865-cb9b-4518-9f2a-c0fda3455a42,c317a6cd-428b-4c36-8233-91d0c4e2717a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -147bf31b-f9b1-415f-858b-f3ed430e508d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(18)-NS_NET146_F2_(19),0.028999999165534973,21359dd1-7a23-4932-b656-c196fbffe751,636dec7c-4242-46e8-b7ae-db7e5a28c39c,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -8c4d9aa2-298b-466e-9982-6c4be253fbce,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(15)-NS_NET126_F2_(16),0.017999999225139618,2645e336-b0df-4d1e-a0ea-375444488f06,d8c35123-b389-4199-84f9-d417d24bb78d,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -13cfe1fb-1cec-4c17-baf8-b7dcb9f744cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(1)-NS_NET126_ONS,0.12099999934434891,4303784e-7193-454a-9be4-3591400b4eeb,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -2424f0ab-9f83-464e-a960-093ab14a2bb5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(17)-NS_NET126_F3_(18),0.020999999716877937,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -16b934cc-98c6-42b9-9005-be4bf7365693,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_3-NS_NET136_S3_4,0.029999999329447746,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,2a816043-d1d2-44a6-8a9b-f61a4933997b,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -222af488-6339-4308-8f25-eac19b6e2c9c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(24)-NS_NET146_F1_(25),0.02800000086426735,205fcee1-928c-4374-950c-34575f07fa49,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -af565c79-9953-4934-9afd-91cd64ed1f06,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(6)-NS_NET146_F1_(7),0.03099999949336052,e3c3c6a3-c383-4dbb-9b3f-a14125615386,67c1746c-3af8-403f-983e-1c7c047383df,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -52cd80d8-9489-41bc-931a-d82dba5d0926,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_4-NS_NET136_S2_5,0.029999999329447746,81cd3f38-867b-4a71-ba22-cb33834e0e58,c5af5a34-211a-4105-a8e1-f447140073c6,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -8bb29769-404b-4bf6-837e-f9ca1b389bf9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_2-NS_NET116_S3_3,0.029999999329447746,550ebca7-1455-44eb-9431-ffbf08e58bd4,d69efff2-ba8b-4aa6-a4a1-27267964147a,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -c4f33026-5741-4070-970c-1234541ce509,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(8)-NS_NET146_F2_(9),0.02800000086426735,792b505c-87ab-4665-a31d-b6035c5ece70,a5c73608-5a85-495d-bea0-df77b6ce66ea,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -a3c0115c-42eb-48a9-a6b0-64635ee66b87,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(11)-NS_NET126_F3_(12),0.019999999552965164,4258f215-5b22-446f-a260-e8cdaa7c95d1,eb125953-31d3-4207-adf7-aba3a3790d6f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -2ea48cfa-0a0b-48f0-aa66-b619c35b9929,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(14)-NS_NET146_F3_(15),0.029999999329447746,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -8ae06d94-8e5d-48f6-9d43-599596df688a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(6)-NS_NET126_F1_(7),0.03099999949336052,99e26ef8-75e2-46f3-aafc-6287bf5e3905,fc7821d2-ac64-483e-b520-38d9971f4db0,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -bdf60fc2-e400-46f6-b873-7a40663106f3,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(6)-NS_NET126_F4_(7),0.03400000184774399,e3a40690-d085-4796-9fcb-48d776e58594,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -ff38b3f7-e29d-4f61-946e-59a8b283295c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(4)-NS_NET126_F2_(5),0.020999999716877937,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -75098182-83b1-40ae-baaf-95f1e1f93250,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(29)-NS_NET126_F3_(30),0.028999999165534973,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -9e9550e6-a601-4633-96a1-20220893ce00,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(13)-NS_NET146_F1_(14),0.03200000151991844,f1e55c8b-357f-45a7-9d57-e299f9b207f3,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -a2a8bc02-02a9-40d8-9495-058c04d7df89,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(7)-NS_NET146_F2_(8),0.02500000037252903,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,792b505c-87ab-4665-a31d-b6035c5ece70,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -199bc8fc-71a0-4c78-a64d-80a87f0f6b78,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(15)-NS_NET146_F4_(14),0.08399999886751175,576840db-7d3c-417b-b587-28b222e740e1,f2d03b34-9595-4819-a00b-ff9ddd92eb07,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -24537b9f-9cb9-45d1-8bbb-f87e3a948a69,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(10)-NS_NET146_F3_(11),0.026000000536441803,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,e2267696-669b-48e8-b43a-37d0db95011d,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -0d6627e5-9f9e-4c40-90c1-45abd98a51cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_01-MS2_02,2.0,1a8ba1a5-3cee-4791-b21b-f17b08526873,535843a3-cf93-412f-b4d7-585337791ba8,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -cc8bc119-79d7-479b-8767-8b108a0ba4a0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(20)-NS_NET126_F3_(21),0.020999999716877937,732f83b0-b9c5-4b8e-86fe-753c26f40e78,5af425fa-6ed7-43e1-8898-7af1315128c5,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -f59cd3fa-404d-4c42-820b-31346ae47c00,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(7)-NS_NET126_F2_(8),0.02500000037252903,4db634e5-3eb8-4c17-bc44-eb224667580c,366a70fb-8d7f-4201-9eca-0fcbc839239d,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -4cfd425d-6158-4904-86b5-d16dc47a4778,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(6)-NS_NET146_F3_(7),0.028999999165534973,01bdd8b2-145f-42b3-80e3-a2366dea1044,f1e88392-3b2a-4ce8-a31f-c963f08f8043,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -ffdd2907-38ed-4a39-89de-9435e97dadc0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(18)-NS_NET126_F2_(19),0.028999999165534973,e80aa2db-f32c-410d-96a1-a32e03222568,52e15712-2572-442a-b22c-add48af95115,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -83b12a0c-d66f-43cf-a5c1-1945a8a66c4c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(27)-NS_NET146_F2_(28),0.027000000700354576,b179c38b-5af0-4304-84b1-1dc03314fd80,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -7fa87646-f182-4d67-9ffd-850f489fb24a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(26)-NS_NET146_F3_(27),0.026000000536441803,bd288184-99d8-4233-bb3d-484f3922200a,55caf2ec-a21b-4afd-8830-1e4009cce396,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -c49d1581-a0c6-493f-9534-39f97970492b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(13)-NS_NET146_F3_(14),0.020999999716877937,bdf97a4d-622c-4251-8183-8b1a696f376e,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -a9a94bc3-fa83-410a-9e71-38807e8d121c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(16)-NS_NET146_F1_(17),0.03200000151991844,09ac8949-2b79-41d7-b56f-a58f20036df2,0d94a5ea-3a13-48ba-a27f-b2903841c334,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -a92769d6-3f6f-4e67-98b3-303e59dd9cda,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(5)-NS_NET126_F3_(6),0.02500000037252903,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,e018b95e-fca5-40f7-8550-b05a619169dc,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -ab23d369-ff75-41b4-8a25-25ec9c4320aa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(17)-NS_NET146_F3_(18),0.020999999716877937,0f3ba59d-a9ce-4669-aa12-bebec42238b7,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -d3d211d9-22f6-42ba-a596-0d0ca1c7e943,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(5)-NS_NET126_F2_(6),0.028999999165534973,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,9d7038e9-5bcc-4676-bead-46c4f1291ba8,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -47cc3694-2782-4c44-8c61-e14d30dbbaa4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(14)-NS_NET126_F1_(15),0.03200000151991844,b7baa286-cbe2-4143-a08f-4e025af47529,41c0087f-ce27-4da3-97d2-92d711b639b4,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -f395e127-6036-49bb-b06f-1a3808193dfa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(13)-NS_NET126_F4_(14),0.07999999821186066,da79c960-d35a-4193-9b06-2d4d57051706,d40a1a85-40f2-4ad3-ba58-720d5ba02268,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -5d1176ac-e64e-4811-8d0c-c87d9060ba2a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_ONS-NS_NET116_S2_1,0.029999999329447746,31a2b9bf-e785-4475-aa44-1c34646e8c79,39112046-8953-4e73-a5d9-6a8183a77436,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -02d85e44-4196-4ed1-9fa4-af9211dbd753,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(17)-NS_NET146_F4_(2),0.10000000149011612,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,b37ea333-65e1-4211-8449-993b67e8e0e2,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -d48db7e8-5fde-456f-8b17-02d18a5a2e32,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_4-NS_NET116_S2_5,0.029999999329447746,e05c68b1-11cd-43fd-a4b2-31e4db380c78,32bd37df-255b-4eb2-9d16-5b711132eee6,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -1372ca57-8429-43c6-a589-a402de4ac7f9,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(3)-NS_NET126_F3_(4),0.01899999938905239,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,bf7e7268-2fb6-4948-ace6-9037ae148fa3,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -5adb6634-4872-43af-b9cb-39df332b64b2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(8)-NS_NET146_F4_(9),0.0430000014603138,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,9b889b73-c108-4b38-b6eb-3377841e0c83,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -d15c85bb-c9b1-4fa3-8bf6-4aa393b564d4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(15)-NS_NET146_F3_(16),0.020999999716877937,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -b13204e1-02fa-49dd-92e2-c3310a15909a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(18)-NS_NET146_F1_(19),0.029999999329447746,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,1f040625-ad1d-409f-bd7e-944c4d805e46,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -80332374-76fe-4d06-adde-e2197f88fe6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(13)-NS_NET146_F4_(14),0.07999999821186066,b608d71e-3ede-4156-a015-3f6e1d22242a,f2d03b34-9595-4819-a00b-ff9ddd92eb07,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -88c3a0b5-9def-4bf3-87c1-0ee75578b5a9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(18)-NS_NET126_F1_(19),0.029999999329447746,2f64bf67-cee9-44bb-8c13-ff96878932af,d2aff632-fc26-4595-931c-92e266247ac8,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -b5c255b5-8572-41ce-a273-a01d2a4b4e20,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(11)-NS_NET126_F4_(12),0.05000000074505806,95ced3b5-69fd-4171-9c34-f18802064e22,6a4547a8-630b-46e4-8144-9cd649e67c07,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -5001666c-1331-43f9-8b09-3667c89951d4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(15)-NS_NET126_F4_(16),0.04800000041723251,55b3d03f-2204-4ab3-84cc-a28476868c9d,b8fa1f73-223c-4b08-a140-44f12484cce3,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -f03440ae-d6d8-4f7b-ad5f-bbd280a9d2a6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(37)-NS_NET126_F1_(36),0.03200000151991844,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,ca3391eb-ca94-4945-ac72-e116f396f82c,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -95644bf5-8dca-4409-bb04-7d4e9a24fa03,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(30)-NS_NET126_F3_(31),0.023000000044703484,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,67af7db0-0fd8-4657-bb4f-43a2141b9f73,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -31c8715f-7b85-4243-8908-69cf8b2c1525,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(5)-NS_NET146_F1_(6),0.017999999225139618,bd8c7d3d-e830-4a46-bf78-0086ce24909f,e3c3c6a3-c383-4dbb-9b3f-a14125615386,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -c87706ad-37ff-4419-b4bc-4607d780498e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(10)-NS_NET126_F2_(11),0.01899999938905239,3d81adf5-73d1-4708-b03b-3afc7db017f4,6678c226-c5d2-4ce3-9728-dc1163be799f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -4c98fe8a-ca2a-4503-8843-a800cbf92c82,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(13)-NS_NET126_F3_(14),0.020999999716877937,f29859be-c6e7-4cf9-84d7-239eb98a9e65,df8df8d2-3494-4da9-8d1b-f913d15f520f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -d8d23da6-be08-4ace-8d93-70c0faab1505,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(4)-NS_NET126_F4_(5),0.05999999865889549,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,de5ee252-ebb6-42b0-875c-77ae557ffbf6,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -d74febce-1b8d-4f51-9721-5eb1866d6b4e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_06-MS3_07,6.0,39dbc5ed-d874-48a8-9128-e970436a94b4,40b0f497-96a3-49d9-9503-8fa67a5b532a,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -e50ba18f-8019-4824-b835-cc33c70b0196,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(3)-NS_NET146_F2_(4),0.026000000536441803,0170837a-1876-45f9-a613-666f9991964d,369cffa5-bcee-4489-8193-1d9b10230eca,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -106f03b3-b84e-4d36-ab09-13b3dc3403e7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_3-NS_NET116_S2_4,0.029999999329447746,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,e05c68b1-11cd-43fd-a4b2-31e4db380c78,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -b714db4a-db55-4957-b503-2300559bb81f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_2-NS_NET116_S2_3,0.029999999329447746,d53ff076-dadd-44f8-85d4-68f48991f7d0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -f0d4491e-eb64-49a0-8fc3-44fa5bd9dcee,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_4-NS_NET116_S3_5,0.029999999329447746,36dccefc-f04c-493f-bb88-11343583bf9f,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -7297611b-fbdc-4949-87fc-1bca403708aa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(7)-NS_NET146_F3_(8),0.03200000151991844,f1e88392-3b2a-4ce8-a31f-c963f08f8043,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -f8827054-46fd-486c-aa91-9bd813187705,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(3)-NS_NET146_F4_(4),0.05299999937415123,b5548457-5923-4d52-b3c9-fdb75a1df98e,00d4a837-f09c-41df-bed1-dfdb78387116,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -1cf0cb95-28b9-4dc1-82b9-3466d7d870cc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(25)-NS_NET146_F3_(26),0.026000000536441803,c6c177b0-5004-4db0-8cde-6293330a4757,bd288184-99d8-4233-bb3d-484f3922200a,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -ddc03ccc-bd8e-47f3-8183-97f3b039219d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(15)-NS_NET126_F3_(16),0.020999999716877937,ae234bc5-b751-41f2-95ee-b78de124c583,6232b760-b2e0-485e-9c61-f9721a366a81,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -a8b86d8f-a196-4eca-b248-66bc8918f9e6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(14)-NS_NET146_F1_(15),0.03200000151991844,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,00bbc353-d47e-4865-a696-fe5d29b9e6a2,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -4bdb6569-72da-4d60-97b1-b5a639032d5d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_4-NS_NET116_S1_5,0.029999999329447746,b3a7431d-89b0-41cb-87a9-5853890796cd,92301422-94ae-48ab-89c7-a69eea9450b2,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -971288e4-038b-49d5-8df0-b2a7fdc0e17c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_03-MS4_04,6.0,85ea3976-1779-4d46-bd6f-dfd36427ebdf,890f2162-b4cb-49e7-a16f-4b552c5e245c,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -8a09b9b8-6c9f-4dc7-a5a5-fe5d22b5809a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(11)-NS_NET126_F2_(12),0.029999999329447746,6678c226-c5d2-4ce3-9728-dc1163be799f,9d02ea80-98d8-4cd0-a635-9104a14a56dd,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -ca425259-fab4-4dc1-99c9-c19031121645,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(4)-NS_NET146_F2_(5),0.020999999716877937,369cffa5-bcee-4489-8193-1d9b10230eca,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -b302dc76-9715-45b6-b6ef-8da630acd168,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(20)-NS_NET146_F2_(21),0.02500000037252903,2aa2d409-8bb2-477d-ac7a-6439552e136a,bd292f64-65e8-42ec-9b78-b9b9f013750e,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -0f9bf171-b79b-4009-8b0b-6ec18c523ebf,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(18)-NS_NET146_F3_(19),0.03099999949336052,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,810bebb0-0d5c-4899-b213-3207be661248,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -2887fb2b-fe44-4436-b28e-9f100f8288ac,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_4-NS_NET136_S3_5,0.029999999329447746,2a816043-d1d2-44a6-8a9b-f61a4933997b,3bc8235b-03b5-489b-81a2-58d520fbe28e,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -f4859003-7182-4ebf-8a96-ce61b2f6191c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_01-MS4_02,2.0,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,174fb4b2-4f9e-415c-bfee-d850ef751307,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -9ec195e0-4c9b-48a6-9233-0d770b34705b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(10)-NS_NET146_F2_(11),0.01899999938905239,41414318-73e3-4bdc-8147-570a96b28d37,f26b5511-3c50-42d5-97c2-be408330eb84,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -98a4759c-696b-4c99-b339-cf39ecc76ba7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_1-NS_NET136_S2_2,0.029999999329447746,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,cbcfc3b6-ac90-4215-975c-a033f5cf9912,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -52ccd989-d87b-4f9f-9d5d-a0609391f56e,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(10)-NS_NET146_F1_(11),0.027000000700354576,6c24b464-790a-4aae-bb11-766718f07cd5,666757e2-292e-473c-ac9c-04c0786574bc,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d59a733b-b7c6-401b-8e38-653e0cb72b5c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(32)-NS_NET126_F1_(38),0.03099999949336052,49b511fa-8cff-45f4-9a59-54faaaf90abf,06b7f21a-d6d7-4ec0-94c6-141845f14986,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -73d786b9-377a-4807-9b70-21c80599a4d8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(27)-NS_NET146_F1_(9),0.03200000151991844,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,0db6e581-37e9-4254-aed8-d5cdf66819f9,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -be047b0d-9f7c-413e-bd60-f38b45d5ee80,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(10)-NS_NET146_F1_(9),0.03099999949336052,6c24b464-790a-4aae-bb11-766718f07cd5,0db6e581-37e9-4254-aed8-d5cdf66819f9,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -c64c73c4-109b-4baa-bf44-3357d4bca7d8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(6)-NS_NET146_F2_(7),0.020999999716877937,5071dd8c-bbc1-4c8d-a180-4492f80e183d,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -5905e32c-b1d7-40d9-9759-84dbe6b14ba8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(22)-NS_NET146_F2_(23),0.027000000700354576,5862f526-783a-4218-a463-3cbf5de8dade,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -edbbe75f-8d40-42e8-a6f4-857f64547cbd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(32)-NS_NET146_F1_(31),0.024000000208616257,033d0230-4aee-47cf-91f9-81f5f40e60b0,5e213f42-d93e-45c5-a295-adbe09105746,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -96cc155a-9417-4ed9-911a-b06b7981a2fe,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(33)-NS_NET146_F1_(34),0.027000000700354576,543f7e9f-b9be-486b-b365-2bae79010758,fd4f6232-c28d-4fc3-81dd-03b84aad695e,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -5753e615-c90a-4008-92ec-b50c8195f95f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(27)-NS_NET146_F3_(28),0.03099999949336052,55caf2ec-a21b-4afd-8830-1e4009cce396,c72a08bc-4685-49b1-b8ef-803aebc8c388,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d7c951cc-2e8f-40d0-b310-03fbdb9b0558,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(8)-NS_NET126_F2_(9),0.02800000086426735,366a70fb-8d7f-4201-9eca-0fcbc839239d,a286f73a-20ee-4056-8129-c7963b34ecd9,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -00a3c4ab-e866-42a9-854f-fbf28c7f6a43,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(14)-NS_NET146_F2_(15),0.03200000151991844,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,d82fae59-844a-4c85-997e-326dd876137c,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d160ec85-06ab-42d2-9dc1-4f905306e0a6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(12)-NS_NET126_F1_(13),0.02199999988079071,9d10a92f-576d-4777-99ff-59d145924fea,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -d00ddea9-83f7-411a-9da6-f9607ffb3c87,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(30)-NS_NET146_F3_(31),0.023000000044703484,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -b08cf4bc-d9f2-4608-a162-74db09b16db0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(27)-NS_NET126_F1_(9),0.03200000151991844,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,5dfd45b8-48e7-42fd-ac53-cc57455486b5,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -7df282f5-2e54-4220-8276-087634415be8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(36)-NS_NET126_F1_(35),0.028999999165534973,ca3391eb-ca94-4945-ac72-e116f396f82c,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -e311729e-244e-48a6-bc48-0c7d9823c148,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(3)-NS_NET126_F4_(4),0.05299999937415123,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -60c4970b-636a-4f8a-9329-97d01107a962,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_04-MS1_05,0.800000011920929,1396cb4c-cee7-4116-97c9-290f98785719,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -26d976e2-5245-4174-abcc-7e67e03d6352,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(12)-NS_NET146_F3_(13),0.019999999552965164,f6eff0d1-af6b-46ce-b430-4d30976ec08f,bdf97a4d-622c-4251-8183-8b1a696f376e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -9d1ef0fd-3f8d-4a97-8495-25074243860c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(19)-NS_NET146_F2_(20),0.019999999552965164,636dec7c-4242-46e8-b7ae-db7e5a28c39c,2aa2d409-8bb2-477d-ac7a-6439552e136a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -597126c9-f364-4968-909c-ccc064959397,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(32)-NS_NET126_F1_(31),0.024000000208616257,49b511fa-8cff-45f4-9a59-54faaaf90abf,80d8252b-045f-471a-9638-416ed3f86120,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -04d02ea8-ba96-4a7f-969d-d25e201e32c6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(2)-NS_NET146_F4_(1),0.07100000232458115,b37ea333-65e1-4211-8449-993b67e8e0e2,ead38a50-b8f7-4bbb-b65d-f54350825e8e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -5763fe56-89a4-4407-ba41-c1a528dd50a0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(23)-NS_NET146_F1_(24),0.05000000074505806,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,205fcee1-928c-4374-950c-34575f07fa49,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -eb1cd362-f3bd-4411-a45d-a237bcb07789,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(15)-NS_NET146_F1_(16),0.019999999552965164,00bbc353-d47e-4865-a696-fe5d29b9e6a2,09ac8949-2b79-41d7-b56f-a58f20036df2,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -7ad69cae-2bb0-4516-80a9-6afc7b5cb789,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(21)-NS_NET126_F3_(22),0.027000000700354576,5af425fa-6ed7-43e1-8898-7af1315128c5,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -e1315733-0b28-4465-8367-fa4535d282fa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(9)-NS_NET126_F3_(10),0.03200000151991844,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,e25387d0-ab9a-406d-bcb4-555414b88b1b,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -4dbb5675-cc27-4868-a9cc-e28ca232ba23,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(2)-NS_NET126_F3_(3),0.028999999165534973,285a4caa-2da8-4bd2-8a60-7d04f168f378,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -184c0d91-3f4b-4816-a82d-519e4bcd7ee9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_4-NS_NET136_S1_5,0.029999999329447746,ed4697fd-016c-40c2-a66b-e793878dadea,926d6113-933f-49e3-9529-a3035acdc9b2,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -876998db-5326-4257-b2d1-a4722265f51d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_02-MS4_03,0.5,174fb4b2-4f9e-415c-bfee-d850ef751307,85ea3976-1779-4d46-bd6f-dfd36427ebdf,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -ce640cab-6f6d-4fd1-b652-009bec4c596b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(9)-NS_NET146_F1_(8),0.026000000536441803,0db6e581-37e9-4254-aed8-d5cdf66819f9,d5489e1b-0e7e-4ca9-a362-09c23576a622,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -5f8eb2b8-0f98-4011-bc3a-b182285be4db,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(29)-NS_NET126_F1_(28),0.02500000037252903,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,0c266541-6235-4d01-8258-e763c58af6c7,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -d2cd0ac6-ffbb-43f3-94c1-e10344eea594,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(12)-NS_NET126_F3_(13),0.019999999552965164,eb125953-31d3-4207-adf7-aba3a3790d6f,f29859be-c6e7-4cf9-84d7-239eb98a9e65,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -a102f0f4-e86d-438c-95a9-d3fc6357121f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(4)-NS_NET146_F4_(5),0.05999999865889549,00d4a837-f09c-41df-bed1-dfdb78387116,d7023c15-adb7-4d56-9f86-b182611a47ef,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -412d395e-7ebc-4cc6-88fb-24006f54c931,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(12)-NS_NET146_F4_(13),0.039000000804662704,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,b608d71e-3ede-4156-a015-3f6e1d22242a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -5450f675-565b-4156-9d64-ff4cfeea96d3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(25)-NS_NET146_F2_(26),0.02199999988079071,011e3794-3341-4376-839c-3f5a452e15ab,86af5351-87ef-49c6-bd17-673dceecee5b,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -8add0020-bc20-4aaa-9ad3-fa1a1a5ef376,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(15)-NS_NET126_F1_(16),0.019999999552965164,41c0087f-ce27-4da3-97d2-92d711b639b4,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -1a52eb5c-a8a1-4b69-9aac-138e425d835b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(7)-NS_NET126_F4_(8),0.041999999433755875,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,75f2dfb9-75a0-496d-9c44-79e7df54c1df,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -eb64f0fb-1810-4b49-b0a6-e94a6422be04,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(1)-NS_NET126_ONS,0.03099999949336052,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -9085189c-48df-498a-80e5-49fe54692a66,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_1-NS_NET136_S3_2,0.029999999329447746,416fa5eb-2f72-46c3-978f-6a0ebb714a40,b46d4395-6724-4830-ba55-357e81fc2814,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -5fa6e010-393e-4bd2-a874-56eb784f9741,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(5)-NS_NET146_F4_(6),0.05400000140070915,d7023c15-adb7-4d56-9f86-b182611a47ef,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -dafff7d5-8ed4-4b2f-bcd3-b6d02472dfea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(24)-NS_NET126_F3_(25),0.029999999329447746,97ae0aa4-bf05-4b88-8020-83cbda415d22,1bf26b4d-03cc-4490-8c33-d3db8597d807,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -473a11f4-1691-44ba-8e95-96782bc9d07f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(27)-NS_NET126_F3_(28),0.03099999949336052,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -442c4813-6272-4cf9-b30b-22f9114bc3db,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(26)-NS_NET126_F3_(27),0.026000000536441803,dc022eec-16b0-4a64-a2f5-498d81aca71e,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -22acea8e-cde0-45a4-82e6-ce5241226aac,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(23)-NS_NET146_F3_(24),0.023000000044703484,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,773aebe4-fc03-46be-8209-0213e2760a8e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -bf6e54ab-1c74-4ce7-8371-b47e9019bd25,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_05-MS1_06,0.4000000059604645,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,b22c9299-5fb4-46a7-b566-fc17e0d51d60,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -22d61b21-2a7d-4be8-b14b-f0d72e1c5ba7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(12)-NS_NET126_F4_(13),0.039000000804662704,6a4547a8-630b-46e4-8144-9cd649e67c07,da79c960-d35a-4193-9b06-2d4d57051706,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -6bbccaac-2bbe-4d0b-bb07-80dbb605ec1c,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(20)-NS_NET126_F2_(21),0.02500000037252903,de756ddb-793d-4b2d-959c-59d938a8f61f,1dee13af-e638-4858-9c69-0069190cd577,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -0ffacffd-4f3f-465b-8525-bc22facc45da,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_2-NS_NET136_S3_3,0.029999999329447746,b46d4395-6724-4830-ba55-357e81fc2814,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -93cd3af7-2dbb-4804-9386-d15705b5f18e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(31)-NS_NET146_F3_(32),0.026000000536441803,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,fd3b7bb8-3976-4441-9211-745243afd80f,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -f606c03b-66d1-4765-97e6-1319ad6ac0c3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_2-NS_NET136_S1_3,0.029999999329447746,032768b4-2426-4abf-806b-83813ac5137a,eb95ff15-56db-4463-bb54-0ee131167812,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -f4ca1fb7-d17a-4d51-866d-ea2ae22c6f0c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(27)-NS_NET126_F2_(28),0.027000000700354576,daed3552-e382-4153-95be-97f17e2c53e5,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -8cc7bf8e-226d-41c9-9cd0-7524ea9186f7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(1)-NS_NET146_F1_(2),0.023000000044703484,4f28e734-5148-4caf-ac64-270231740cbf,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -7056d4fa-aa01-47d4-af86-5c9717345607,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(31)-NS_NET126_F1_(30),0.019999999552965164,80d8252b-045f-471a-9638-416ed3f86120,519ace7e-fd3f-4797-b14b-36c1694b00cd,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -0d6a5b4a-db92-4772-a91c-4e18ff35c0be,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(35)-NS_NET126_F1_(34),0.054999999701976776,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -c23b7659-8e54-410a-b0e9-9eccbe2457dc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(9)-NS_NET126_F1_(8),0.026000000536441803,5dfd45b8-48e7-42fd-ac53-cc57455486b5,f717b05b-f4e7-43d9-af9e-638e2badee5a,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -814dec01-f6f2-4817-8f83-2e758011b033,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_ONS-NS_NET116_S1_1,0.029999999329447746,31a2b9bf-e785-4475-aa44-1c34646e8c79,8a50fb37-81cf-47c9-8850-a12b4391e2e7,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -088e3b53-78f3-445a-bbc6-9da3efbda0a3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(1)-NS_NET126_ONS,0.02199999988079071,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -a5106b6a-42b2-42d0-b5b3-a4656541abfa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(19)-NS_NET126_F2_(20),0.019999999552965164,52e15712-2572-442a-b22c-add48af95115,de756ddb-793d-4b2d-959c-59d938a8f61f,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -bee47575-ecc8-4f2f-96de-e9a616603bb7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(15)-NS_NET126_F4_(14),0.08399999886751175,55b3d03f-2204-4ab3-84cc-a28476868c9d,d40a1a85-40f2-4ad3-ba58-720d5ba02268,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -94071ac7-ae51-4e45-8795-9d10bda616e9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_03-MS1_04,6.0,787237ad-b3a8-4f2c-ab70-31c5113d82d7,1396cb4c-cee7-4116-97c9-290f98785719,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -b11ce01e-37ce-4ea7-b3a3-4db89820fde1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(28)-NS_NET126_F1_(27),0.029999999329447746,0c266541-6235-4d01-8258-e763c58af6c7,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -cba98774-b8c6-45f4-84cc-2fde121a77fa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_1-NS_NET116_S3_2,0.029999999329447746,4a6f6058-e654-464d-9367-2dca7185c6d7,550ebca7-1455-44eb-9431-ffbf08e58bd4,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -a4792ce6-c652-43e9-9156-5e9d0aa082c2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_ONS-NS_NET136_S2_1,0.029999999329447746,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -82e01986-321d-4f21-8453-60220f97bbb1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(4)-NS_NET146_F1_(5),0.02800000086426735,dd9d4153-c56f-4457-ad5e-46a48d4486b6,bd8c7d3d-e830-4a46-bf78-0086ce24909f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -5ff3f25d-ef1d-4ba2-ba1e-b387965a839a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(11)-NS_NET126_F1_(12),0.01899999938905239,270c7266-45dc-4e45-829f-c04f6b631cad,9d10a92f-576d-4777-99ff-59d145924fea,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -87cd1ae0-2ac4-46fb-aeb8-b2f710da299b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(16)-NS_NET146_F2_(17),0.024000000208616257,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,40537c84-c812-4231-bd23-0ba81922e937,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -17e2286d-65ca-4948-8a6c-63bdc13a9b50,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_ONS-NS_NET146_F4_(1),0.04500000178813934,3da4fd3d-ac5e-409d-91fa-36516673cf57,ead38a50-b8f7-4bbb-b65d-f54350825e8e,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -7bc8b609-baba-4afe-8cec-866d74e91e43,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(8)-NS_NET146_F3_(9),0.01899999938905239,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,6570535c-0d2e-4846-9951-21559902f67a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -e3b38aa2-dd38-445e-86c4-600331d108d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(18)-NS_NET126_F3_(19),0.03099999949336052,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,922a6375-b97c-412e-a6c9-b0ea55a23f76,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -76d82f19-65d7-447d-a14c-95d050139fa5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(2)-NS_NET146_F1_(3),0.027000000700354576,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -affde1a2-90e8-468f-a0a9-eb024f791857,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_ONS-NS_NET126_F4_(1),0.04500000178813934,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -031633ca-bd50-401e-9159-d2258ce6309c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(5)-NS_NET126_F4_(6),0.05400000140070915,de5ee252-ebb6-42b0-875c-77ae557ffbf6,e3a40690-d085-4796-9fcb-48d776e58594,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -ca765f8e-2a05-40fb-80b8-41e02887fa46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(19)-NS_NET146_F3_(20),0.019999999552965164,810bebb0-0d5c-4899-b213-3207be661248,0ebf0088-f596-4cd1-9ae0-5da02dc40335,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -f2c9a881-eb41-4628-833c-5258e95ec457,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(39)-NS_NET146_F1_(38),0.03200000151991844,904c7476-5f16-4ec2-9138-7d5e32d38a3b,32507a10-1eed-4a3f-820c-bc187f3b052e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -cd994d2f-b62e-4ab9-8f4c-e5357fd04af7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(22)-NS_NET126_F3_(23),0.02500000037252903,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -0b1f06c3-9622-47cd-b41f-bd0314673b8d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(10)-NS_NET126_F3_(11),0.026000000536441803,e25387d0-ab9a-406d-bcb4-555414b88b1b,4258f215-5b22-446f-a260-e8cdaa7c95d1,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -2c6d3986-9cf2-4c41-9a40-400e4e0b3112,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(26)-NS_NET146_F2_(27),0.02800000086426735,86af5351-87ef-49c6-bd17-673dceecee5b,b179c38b-5af0-4304-84b1-1dc03314fd80,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -52df9c70-136a-49bb-9ad4-d300123c7e99,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_02-MS3_03,0.5,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,e4502c52-b4d7-4082-a583-b5688d8244e0,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -6f875559-5af0-47a9-9f0e-f1d8332f9230,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(30)-NS_NET146_F1_(29),0.029999999329447746,9f95c733-71e2-4bf0-a27a-70144518ea2c,867c4b4d-0f38-4f28-82ce-135f2cc63808,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -8885b761-4c1a-4924-be8a-b8f474d8f629,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_01-MS3_02,2.0,bb59ca46-1f2e-41c9-9723-90b306f043cd,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -b140dccb-7251-496b-9402-06ebd13048c2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(24)-NS_NET126_F1_(25),0.02800000086426735,4f2402e8-664a-40f2-970a-abc098a2a0d1,3a2f199c-2966-4b9a-939b-3a6c9924341c,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -dcf3c182-18bd-4536-b11f-960c52c3b36e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(25)-NS_NET126_F3_(26),0.026000000536441803,1bf26b4d-03cc-4490-8c33-d3db8597d807,dc022eec-16b0-4a64-a2f5-498d81aca71e,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -10d957bc-fb58-4a8f-8fd2-96a0b129eb02,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(24)-NS_NET146_F3_(25),0.029999999329447746,773aebe4-fc03-46be-8209-0213e2760a8e,c6c177b0-5004-4db0-8cde-6293330a4757,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -6862b157-39c8-47d2-b31c-e418e1bad9a2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(24)-NS_NET146_F2_(25),0.028999999165534973,970cf93c-36c5-4938-a7e4-3f184a7035f0,011e3794-3341-4376-839c-3f5a452e15ab,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -71832b7e-b5a2-40d4-82d3-e8f1ba38ace6,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(6)-NS_NET146_F4_(7),0.03400000184774399,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -060f10e1-2ffd-4972-9ace-7fff8df78658,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(21)-NS_NET146_F2_(22),0.024000000208616257,bd292f64-65e8-42ec-9b78-b9b9f013750e,5862f526-783a-4218-a463-3cbf5de8dade,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -2c4fae2c-c565-4111-b535-8488737aa358,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(21)-NS_NET126_F2_(22),0.024000000208616257,1dee13af-e638-4858-9c69-0069190cd577,177a20fe-83b1-46df-94a3-4faa54348d10,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -ec21c844-ca32-4f95-b6f3-dd8c56128f66,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(8)-NS_NET126_F3_(9),0.01899999938905239,6dcdc87b-a719-416f-9da1-21a701048f3a,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -e8329717-1626-4c33-b60e-d83e78514014,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(11)-NS_NET146_F2_(12),0.029999999329447746,f26b5511-3c50-42d5-97c2-be408330eb84,8254d91b-e5da-4402-bb8f-301eafa09d28,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -43394be2-5c85-4449-ad06-7866395a5c79,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(3)-NS_NET146_F3_(4),0.01899999938905239,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,f66df6fa-3dfa-4515-85d7-54d0f429fde7,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -932d9fab-9b07-4948-9d65-4945c7700a72,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(19)-NS_NET146_F1_(20),0.04399999976158142,1f040625-ad1d-409f-bd7e-944c4d805e46,7d45f0ab-1e6b-452f-b665-c4846cf046f5,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -2770ee0b-96ca-4677-9933-8d82643501e3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(11)-NS_NET146_F4_(12),0.05000000074505806,8b3e3802-5213-46d0-a498-15eb6e5852b5,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -ec4d2395-23de-41c7-a366-af36aed1bf44,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(4)-NS_NET146_F3_(5),0.017999999225139618,f66df6fa-3dfa-4515-85d7-54d0f429fde7,ce71377d-63ea-462a-9290-67e51946a098,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -7d9647cb-e7ca-4ecc-a79e-edb1bfbfb666,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(1)-NS_NET126_F3_(2),0.023000000044703484,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,285a4caa-2da8-4bd2-8a60-7d04f168f378,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -71c56dc9-d957-4746-872f-8ad07d4ef8a4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(22)-NS_NET126_F1_(23),0.027000000700354576,c317a6cd-428b-4c36-8233-91d0c4e2717a,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -0a068504-0bd7-4484-a0e3-26afade14698,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_03-MS2_04,6.0,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,5f1c776c-6935-40f7-ba9e-60646e08992b,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -ce8ea248-dbcb-40b9-a97d-22452032ad27,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(11)-NS_NET146_F3_(12),0.019999999552965164,e2267696-669b-48e8-b43a-37d0db95011d,f6eff0d1-af6b-46ce-b430-4d30976ec08f,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -66dbe72e-f2be-430d-b103-c1a84f8211a4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(14)-NS_NET126_F3_(15),0.029999999329447746,df8df8d2-3494-4da9-8d1b-f913d15f520f,ae234bc5-b751-41f2-95ee-b78de124c583,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -364ffff6-7541-4324-bbcf-fe626ba9de1d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(14)-NS_NET126_F2_(15),0.03200000151991844,9ce9d92c-5583-4b16-bec6-9f67834663cb,2645e336-b0df-4d1e-a0ea-375444488f06,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -cfd11fa8-fcf6-4b65-9523-ee5d21e292ed,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(6)-NS_NET126_F2_(7),0.020999999716877937,9d7038e9-5bcc-4676-bead-46c4f1291ba8,4db634e5-3eb8-4c17-bc44-eb224667580c,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -3e7e4741-502d-4c8f-bad5-e0c5c6f69958,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(10)-NS_NET126_F1_(11),0.027000000700354576,f6a31362-8b0d-4926-b0d0-10bb61db20df,270c7266-45dc-4e45-829f-c04f6b631cad,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -62c21e1e-f353-4e48-bca6-8a4da341971e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(21)-NS_NET146_F1_(22),0.03200000151991844,92cb5065-2e57-4099-8e29-75cbc0c80370,1ee9de9a-0095-4b58-beeb-e56fb908844a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -836bf4ab-38e1-44f5-a082-723fc12e4845,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(1)-NS_NET146_F3_(2),0.023000000044703484,22e58399-428f-4633-9ee4-e5fa0db68d6d,0b2a3b46-5e43-4879-973e-d8fb96429d8a,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -368c8108-0953-4e5a-90db-7c57a9057b20,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(22)-NS_NET146_F1_(23),0.027000000700354576,1ee9de9a-0095-4b58-beeb-e56fb908844a,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -87a41d29-ad67-4bd6-a5b7-9d1414b38c6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(3)-NS_NET146_F1_(4),0.019999999552965164,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,dd9d4153-c56f-4457-ad5e-46a48d4486b6,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -f6dfa796-69c1-4deb-8e5d-78d6a29f2b6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(2)-NS_NET126_F2_(1),0.028999999165534973,5981fe65-3c92-4a78-af92-1461904046d0,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -2cbfd089-e602-4f64-8a5b-86a6ecc56d32,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_04-MS3_05,0.800000011920929,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,86dfce49-05b2-4208-a6ae-877c3e98e6be,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -73359dab-e8bb-4cea-89e6-88b969ecb4e0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_05-MS2_06,0.4000000059604645,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,df97c0d1-379b-417a-a473-8e7fe37da99d,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -1bb0764a-82b8-4f4c-8208-c9c58b8b92c0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_02-MS1_03,0.5,32b3bb19-c52a-4a19-890a-94a8918d38a9,787237ad-b3a8-4f2c-ab70-31c5113d82d7,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -9039f436-9be6-4c74-86b2-b5add2446d0a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_04-MS4_05,0.800000011920929,890f2162-b4cb-49e7-a16f-4b552c5e245c,ee384ace-040e-4f21-8a8a-d702ab51af55,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 -7614ed07-f464-4a56-8ea2-cf07772530c4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(2)-NS_NET146_F3_(3),0.028999999165534973,0b2a3b46-5e43-4879-973e-d8fb96429d8a,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -56e0ddce-ad67-435e-ad8c-5e276c13018a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_ONS-NS_NET136_S1_1,0.029999999329447746,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,535b3fa4-ed67-4ab1-9a68-e7db83e05967,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -09fdfecb-1ea0-4b99-a7bd-caad84afe160,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(7)-NS_NET126_F1_(8),0.01899999938905239,fc7821d2-ac64-483e-b520-38d9971f4db0,f717b05b-f4e7-43d9-af9e-638e2badee5a,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -1c23e300-0ad5-4b90-ac74-b9763e579268,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_06-MS4_07,6.0,fa6d5184-b205-4b1b-839f-7b21ac956c29,898d8295-bf35-4079-9374-99b059c2c956,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -fe19ff1f-8ea4-4ffe-881b-ad8d57c4561a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(6)-NS_NET126_F3_(7),0.028999999165534973,e018b95e-fca5-40f7-8550-b05a619169dc,50164699-2018-4b17-b3f1-74b082f27403,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -58105b87-e27d-4d7f-b492-42434801bdf7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(17)-NS_NET146_F1_(18),0.02500000037252903,0d94a5ea-3a13-48ba-a27f-b2903841c334,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -1cfc85dd-3fb8-48a3-9ea1-b11b1b9ca8d4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(7)-NS_NET146_F4_(8),0.041999999433755875,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -1a56ec37-3781-4f35-aeec-0d0341c63372,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(25)-NS_NET126_F2_(26),0.02199999988079071,1dcddd06-f41a-405b-9686-7f7942852196,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -63be5ffd-acbc-4c4f-aab9-54c616e2dd2e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(9)-NS_NET126_F4_(10),0.032999999821186066,119d270a-ff22-4fdb-8214-cb5b336790bf,857c264a-7072-4bb7-af56-2f01539b2a2e,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -230eae02-e233-4975-9cbb-268d0af4a492,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(4)-NS_NET126_F1_(5),0.02800000086426735,ff947647-b551-41ae-bcfd-6af228250c96,eb21d716-1b54-4dba-bdc2-d1f6752aef85,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -9d2b065a-9098-447d-8dbe-5eb06cc691a2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(15)-NS_NET146_F4_(16),0.04800000041723251,576840db-7d3c-417b-b587-28b222e740e1,9f7599de-c488-46c5-b053-1279a511f7b9,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -84f3941b-450c-4acb-8150-c788af1e6546,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(8)-NS_NET126_F4_(9),0.0430000014603138,75f2dfb9-75a0-496d-9c44-79e7df54c1df,119d270a-ff22-4fdb-8214-cb5b336790bf,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -8f9d19a8-8d64-4f62-b6aa-f5f01a12b566,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(2)-NS_NET126_F2_(3),0.01899999938905239,5981fe65-3c92-4a78-af92-1461904046d0,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -f93f5e08-f351-4b2b-8cb0-9ec01203c1b9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(28)-NS_NET146_F1_(27),0.029999999329447746,012c9eee-86c2-494c-adcc-bbfc481e4a46,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,"olm:{(0.00,1.00)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be -08d39ce3-e843-49bd-9b46-1fe927a1d4be,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(17)-NS_NET126_F2_(18),0.023000000044703484,c5457e35-ad81-4427-9d3a-99e4c44ccae8,e80aa2db-f32c-410d-96a1-a32e03222568,"olm:{(0.00,1.00)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 -997840bf-8c94-444f-83f1-e9c991706d7c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_1-HS_NET1_Station_2,24.0,00d03670-7833-47ee-ad52-04d18d1c64fd,dfae9806-9b44-4995-ba27-d66d8e4a43e0,"olm:{(0.00,1.00)}",,,,1,c940e435-0523-419a-90bc-f3dbf2e463f7 -ddc63e7d-e76a-489b-a05f-97e7dee40794,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(12)-NS_NET146_F2_(13),0.02800000086426735,8254d91b-e5da-4402-bb8f-301eafa09d28,49e14db3-a4bc-464a-b606-653ac8a604dd,"olm:{(0.00,1.00)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 -fd04cc09-6ff8-48ea-a5eb-453e9d59d6d7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_1-HS_NET1_Station_3,40.0,00d03670-7833-47ee-ad52-04d18d1c64fd,33f29587-f63e-45b7-960b-037bda37a3cb,"olm:{(0.00,1.00)}",,,,1,d0f81106-444d-4832-ad0b-a293d719206a -a78fbab6-e680-4c45-9731-97c82f2fb3c8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_05-MS3_06,0.4000000059604645,86dfce49-05b2-4208-a6ae-877c3e98e6be,39dbc5ed-d874-48a8-9128-e970436a94b4,"olm:{(0.00,1.00)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 -42828cac-b67e-4d5c-b4fa-787c57f16fde,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_3-HS_NET1_Station_2,20.0,33f29587-f63e-45b7-960b-037bda37a3cb,dfae9806-9b44-4995-ba27-d66d8e4a43e0,"olm:{(0.00,1.00)}",,,,1,9ac19e4c-0379-4aaf-a96a-b2e71462abb3 -ebd1f65a-65ae-4620-b1cf-79898683c9e1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_06-MS2_07,6.0,df97c0d1-379b-417a-a473-8e7fe37da99d,14a8dc4c-0906-402f-b073-6d6d4725d0cb,"olm:{(0.00,1.00)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 \ No newline at end of file +5763fe56-89a4-4407-ba41-c1a528dd50a0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(23)-NS_NET146_F1_(24),0.05000000074505806,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,205fcee1-928c-4374-950c-34575f07fa49,"olm:{(0.0,1.0)}",,,,1,fa07a917-4d21-4e0b-abc4-527420509063 +97b9a53e-9ff2-4567-95c0-6c9aab07a43f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(21)-NS_NET146_F3_(22),0.027000000700354576,a4a44d93-48d6-4b87-8053-87fe0778e75c,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,"olm:{(0.0,1.0)}",,,,1,a61bace6-0050-436a-8715-0e042a8582f6 +2ea48cfa-0a0b-48f0-aa66-b619c35b9929,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(14)-NS_NET146_F3_(15),0.029999999329447746,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,"olm:{(0.0,1.0)}",,,,1,12ccc9e0-9987-4c1c-b176-84574ab2d262 +412d395e-7ebc-4cc6-88fb-24006f54c931,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(12)-NS_NET146_F4_(13),0.039000000804662704,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,b608d71e-3ede-4156-a015-3f6e1d22242a,"olm:{(0.0,1.0)}",,,,1,44f95594-319f-47ba-9df2-5d9833e47408 +1a56ec37-3781-4f35-aeec-0d0341c63372,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(25)-NS_NET126_F2_(26),0.02199999988079071,1dcddd06-f41a-405b-9686-7f7942852196,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,"olm:{(0.0,1.0)}",,,,1,6a818827-ddba-4916-ab33-2c326d3c5745 +d9d1edce-43e0-4cbd-9801-4a4e1a1dfa71,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(17)-NS_NET146_F2_(18),0.023000000044703484,40537c84-c812-4231-bd23-0ba81922e937,21359dd1-7a23-4932-b656-c196fbffe751,"olm:{(0.0,1.0)}",,,,1,1a77afda-35bc-4902-a32e-a3a8f3d1a88a +6f875559-5af0-47a9-9f0e-f1d8332f9230,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(30)-NS_NET146_F1_(29),0.029999999329447746,9f95c733-71e2-4bf0-a27a-70144518ea2c,867c4b4d-0f38-4f28-82ce-135f2cc63808,"olm:{(0.0,1.0)}",,,,1,9987d3ab-2135-4c6d-bb7b-209659ab9356 +eb64f0fb-1810-4b49-b0a6-e94a6422be04,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(1)-NS_NET126_ONS,0.03099999949336052,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"olm:{(0.0,1.0)}",,,,1,29a0785e-569d-4941-b7a3-9f4710dcb749 +5905e32c-b1d7-40d9-9759-84dbe6b14ba8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(22)-NS_NET146_F2_(23),0.027000000700354576,5862f526-783a-4218-a463-3cbf5de8dade,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,"olm:{(0.0,1.0)}",,,,1,ba85a896-08d3-4b95-8a21-1c06f29513e4 +764eccc0-09cc-4c7a-bf76-33259938530c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(9)-NS_NET146_F2_(10),0.017999999225139618,a5c73608-5a85-495d-bea0-df77b6ce66ea,41414318-73e3-4bdc-8147-570a96b28d37,"olm:{(0.0,1.0)}",,,,1,a61d2b6a-2ae3-4e87-b69c-d6ef03746edb +73359dab-e8bb-4cea-89e6-88b969ecb4e0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_05-MS2_06,0.4000000059604645,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,df97c0d1-379b-417a-a473-8e7fe37da99d,"olm:{(0.0,1.0)}",,,,1,dffa0c85-3ad7-4cae-b3f4-48bc41826b84 +1cf0cb95-28b9-4dc1-82b9-3466d7d870cc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(25)-NS_NET146_F3_(26),0.026000000536441803,c6c177b0-5004-4db0-8cde-6293330a4757,bd288184-99d8-4233-bb3d-484f3922200a,"olm:{(0.0,1.0)}",,,,1,f181cb5c-2234-49d5-9e3f-d21f14963074 +9085189c-48df-498a-80e5-49fe54692a66,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_1-NS_NET136_S3_2,0.029999999329447746,416fa5eb-2f72-46c3-978f-6a0ebb714a40,b46d4395-6724-4830-ba55-357e81fc2814,"olm:{(0.0,1.0)}",,,,1,cbe6053c-f1fc-46e4-8c47-1291d84083ba +43394be2-5c85-4449-ad06-7866395a5c79,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(3)-NS_NET146_F3_(4),0.01899999938905239,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,f66df6fa-3dfa-4515-85d7-54d0f429fde7,"olm:{(0.0,1.0)}",,,,1,2f625e1a-ff4b-4379-bd79-e309d5841ffb +7b7ac3b3-877f-4cba-8ad4-6171f2c5b83c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(2)-NS_NET126_F1_(3),0.027000000700354576,a7ebd30b-b843-405f-9fae-ca6b489601f9,04f29760-9e52-4943-8563-62e1fbd5ed52,"olm:{(0.0,1.0)}",,,,1,612f81f3-5f7f-45c7-ad13-f729ef2ee07d +fd04cc09-6ff8-48ea-a5eb-453e9d59d6d7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_1-HS_NET1_Station_3,40.0,00d03670-7833-47ee-ad52-04d18d1c64fd,33f29587-f63e-45b7-960b-037bda37a3cb,"olm:{(0.0,1.0)}",,,,1,d0f81106-444d-4832-ad0b-a293d719206a +ab23d369-ff75-41b4-8a25-25ec9c4320aa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(17)-NS_NET146_F3_(18),0.020999999716877937,0f3ba59d-a9ce-4669-aa12-bebec42238b7,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,"olm:{(0.0,1.0)}",,,,1,7eb50926-f5b2-4fc4-b293-c679eaf19f65 +784bfe2a-8d23-4e74-8b05-b13141611186,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(20)-NS_NET146_F3_(21),0.020999999716877937,0ebf0088-f596-4cd1-9ae0-5da02dc40335,a4a44d93-48d6-4b87-8053-87fe0778e75c,"olm:{(0.0,1.0)}",,,,1,9a3869ee-c4b1-4b3a-89ce-02d79a2cf4ad +b11ce01e-37ce-4ea7-b3a3-4db89820fde1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(28)-NS_NET126_F1_(27),0.029999999329447746,0c266541-6235-4d01-8258-e763c58af6c7,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,"olm:{(0.0,1.0)}",,,,1,28ff8422-4924-4669-8352-2d5fd68a084c +5157574f-5e67-4574-81a3-686b97a893ff,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(33)-NS_NET126_F1_(32),0.028999999165534973,b425b28e-48a8-4ec4-a15a-387fcfb79895,49b511fa-8cff-45f4-9a59-54faaaf90abf,"olm:{(0.0,1.0)}",,,,1,138c7831-202a-4f00-9a5f-8c205a810816 +364ffff6-7541-4324-bbcf-fe626ba9de1d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(14)-NS_NET126_F2_(15),0.03200000151991844,9ce9d92c-5583-4b16-bec6-9f67834663cb,2645e336-b0df-4d1e-a0ea-375444488f06,"olm:{(0.0,1.0)}",,,,1,ca622ca6-25e3-4ddc-9516-99e2376ded1d +d7c951cc-2e8f-40d0-b310-03fbdb9b0558,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(8)-NS_NET126_F2_(9),0.02800000086426735,366a70fb-8d7f-4201-9eca-0fcbc839239d,a286f73a-20ee-4056-8129-c7963b34ecd9,"olm:{(0.0,1.0)}",,,,1,c27513a1-3d09-4f03-9fdd-cdf15cb83dfb +932d9fab-9b07-4948-9d65-4945c7700a72,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(19)-NS_NET146_F1_(20),0.04399999976158142,1f040625-ad1d-409f-bd7e-944c4d805e46,7d45f0ab-1e6b-452f-b665-c4846cf046f5,"olm:{(0.0,1.0)}",,,,1,97a2a008-5c56-41d4-bef2-f1af45f2925b +031633ca-bd50-401e-9159-d2258ce6309c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(5)-NS_NET126_F4_(6),0.05400000140070915,de5ee252-ebb6-42b0-875c-77ae557ffbf6,e3a40690-d085-4796-9fcb-48d776e58594,"olm:{(0.0,1.0)}",,,,1,6fefbb49-0419-447c-9431-657cb0dc29fe +2497455a-888c-4ac6-aa49-582ab91fd05e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(35)-NS_NET146_F1_(32),0.028999999165534973,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,033d0230-4aee-47cf-91f9-81f5f40e60b0,"olm:{(0.0,1.0)}",,,,1,6daeb4b5-b137-4ed4-8bac-f6193d5daf33 +1a1550cf-77b8-40a9-90e5-5d0faef7baaa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(12)-NS_NET146_F1_(13),0.02199999988079071,3b879239-20c8-4adf-bd51-92924327ee71,f1e55c8b-357f-45a7-9d57-e299f9b207f3,"olm:{(0.0,1.0)}",,,,1,7482222e-f925-4004-abdd-0b69ef453d8d +7fa87646-f182-4d67-9ffd-850f489fb24a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(26)-NS_NET146_F3_(27),0.026000000536441803,bd288184-99d8-4233-bb3d-484f3922200a,55caf2ec-a21b-4afd-8830-1e4009cce396,"olm:{(0.0,1.0)}",,,,1,c9444107-2d82-4591-a80e-eacc5bea633f +13ea7170-5fc1-4ed8-be71-0a91a9e5df99,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(16)-NS_NET146_F3_(17),0.029999999329447746,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,0f3ba59d-a9ce-4669-aa12-bebec42238b7,"olm:{(0.0,1.0)}",,,,1,37b03eb6-ef0f-48c2-ba36-e1a5ed1747b4 +f4ca1fb7-d17a-4d51-866d-ea2ae22c6f0c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(27)-NS_NET126_F2_(28),0.027000000700354576,daed3552-e382-4153-95be-97f17e2c53e5,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,"olm:{(0.0,1.0)}",,,,1,7445744d-21dd-46ad-805b-1d8b8a470294 +00a3c4ab-e866-42a9-854f-fbf28c7f6a43,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(14)-NS_NET146_F2_(15),0.03200000151991844,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,d82fae59-844a-4c85-997e-326dd876137c,"olm:{(0.0,1.0)}",,,,1,103e89f7-9c1d-459d-abb8-cf964570340a +b5c255b5-8572-41ce-a273-a01d2a4b4e20,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(11)-NS_NET126_F4_(12),0.05000000074505806,95ced3b5-69fd-4171-9c34-f18802064e22,6a4547a8-630b-46e4-8144-9cd649e67c07,"olm:{(0.0,1.0)}",,,,1,86828e8b-9ff2-4bb6-8a32-f291c397acea +21dc5686-67b6-49dc-b5aa-ecc7f7deb620,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(2)-NS_NET146_F2_(3),0.01899999938905239,69efeb2d-9845-49ac-8500-5e017a7a64ef,0170837a-1876-45f9-a613-666f9991964d,"olm:{(0.0,1.0)}",,,,1,899d2b91-69bc-46fb-a4bb-0b97c7c8751a +a8b86d8f-a196-4eca-b248-66bc8918f9e6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(14)-NS_NET146_F1_(15),0.03200000151991844,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,00bbc353-d47e-4865-a696-fe5d29b9e6a2,"olm:{(0.0,1.0)}",,,,1,1dd89c18-1436-4212-a053-5c6435368da5 +4cfd425d-6158-4904-86b5-d16dc47a4778,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(6)-NS_NET146_F3_(7),0.028999999165534973,01bdd8b2-145f-42b3-80e3-a2366dea1044,f1e88392-3b2a-4ce8-a31f-c963f08f8043,"olm:{(0.0,1.0)}",,,,1,abbe9d99-e6b5-4958-9637-b3a36e3283ce +368c8108-0953-4e5a-90db-7c57a9057b20,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(22)-NS_NET146_F1_(23),0.027000000700354576,1ee9de9a-0095-4b58-beeb-e56fb908844a,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,"olm:{(0.0,1.0)}",,,,1,2440030d-910e-4a4b-ac70-15f09e34e23b +0a068504-0bd7-4484-a0e3-26afade14698,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_03-MS2_04,6.0,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,5f1c776c-6935-40f7-ba9e-60646e08992b,"olm:{(0.0,1.0)}",,,,1,0bfe6869-6869-438d-918c-e697955a922f +e6882165-4c20-4589-9dd5-624b10802042,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(2)-NS_NET126_F4_(1),0.07100000232458115,c7e09266-c778-433b-b01a-5fb9e298ea8e,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"olm:{(0.0,1.0)}",,,,1,f701322d-3c8f-4c18-9259-117ac854df91 +10d957bc-fb58-4a8f-8fd2-96a0b129eb02,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(24)-NS_NET146_F3_(25),0.029999999329447746,773aebe4-fc03-46be-8209-0213e2760a8e,c6c177b0-5004-4db0-8cde-6293330a4757,"olm:{(0.0,1.0)}",,,,1,91bec055-7ab3-49f0-940d-f7399bbb129e +16b934cc-98c6-42b9-9005-be4bf7365693,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_3-NS_NET136_S3_4,0.029999999329447746,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,2a816043-d1d2-44a6-8a9b-f61a4933997b,"olm:{(0.0,1.0)}",,,,1,bb9bd979-bf7e-48cb-840f-e63e85f00911 +d59a733b-b7c6-401b-8e38-653e0cb72b5c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(32)-NS_NET126_F1_(38),0.03099999949336052,49b511fa-8cff-45f4-9a59-54faaaf90abf,06b7f21a-d6d7-4ec0-94c6-141845f14986,"olm:{(0.0,1.0)}",,,,1,5050a032-62b4-4239-aa13-9672c890e74a +47cc3694-2782-4c44-8c61-e14d30dbbaa4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(14)-NS_NET126_F1_(15),0.03200000151991844,b7baa286-cbe2-4143-a08f-4e025af47529,41c0087f-ce27-4da3-97d2-92d711b639b4,"olm:{(0.0,1.0)}",,,,1,6eae5d86-3269-4d7c-aca6-150008d85eb2 +9af99daa-1e1e-45a8-bbed-c77e47ba4f8a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(23)-NS_NET146_F2_(24),0.02800000086426735,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,970cf93c-36c5-4938-a7e4-3f184a7035f0,"olm:{(0.0,1.0)}",,,,1,e5d110d3-321b-4726-bc51-e265f83891df +1372ca57-8429-43c6-a589-a402de4ac7f9,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(3)-NS_NET126_F3_(4),0.01899999938905239,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,bf7e7268-2fb6-4948-ace6-9037ae148fa3,"olm:{(0.0,1.0)}",,,,1,63a743b3-b45e-4862-b571-b4448545fb21 +7056d4fa-aa01-47d4-af86-5c9717345607,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(31)-NS_NET126_F1_(30),0.019999999552965164,80d8252b-045f-471a-9638-416ed3f86120,519ace7e-fd3f-4797-b14b-36c1694b00cd,"olm:{(0.0,1.0)}",,,,1,ce8ff61c-97fd-441a-914a-250c0dc80ed2 +0b1f06c3-9622-47cd-b41f-bd0314673b8d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(10)-NS_NET126_F3_(11),0.026000000536441803,e25387d0-ab9a-406d-bcb4-555414b88b1b,4258f215-5b22-446f-a260-e8cdaa7c95d1,"olm:{(0.0,1.0)}",,,,1,c6ec6f58-dae8-4dcc-b486-d0ba6df880c6 +ddc03ccc-bd8e-47f3-8183-97f3b039219d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(15)-NS_NET126_F3_(16),0.020999999716877937,ae234bc5-b751-41f2-95ee-b78de124c583,6232b760-b2e0-485e-9c61-f9721a366a81,"olm:{(0.0,1.0)}",,,,1,f2a9246c-1d44-4903-b6a1-f038b786c01b +d8d23da6-be08-4ace-8d93-70c0faab1505,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(4)-NS_NET126_F4_(5),0.05999999865889549,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,de5ee252-ebb6-42b0-875c-77ae557ffbf6,"olm:{(0.0,1.0)}",,,,1,9989a72f-2587-4a15-804e-e81d9af7ee93 +a9a94bc3-fa83-410a-9e71-38807e8d121c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(16)-NS_NET146_F1_(17),0.03200000151991844,09ac8949-2b79-41d7-b56f-a58f20036df2,0d94a5ea-3a13-48ba-a27f-b2903841c334,"olm:{(0.0,1.0)}",,,,1,0ae22511-6661-4a9c-a3b4-62e28f0c6301 +d97f2684-22cb-4c14-b01c-b95081d4d624,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(29)-NS_NET146_F1_(28),0.02500000037252903,867c4b4d-0f38-4f28-82ce-135f2cc63808,012c9eee-86c2-494c-adcc-bbfc481e4a46,"olm:{(0.0,1.0)}",,,,1,184d5283-e90b-4ad1-9a28-51f09df26312 +442c4813-6272-4cf9-b30b-22f9114bc3db,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(26)-NS_NET126_F3_(27),0.026000000536441803,dc022eec-16b0-4a64-a2f5-498d81aca71e,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,"olm:{(0.0,1.0)}",,,,1,a2f51a3d-5e1e-41cd-8be6-696ac1a12d52 +64bd5e0e-cf5a-469f-a427-113b0e16893d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_02-MS2_03,0.5,535843a3-cf93-412f-b4d7-585337791ba8,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,"olm:{(0.0,1.0)}",,,,1,1846cb8f-2d1f-48ec-a73c-9f9a8392bf1f +7df282f5-2e54-4220-8276-087634415be8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(36)-NS_NET126_F1_(35),0.028999999165534973,ca3391eb-ca94-4945-ac72-e116f396f82c,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,"olm:{(0.0,1.0)}",,,,1,0250b2f4-4cbf-449f-87ef-b90dc451673e +8885b761-4c1a-4924-be8a-b8f474d8f629,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_01-MS3_02,2.0,bb59ca46-1f2e-41c9-9723-90b306f043cd,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,"olm:{(0.0,1.0)}",,,,1,54a5e86e-8535-427e-b07b-638ba00913a5 +80332374-76fe-4d06-adde-e2197f88fe6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(13)-NS_NET146_F4_(14),0.07999999821186066,b608d71e-3ede-4156-a015-3f6e1d22242a,f2d03b34-9595-4819-a00b-ff9ddd92eb07,"olm:{(0.0,1.0)}",,,,1,342054c6-c0dc-4b03-b914-6bdc69c17d1b +0c04a652-1076-4b59-a957-652790b4c963,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(38)-NS_NET126_F1_(39),0.027000000700354576,06b7f21a-d6d7-4ec0-94c6-141845f14986,60173008-809d-4d8f-b06a-3c4a838dd989,"olm:{(0.0,1.0)}",,,,1,9b5784f1-0ae5-4692-9deb-3d74743f59e0 +2c6d3986-9cf2-4c41-9a40-400e4e0b3112,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(26)-NS_NET146_F2_(27),0.02800000086426735,86af5351-87ef-49c6-bd17-673dceecee5b,b179c38b-5af0-4304-84b1-1dc03314fd80,"olm:{(0.0,1.0)}",,,,1,7e6f9030-73ff-4fcb-a384-f71820af1a41 +60c4970b-636a-4f8a-9329-97d01107a962,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_04-MS1_05,0.800000011920929,1396cb4c-cee7-4116-97c9-290f98785719,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,"olm:{(0.0,1.0)}",,,,1,71bc51af-be08-413f-8165-90822ffef011 +cadd7ca5-2b70-4bcc-83d0-867df8b6d0a3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(29)-NS_NET146_F3_(30),0.028999999165534973,15345698-c319-461f-b969-37d50fb84220,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,"olm:{(0.0,1.0)}",,,,1,5806cf0a-5c5c-44ec-ac36-83a0030fb9dc +24537b9f-9cb9-45d1-8bbb-f87e3a948a69,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(10)-NS_NET146_F3_(11),0.026000000536441803,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,e2267696-669b-48e8-b43a-37d0db95011d,"olm:{(0.0,1.0)}",,,,1,d5addbe0-2d36-489a-8552-b3a0e66aa5b8 +63be5ffd-acbc-4c4f-aab9-54c616e2dd2e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(9)-NS_NET126_F4_(10),0.032999999821186066,119d270a-ff22-4fdb-8214-cb5b336790bf,857c264a-7072-4bb7-af56-2f01539b2a2e,"olm:{(0.0,1.0)}",,,,1,a4aab125-8af4-4ef9-8842-4cf718f998bc +84dcef6e-d5b1-436f-8562-369b2489bb10,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(34)-NS_NET126_F1_(33),0.019999999552965164,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,b425b28e-48a8-4ec4-a15a-387fcfb79895,"olm:{(0.0,1.0)}",,,,1,ce61ee4b-0244-416f-b3e0-80577b58781c +83b12a0c-d66f-43cf-a5c1-1945a8a66c4c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(27)-NS_NET146_F2_(28),0.027000000700354576,b179c38b-5af0-4304-84b1-1dc03314fd80,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,"olm:{(0.0,1.0)}",,,,1,caf07358-b134-46ae-a7f4-7c64d06ab25b +bdf60fc2-e400-46f6-b873-7a40663106f3,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(6)-NS_NET126_F4_(7),0.03400000184774399,e3a40690-d085-4796-9fcb-48d776e58594,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,"olm:{(0.0,1.0)}",,,,1,c2618b8d-df63-4bc1-8eab-3ce2fd74e183 +184c0d91-3f4b-4816-a82d-519e4bcd7ee9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_4-NS_NET136_S1_5,0.029999999329447746,ed4697fd-016c-40c2-a66b-e793878dadea,926d6113-933f-49e3-9529-a3035acdc9b2,"olm:{(0.0,1.0)}",,,,1,bdcb3549-eb2e-4903-8f0d-cf6a2166c09f +5fa6e010-393e-4bd2-a874-56eb784f9741,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(5)-NS_NET146_F4_(6),0.05400000140070915,d7023c15-adb7-4d56-9f86-b182611a47ef,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,"olm:{(0.0,1.0)}",,,,1,7895fb66-d867-4e4a-bab9-ce5165207321 +a4dc31e8-e10a-4b42-90b4-f14d0f133c0c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(12)-NS_NET126_F2_(13),0.02800000086426735,9d02ea80-98d8-4cd0-a635-9104a14a56dd,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,"olm:{(0.0,1.0)}",,,,1,6d8c33a0-9d13-40fb-a8ed-66f653461521 +a102f0f4-e86d-438c-95a9-d3fc6357121f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(4)-NS_NET146_F4_(5),0.05999999865889549,00d4a837-f09c-41df-bed1-dfdb78387116,d7023c15-adb7-4d56-9f86-b182611a47ef,"olm:{(0.0,1.0)}",,,,1,fe7f2726-e60e-4111-9577-61f332eebf2e +147bf31b-f9b1-415f-858b-f3ed430e508d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(18)-NS_NET146_F2_(19),0.028999999165534973,21359dd1-7a23-4932-b656-c196fbffe751,636dec7c-4242-46e8-b7ae-db7e5a28c39c,"olm:{(0.0,1.0)}",,,,1,c4caf964-fe70-47f4-9596-b52418ee8d39 +84f3941b-450c-4acb-8150-c788af1e6546,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(8)-NS_NET126_F4_(9),0.0430000014603138,75f2dfb9-75a0-496d-9c44-79e7df54c1df,119d270a-ff22-4fdb-8214-cb5b336790bf,"olm:{(0.0,1.0)}",,,,1,87591389-0527-4fe0-8b33-7800b89a50c6 +f395e127-6036-49bb-b06f-1a3808193dfa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(13)-NS_NET126_F4_(14),0.07999999821186066,da79c960-d35a-4193-9b06-2d4d57051706,d40a1a85-40f2-4ad3-ba58-720d5ba02268,"olm:{(0.0,1.0)}",,,,1,29538d4e-9d99-4701-b21a-0d8ee5b665de +9d2b065a-9098-447d-8dbe-5eb06cc691a2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(15)-NS_NET146_F4_(16),0.04800000041723251,576840db-7d3c-417b-b587-28b222e740e1,9f7599de-c488-46c5-b053-1279a511f7b9,"olm:{(0.0,1.0)}",,,,1,f6ac868a-f7c6-48b7-a86e-ede7100859ea +22d61b21-2a7d-4be8-b14b-f0d72e1c5ba7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(12)-NS_NET126_F4_(13),0.039000000804662704,6a4547a8-630b-46e4-8144-9cd649e67c07,da79c960-d35a-4193-9b06-2d4d57051706,"olm:{(0.0,1.0)}",,,,1,b8e2950a-6213-4502-bcd3-16a287428fbe +a5106b6a-42b2-42d0-b5b3-a4656541abfa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(19)-NS_NET126_F2_(20),0.019999999552965164,52e15712-2572-442a-b22c-add48af95115,de756ddb-793d-4b2d-959c-59d938a8f61f,"olm:{(0.0,1.0)}",,,,1,6bc2f42c-d4bb-422c-9aa8-6255d18bf010 +ebd1f65a-65ae-4620-b1cf-79898683c9e1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_06-MS2_07,6.0,df97c0d1-379b-417a-a473-8e7fe37da99d,14a8dc4c-0906-402f-b073-6d6d4725d0cb,"olm:{(0.0,1.0)}",,,,1,f265e497-3a6d-4f96-9329-a7644cd8e785 +d3d211d9-22f6-42ba-a596-0d0ca1c7e943,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(5)-NS_NET126_F2_(6),0.028999999165534973,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,9d7038e9-5bcc-4676-bead-46c4f1291ba8,"olm:{(0.0,1.0)}",,,,1,235dc9e4-7328-4386-8ca5-ce9c3202210e +73d786b9-377a-4807-9b70-21c80599a4d8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(27)-NS_NET146_F1_(9),0.03200000151991844,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,0db6e581-37e9-4254-aed8-d5cdf66819f9,"olm:{(0.0,1.0)}",,,,1,90499632-fb19-4b07-9726-8741307a2f77 +c87706ad-37ff-4419-b4bc-4607d780498e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(10)-NS_NET126_F2_(11),0.01899999938905239,3d81adf5-73d1-4708-b03b-3afc7db017f4,6678c226-c5d2-4ce3-9728-dc1163be799f,"olm:{(0.0,1.0)}",,,,1,34bcbd39-34fe-4ba4-896b-e123e597985a +5adb6634-4872-43af-b9cb-39df332b64b2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(8)-NS_NET146_F4_(9),0.0430000014603138,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,9b889b73-c108-4b38-b6eb-3377841e0c83,"olm:{(0.0,1.0)}",,,,1,0622aad8-6436-429e-a46b-4e09adad1a6c +876998db-5326-4257-b2d1-a4722265f51d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_02-MS4_03,0.5,174fb4b2-4f9e-415c-bfee-d850ef751307,85ea3976-1779-4d46-bd6f-dfd36427ebdf,"olm:{(0.0,1.0)}",,,,1,29925a58-7664-486a-a503-ab0d994c9e75 +66dbe72e-f2be-430d-b103-c1a84f8211a4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(14)-NS_NET126_F3_(15),0.029999999329447746,df8df8d2-3494-4da9-8d1b-f913d15f520f,ae234bc5-b751-41f2-95ee-b78de124c583,"olm:{(0.0,1.0)}",,,,1,b423a5cf-ca70-4a11-9b97-07d002a10837 +f2c37ce1-91d3-43d3-beb3-1fc9a30c87fe,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(7)-NS_NET126_F3_(8),0.03200000151991844,50164699-2018-4b17-b3f1-74b082f27403,6dcdc87b-a719-416f-9da1-21a701048f3a,"olm:{(0.0,1.0)}",,,,1,d03f95b2-28c1-41cc-a80b-768a2a2f4788 +2c4fae2c-c565-4111-b535-8488737aa358,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(21)-NS_NET126_F2_(22),0.024000000208616257,1dee13af-e638-4858-9c69-0069190cd577,177a20fe-83b1-46df-94a3-4faa54348d10,"olm:{(0.0,1.0)}",,,,1,62a6a50e-8d16-415c-960d-8ef133627350 +e7388048-40c3-4fd7-bcbb-2e1b09e735d2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(11)-NS_NET146_F1_(12),0.01899999938905239,666757e2-292e-473c-ac9c-04c0786574bc,3b879239-20c8-4adf-bd51-92924327ee71,"olm:{(0.0,1.0)}",,,,1,d4ff2175-de32-4f24-99ad-ab11517444f9 +5ff3f25d-ef1d-4ba2-ba1e-b387965a839a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(11)-NS_NET126_F1_(12),0.01899999938905239,270c7266-45dc-4e45-829f-c04f6b631cad,9d10a92f-576d-4777-99ff-59d145924fea,"olm:{(0.0,1.0)}",,,,1,2c4b31fd-9662-4b0a-95da-bab5a1b541cd +1c23e300-0ad5-4b90-ac74-b9763e579268,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_06-MS4_07,6.0,fa6d5184-b205-4b1b-839f-7b21ac956c29,898d8295-bf35-4079-9374-99b059c2c956,"olm:{(0.0,1.0)}",,,,1,85771d96-26ec-47d7-b8ef-f991a0bb996e +7bc8b609-baba-4afe-8cec-866d74e91e43,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(8)-NS_NET146_F3_(9),0.01899999938905239,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,6570535c-0d2e-4846-9951-21559902f67a,"olm:{(0.0,1.0)}",,,,1,af9a3ab2-48e6-4972-b589-8baae5c74fb9 +2005c393-edc4-4cc4-80af-ebbde1305b8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(38)-NS_NET146_F1_(37),0.028999999165534973,32507a10-1eed-4a3f-820c-bc187f3b052e,450426ac-a560-4d17-b1fc-9e169530a655,"olm:{(0.0,1.0)}",,,,1,a4c7ef55-d178-4967-a6cf-8a762672d27c +52cd80d8-9489-41bc-931a-d82dba5d0926,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_4-NS_NET136_S2_5,0.029999999329447746,81cd3f38-867b-4a71-ba22-cb33834e0e58,c5af5a34-211a-4105-a8e1-f447140073c6,"olm:{(0.0,1.0)}",,,,1,28c423bf-1639-4599-847c-d0db54b6d55d +08d39ce3-e843-49bd-9b46-1fe927a1d4be,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(17)-NS_NET126_F2_(18),0.023000000044703484,c5457e35-ad81-4427-9d3a-99e4c44ccae8,e80aa2db-f32c-410d-96a1-a32e03222568,"olm:{(0.0,1.0)}",,,,1,803c298b-61c6-412c-9b60-21cabc5bd945 +b6b655da-54ed-41d8-a331-04e41d2286de,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_1-NS_NET136_S1_2,0.029999999329447746,535b3fa4-ed67-4ab1-9a68-e7db83e05967,032768b4-2426-4abf-806b-83813ac5137a,"olm:{(0.0,1.0)}",,,,1,359e568b-3167-4c1b-9e94-6e6aa74e36cc +0f11e5d6-f850-463b-8d74-6fdf91fad535,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(1)-NS_NET146_ONS,0.02199999988079071,2c520ab6-507e-4dcf-ab05-8f238e9b9385,3da4fd3d-ac5e-409d-91fa-36516673cf57,"olm:{(0.0,1.0)}",,,,1,4503f215-7ded-4230-9f94-e8ce4f2560ab +d00ddea9-83f7-411a-9da6-f9607ffb3c87,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(30)-NS_NET146_F3_(31),0.023000000044703484,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,"olm:{(0.0,1.0)}",,,,1,f24aa8ff-676a-4638-a1b4-4c16566079e8 +6862b157-39c8-47d2-b31c-e418e1bad9a2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(24)-NS_NET146_F2_(25),0.028999999165534973,970cf93c-36c5-4938-a7e4-3f184a7035f0,011e3794-3341-4376-839c-3f5a452e15ab,"olm:{(0.0,1.0)}",,,,1,785dc700-c099-44fa-88b8-4242184395cf +5d1176ac-e64e-4811-8d0c-c87d9060ba2a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_ONS-NS_NET116_S2_1,0.029999999329447746,31a2b9bf-e785-4475-aa44-1c34646e8c79,39112046-8953-4e73-a5d9-6a8183a77436,"olm:{(0.0,1.0)}",,,,1,4ee89e0b-1e97-4dde-ba57-3b0b862957c5 +d2cd0ac6-ffbb-43f3-94c1-e10344eea594,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(12)-NS_NET126_F3_(13),0.019999999552965164,eb125953-31d3-4207-adf7-aba3a3790d6f,f29859be-c6e7-4cf9-84d7-239eb98a9e65,"olm:{(0.0,1.0)}",,,,1,36876e77-ccb6-4cc1-8508-d1728c149a07 +a78fbab6-e680-4c45-9731-97c82f2fb3c8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_05-MS3_06,0.4000000059604645,86dfce49-05b2-4208-a6ae-877c3e98e6be,39dbc5ed-d874-48a8-9128-e970436a94b4,"olm:{(0.0,1.0)}",,,,1,0cf49259-c126-4602-9b8a-764208d67914 +c23b7659-8e54-410a-b0e9-9eccbe2457dc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(9)-NS_NET126_F1_(8),0.026000000536441803,5dfd45b8-48e7-42fd-ac53-cc57455486b5,f717b05b-f4e7-43d9-af9e-638e2badee5a,"olm:{(0.0,1.0)}",,,,1,c56980f1-59a0-4966-8743-a6a8165efdda +14f9eef8-8550-45fa-a3f0-f583624556e7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(13)-NS_NET126_F2_(14),0.02199999988079071,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,9ce9d92c-5583-4b16-bec6-9f67834663cb,"olm:{(0.0,1.0)}",,,,1,fdae377a-76ff-447c-a64b-ae3a431691a3 +5d56c97f-e15c-4676-9b1a-fc5d7efb8a24,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(28)-NS_NET146_F3_(29),0.02199999988079071,c72a08bc-4685-49b1-b8ef-803aebc8c388,15345698-c319-461f-b969-37d50fb84220,"olm:{(0.0,1.0)}",,,,1,c435432c-3647-4b5b-96e1-ac1e32a546e4 +d160ec85-06ab-42d2-9dc1-4f905306e0a6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(12)-NS_NET126_F1_(13),0.02199999988079071,9d10a92f-576d-4777-99ff-59d145924fea,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,"olm:{(0.0,1.0)}",,,,1,6e3b7cd2-87cb-4155-a5a8-1e7ad6557a47 +1a52eb5c-a8a1-4b69-9aac-138e425d835b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(7)-NS_NET126_F4_(8),0.041999999433755875,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,75f2dfb9-75a0-496d-9c44-79e7df54c1df,"olm:{(0.0,1.0)}",,,,1,0417354b-2a35-4499-965d-24b153f98769 +97d5bd4a-ce14-4ded-90d4-4f2db25d6626,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(17)-NS_NET126_F1_(18),0.02500000037252903,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,2f64bf67-cee9-44bb-8c13-ff96878932af,"olm:{(0.0,1.0)}",,,,1,b8c8070f-0668-4a5c-bbff-4326670eedc3 +a2a8bc02-02a9-40d8-9495-058c04d7df89,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(7)-NS_NET146_F2_(8),0.02500000037252903,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,792b505c-87ab-4665-a31d-b6035c5ece70,"olm:{(0.0,1.0)}",,,,1,d4890af8-3627-4397-b962-31e5ae9a8164 +9f57100c-cb04-49b5-a9bd-f0e78f87b18a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(10)-NS_NET126_F1_(9),0.03099999949336052,f6a31362-8b0d-4926-b0d0-10bb61db20df,5dfd45b8-48e7-42fd-ac53-cc57455486b5,"olm:{(0.0,1.0)}",,,,1,e745cdd4-1c30-447f-8694-d3b3d2e01a96 +31c8715f-7b85-4243-8908-69cf8b2c1525,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(5)-NS_NET146_F1_(6),0.017999999225139618,bd8c7d3d-e830-4a46-bf78-0086ce24909f,e3c3c6a3-c383-4dbb-9b3f-a14125615386,"olm:{(0.0,1.0)}",,,,1,f1974038-6ca4-4c43-8cf9-b9e6988b035c +2887fb2b-fe44-4436-b28e-9f100f8288ac,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_4-NS_NET136_S3_5,0.029999999329447746,2a816043-d1d2-44a6-8a9b-f61a4933997b,3bc8235b-03b5-489b-81a2-58d520fbe28e,"olm:{(0.0,1.0)}",,,,1,3be9f63d-c316-4aa1-8695-6cfcfac29790 +31f8365c-9329-4c46-8555-6ec6aadf130e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(9)-NS_NET146_F4_(10),0.032999999821186066,9b889b73-c108-4b38-b6eb-3377841e0c83,ffcaf979-d707-4d25-8f46-f436f9792d7f,"olm:{(0.0,1.0)}",,,,1,3654a929-29a8-4945-80df-5fd5a7ab6218 +8dd3984e-a9f6-4829-9c19-a377e3491f9a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(23)-NS_NET126_F3_(24),0.023000000044703484,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,97ae0aa4-bf05-4b88-8020-83cbda415d22,"olm:{(0.0,1.0)}",,,,1,ddfd9f5d-c943-4c9a-a019-58ef25e3cbb1 +836bf4ab-38e1-44f5-a082-723fc12e4845,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(1)-NS_NET146_F3_(2),0.023000000044703484,22e58399-428f-4633-9ee4-e5fa0db68d6d,0b2a3b46-5e43-4879-973e-d8fb96429d8a,"olm:{(0.0,1.0)}",,,,1,9f363635-277f-49ad-9d59-17ba6fe87989 +22acea8e-cde0-45a4-82e6-ce5241226aac,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(23)-NS_NET146_F3_(24),0.023000000044703484,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,773aebe4-fc03-46be-8209-0213e2760a8e,"olm:{(0.0,1.0)}",,,,1,6d1930ba-b144-459f-9a7f-463c0a0f46b4 +2dd402ff-ef64-4b4b-8a49-e9570364e65b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(36)-NS_NET146_F1_(35),0.019999999552965164,8f80e777-ccbd-4630-b10e-238e824113fd,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,"olm:{(0.0,1.0)}",,,,1,dc2dafb1-dd6f-489e-9fb1-36d029b03980 +b5a66c60-7189-4c86-a32a-4d1aa6568475,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_4-HS_NET1_Station_1,30.0,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,00d03670-7833-47ee-ad52-04d18d1c64fd,"olm:{(0.0,1.0)}",,,,1,b8bec046-5587-4a35-a262-233452558bfa +c49d1581-a0c6-493f-9534-39f97970492b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(13)-NS_NET146_F3_(14),0.020999999716877937,bdf97a4d-622c-4251-8183-8b1a696f376e,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,"olm:{(0.0,1.0)}",,,,1,0d7473a5-dd01-460f-a1ee-624d10f34c8e +88c3a0b5-9def-4bf3-87c1-0ee75578b5a9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(18)-NS_NET126_F1_(19),0.029999999329447746,2f64bf67-cee9-44bb-8c13-ff96878932af,d2aff632-fc26-4595-931c-92e266247ac8,"olm:{(0.0,1.0)}",,,,1,d334240a-49ef-430f-8924-3d3104b636ba +8a09b9b8-6c9f-4dc7-a5a5-fe5d22b5809a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(11)-NS_NET126_F2_(12),0.029999999329447746,6678c226-c5d2-4ce3-9728-dc1163be799f,9d02ea80-98d8-4cd0-a635-9104a14a56dd,"olm:{(0.0,1.0)}",,,,1,3bfb3448-4aa4-4390-88ab-b73e539c336f +b672be06-2cbc-4510-8a96-34647985e9d5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(4)-NS_NET126_F3_(5),0.017999999225139618,bf7e7268-2fb6-4948-ace6-9037ae148fa3,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,"olm:{(0.0,1.0)}",,,,1,7204651a-462e-4a96-ab91-9bec7dbdcb92 +8619b18b-8b32-4013-9b3a-6aab514b73cc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(2)-NS_NET126_F4_(3),0.04699999839067459,c7e09266-c778-433b-b01a-5fb9e298ea8e,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,"olm:{(0.0,1.0)}",,,,1,03627bdf-9d77-44d5-a9c2-9e3109ec8a32 +f606c03b-66d1-4765-97e6-1319ad6ac0c3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_2-NS_NET136_S1_3,0.029999999329447746,032768b4-2426-4abf-806b-83813ac5137a,eb95ff15-56db-4463-bb54-0ee131167812,"olm:{(0.0,1.0)}",,,,1,ab79d7fc-15bc-4ab6-bd7c-432ae87839d7 +222af488-6339-4308-8f25-eac19b6e2c9c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(24)-NS_NET146_F1_(25),0.02800000086426735,205fcee1-928c-4374-950c-34575f07fa49,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,"olm:{(0.0,1.0)}",,,,1,0ce5f7e7-51b3-4da3-ad12-1c50dc44c6c9 +7cc28881-dec6-4baa-ad77-d4a2ea3cdd68,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_06-MS1_07,6.0,b22c9299-5fb4-46a7-b566-fc17e0d51d60,7546df1d-8a62-4650-bf2e-d1e441b38d70,"olm:{(0.0,1.0)}",,,,1,71d2059f-ed6c-4cd1-9c3a-28b3409e93bb +971288e4-038b-49d5-8df0-b2a7fdc0e17c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_03-MS4_04,6.0,85ea3976-1779-4d46-bd6f-dfd36427ebdf,890f2162-b4cb-49e7-a16f-4b552c5e245c,"olm:{(0.0,1.0)}",,,,1,8ad70eaf-8f88-49ac-9369-556f8d4e4981 +3029d722-91ec-4e45-9243-d267222b6c8e,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(3)-NS_NET126_F2_(4),0.026000000536441803,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,"olm:{(0.0,1.0)}",,,,1,2de36fa6-bedc-413d-b9ea-ac1a47459531 +26d976e2-5245-4174-abcc-7e67e03d6352,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(12)-NS_NET146_F3_(13),0.019999999552965164,f6eff0d1-af6b-46ce-b430-4d30976ec08f,bdf97a4d-622c-4251-8183-8b1a696f376e,"olm:{(0.0,1.0)}",,,,1,a4a49bc8-ea2c-4728-8c40-d6863e46f042 +9039f436-9be6-4c74-86b2-b5add2446d0a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_04-MS4_05,0.800000011920929,890f2162-b4cb-49e7-a16f-4b552c5e245c,ee384ace-040e-4f21-8a8a-d702ab51af55,"olm:{(0.0,1.0)}",,,,1,29ce3d34-1e26-468c-af62-19ff0d0fd70f +62c21e1e-f353-4e48-bca6-8a4da341971e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(21)-NS_NET146_F1_(22),0.03200000151991844,92cb5065-2e57-4099-8e29-75cbc0c80370,1ee9de9a-0095-4b58-beeb-e56fb908844a,"olm:{(0.0,1.0)}",,,,1,d03eee1c-0c11-41c4-90a3-2743ab894974 +71832b7e-b5a2-40d4-82d3-e8f1ba38ace6,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(6)-NS_NET146_F4_(7),0.03400000184774399,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,"olm:{(0.0,1.0)}",,,,1,ec6693de-2458-4ace-b303-4ef744f72884 +7cfd5184-c217-42b9-be09-7ed413d7a11e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(32)-NS_NET146_F1_(33),0.03099999949336052,033d0230-4aee-47cf-91f9-81f5f40e60b0,543f7e9f-b9be-486b-b365-2bae79010758,"olm:{(0.0,1.0)}",,,,1,763854f1-b1c6-44fb-a458-c7878ac026e5 +03b3d5c7-cb42-45d7-a5b7-b44c60ad5268,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_04-MS2_05,0.800000011920929,5f1c776c-6935-40f7-ba9e-60646e08992b,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,"olm:{(0.0,1.0)}",,,,1,5407472c-b967-4600-864d-c79362f5658c +0d6a5b4a-db92-4772-a91c-4e18ff35c0be,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(35)-NS_NET126_F1_(34),0.054999999701976776,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,"olm:{(0.0,1.0)}",,,,1,f4a72519-d0f2-4208-b7c7-032cb5e5516d +ca765f8e-2a05-40fb-80b8-41e02887fa46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(19)-NS_NET146_F3_(20),0.019999999552965164,810bebb0-0d5c-4899-b213-3207be661248,0ebf0088-f596-4cd1-9ae0-5da02dc40335,"olm:{(0.0,1.0)}",,,,1,cb8e491b-e99f-4a68-a0e0-dfa07b77ca7f +ce640cab-6f6d-4fd1-b652-009bec4c596b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(9)-NS_NET146_F1_(8),0.026000000536441803,0db6e581-37e9-4254-aed8-d5cdf66819f9,d5489e1b-0e7e-4ca9-a362-09c23576a622,"olm:{(0.0,1.0)}",,,,1,ec77a581-8148-4b2c-bb6a-3f7c24ebb93b +ce8ea248-dbcb-40b9-a97d-22452032ad27,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(11)-NS_NET146_F3_(12),0.019999999552965164,e2267696-669b-48e8-b43a-37d0db95011d,f6eff0d1-af6b-46ce-b430-4d30976ec08f,"olm:{(0.0,1.0)}",,,,1,3cde9801-6334-4e0d-8994-6d18b3906a71 +66651745-4425-4a9a-9a2a-3f2715252cf6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_2-NS_NET136_S2_3,0.029999999329447746,cbcfc3b6-ac90-4215-975c-a033f5cf9912,fd534474-cd65-47aa-8005-dc50d17d6920,"olm:{(0.0,1.0)}",,,,1,5f39d862-cf14-4619-847d-1b77eaa80546 +dafff7d5-8ed4-4b2f-bcd3-b6d02472dfea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(24)-NS_NET126_F3_(25),0.029999999329447746,97ae0aa4-bf05-4b88-8020-83cbda415d22,1bf26b4d-03cc-4490-8c33-d3db8597d807,"olm:{(0.0,1.0)}",,,,1,d3f48b67-8081-41a8-a9ea-2515ef4c70ee +5753e615-c90a-4008-92ec-b50c8195f95f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(27)-NS_NET146_F3_(28),0.03099999949336052,55caf2ec-a21b-4afd-8830-1e4009cce396,c72a08bc-4685-49b1-b8ef-803aebc8c388,"olm:{(0.0,1.0)}",,,,1,e4d237c9-b025-4838-8b12-34bbf1265fb9 +106f03b3-b84e-4d36-ab09-13b3dc3403e7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_3-NS_NET116_S2_4,0.029999999329447746,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,e05c68b1-11cd-43fd-a4b2-31e4db380c78,"olm:{(0.0,1.0)}",,,,1,17e87208-d092-4514-8b23-ab91598798ce +63856192-b60e-48a5-83a3-94422a79e79e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(16)-NS_NET126_F1_(17),0.03200000151991844,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,"olm:{(0.0,1.0)}",,,,1,0d77358d-422b-4f97-8eb9-b36f717da4a2 +8cc7bf8e-226d-41c9-9cd0-7524ea9186f7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(1)-NS_NET146_F1_(2),0.023000000044703484,4f28e734-5148-4caf-ac64-270231740cbf,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,"olm:{(0.0,1.0)}",,,,1,110964ab-decd-4f63-af13-dfe2ee499ba7 +c3206971-b22f-4090-826b-e08d4bc8ffad,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_3-NS_NET116_S1_4,0.029999999329447746,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,b3a7431d-89b0-41cb-87a9-5853890796cd,"olm:{(0.0,1.0)}",,,,1,b63674e1-6827-4e8b-b3e6-34ee6d4823a9 +94071ac7-ae51-4e45-8795-9d10bda616e9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_03-MS1_04,6.0,787237ad-b3a8-4f2c-ab70-31c5113d82d7,1396cb4c-cee7-4116-97c9-290f98785719,"olm:{(0.0,1.0)}",,,,1,5f05acb2-b125-47e1-af39-878997a48981 +bfecad6c-ddda-4957-ae66-f04d30fd7104,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(23)-NS_NET126_F1_(24),0.05000000074505806,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,4f2402e8-664a-40f2-970a-abc098a2a0d1,"olm:{(0.0,1.0)}",,,,1,b0242798-3ebc-43b5-b26d-0afc2e3af126 +76f097c5-173f-4fee-b6db-190792922d0e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_ONS-NS_NET136_S3_1,0.029999999329447746,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,416fa5eb-2f72-46c3-978f-6a0ebb714a40,"olm:{(0.0,1.0)}",,,,1,89a28eeb-daae-4a0b-bfd5-6c5ba90f7440 +8ae06d94-8e5d-48f6-9d43-599596df688a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(6)-NS_NET126_F1_(7),0.03099999949336052,99e26ef8-75e2-46f3-aafc-6287bf5e3905,fc7821d2-ac64-483e-b520-38d9971f4db0,"olm:{(0.0,1.0)}",,,,1,7513c490-99e4-4d11-983d-3d6bcf8dea93 +ff38b3f7-e29d-4f61-946e-59a8b283295c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(4)-NS_NET126_F2_(5),0.020999999716877937,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,"olm:{(0.0,1.0)}",,,,1,4318646d-6b12-411d-9fe1-6151c5106479 +0b6f398b-30f3-41f1-9bc2-ec93e91e8f19,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(22)-NS_NET126_F2_(23),0.027000000700354576,177a20fe-83b1-46df-94a3-4faa54348d10,9b509c7d-4647-40fd-b03e-7ab919215cc6,"olm:{(0.0,1.0)}",,,,1,e04e5d5a-1f24-40ce-9869-1835e0ade796 +d15c85bb-c9b1-4fa3-8bf6-4aa393b564d4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(15)-NS_NET146_F3_(16),0.020999999716877937,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,"olm:{(0.0,1.0)}",,,,1,ce1623cf-68c5-4f91-842a-2845ca7aa0e1 +3026e0ba-0a46-4d5e-afff-953c34fde207,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(17)-NS_NET126_F4_(2),0.10000000149011612,7125de08-1d28-409a-8b23-023a0294def5,c7e09266-c778-433b-b01a-5fb9e298ea8e,"olm:{(0.0,1.0)}",,,,1,cb059d73-c67b-41d4-9c49-844c12351e77 +0d6627e5-9f9e-4c40-90c1-45abd98a51cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS2_01-MS2_02,2.0,1a8ba1a5-3cee-4791-b21b-f17b08526873,535843a3-cf93-412f-b4d7-585337791ba8,"olm:{(0.0,1.0)}",,,,1,8cb6dcdc-c648-4c54-8cda-1df69f317b47 +42828cac-b67e-4d5c-b4fa-787c57f16fde,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_3-HS_NET1_Station_2,20.0,33f29587-f63e-45b7-960b-037bda37a3cb,dfae9806-9b44-4995-ba27-d66d8e4a43e0,"olm:{(0.0,1.0)}",,,,1,9ac19e4c-0379-4aaf-a96a-b2e71462abb3 +c4f33026-5741-4070-970c-1234541ce509,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(8)-NS_NET146_F2_(9),0.02800000086426735,792b505c-87ab-4665-a31d-b6035c5ece70,a5c73608-5a85-495d-bea0-df77b6ce66ea,"olm:{(0.0,1.0)}",,,,1,a246d41e-4ad0-4dbc-9261-99104c22f0d8 +ec6f82c5-e834-48d0-84af-a0f070979d65,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(19)-NS_NET126_F3_(20),0.019999999552965164,922a6375-b97c-412e-a6c9-b0ea55a23f76,732f83b0-b9c5-4b8e-86fe-753c26f40e78,"olm:{(0.0,1.0)}",,,,1,0199a8ad-0453-4362-90a8-49ee825029ac +04d02ea8-ba96-4a7f-969d-d25e201e32c6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(2)-NS_NET146_F4_(1),0.07100000232458115,b37ea333-65e1-4211-8449-993b67e8e0e2,ead38a50-b8f7-4bbb-b65d-f54350825e8e,"olm:{(0.0,1.0)}",,,,1,2c4f86a0-5161-4f3f-b6c6-bcc9c7c0ed4e +814dec01-f6f2-4817-8f83-2e758011b033,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_ONS-NS_NET116_S1_1,0.029999999329447746,31a2b9bf-e785-4475-aa44-1c34646e8c79,8a50fb37-81cf-47c9-8850-a12b4391e2e7,"olm:{(0.0,1.0)}",,,,1,a7071b97-2be4-40bf-a0b1-b8faf6bff6d6 +56e0ddce-ad67-435e-ad8c-5e276c13018a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_ONS-NS_NET136_S1_1,0.029999999329447746,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,535b3fa4-ed67-4ab1-9a68-e7db83e05967,"olm:{(0.0,1.0)}",,,,1,8c6655c4-4ab0-4eb9-9ef3-ccc4c1c58b86 +cba98774-b8c6-45f4-84cc-2fde121a77fa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_1-NS_NET116_S3_2,0.029999999329447746,4a6f6058-e654-464d-9367-2dca7185c6d7,550ebca7-1455-44eb-9431-ffbf08e58bd4,"olm:{(0.0,1.0)}",,,,1,6986321a-0a85-411e-8b2d-9d929a7f298b +8add0020-bc20-4aaa-9ad3-fa1a1a5ef376,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(15)-NS_NET126_F1_(16),0.019999999552965164,41c0087f-ce27-4da3-97d2-92d711b639b4,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,"olm:{(0.0,1.0)}",,,,1,9c4d86bb-ab1d-42ff-a5f2-4d1f39778f6c +9ec195e0-4c9b-48a6-9233-0d770b34705b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(10)-NS_NET146_F2_(11),0.01899999938905239,41414318-73e3-4bdc-8147-570a96b28d37,f26b5511-3c50-42d5-97c2-be408330eb84,"olm:{(0.0,1.0)}",,,,1,e0c1129d-75ba-4639-928d-2f43eeabc88e +473a11f4-1691-44ba-8e95-96782bc9d07f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(27)-NS_NET126_F3_(28),0.03099999949336052,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,"olm:{(0.0,1.0)}",,,,1,970e0436-65e3-48d6-9d9c-1f194f94f02c +71c56dc9-d957-4746-872f-8ad07d4ef8a4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(22)-NS_NET126_F1_(23),0.027000000700354576,c317a6cd-428b-4c36-8233-91d0c4e2717a,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,"olm:{(0.0,1.0)}",,,,1,d984e978-5734-43e7-ac15-fd8cb4d281a6 +23abf40d-58a7-4f00-9ee8-5290a510f9b2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_03-MS3_04,6.0,e4502c52-b4d7-4082-a583-b5688d8244e0,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,"olm:{(0.0,1.0)}",,,,1,6734c033-4156-4e9f-b924-2f5d6aee5c7f +f03440ae-d6d8-4f7b-ad5f-bbd280a9d2a6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(37)-NS_NET126_F1_(36),0.03200000151991844,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,ca3391eb-ca94-4945-ac72-e116f396f82c,"olm:{(0.0,1.0)}",,,,1,82e77523-a1ad-40e4-a7d1-0a9ae55a5b2f +220f509c-9aea-4e60-8dc1-593d2e35ed21,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(15)-NS_NET146_F2_(16),0.017999999225139618,d82fae59-844a-4c85-997e-326dd876137c,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,"olm:{(0.0,1.0)}",,,,1,64336228-e311-47a6-aa65-4e2883352109 +7297611b-fbdc-4949-87fc-1bca403708aa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(7)-NS_NET146_F3_(8),0.03200000151991844,f1e88392-3b2a-4ce8-a31f-c963f08f8043,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,"olm:{(0.0,1.0)}",,,,1,491312ff-b705-4baf-ad5e-139ca62abd13 +7ad69cae-2bb0-4516-80a9-6afc7b5cb789,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(21)-NS_NET126_F3_(22),0.027000000700354576,5af425fa-6ed7-43e1-8898-7af1315128c5,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,"olm:{(0.0,1.0)}",,,,1,b2edb582-9e3e-4381-8807-75abd1710902 +2d552f15-6871-4e09-84b1-003da098d909,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_1-NS_NET116_S2_2,0.029999999329447746,39112046-8953-4e73-a5d9-6a8183a77436,d53ff076-dadd-44f8-85d4-68f48991f7d0,"olm:{(0.0,1.0)}",,,,1,e0de3267-5ef6-4fcb-83c9-771d53e7fde8 +affde1a2-90e8-468f-a0a9-eb024f791857,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_ONS-NS_NET126_F4_(1),0.04500000178813934,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"olm:{(0.0,1.0)}",,,,1,d639d54f-19ff-4b56-bf41-206c1736258c +ddc63e7d-e76a-489b-a05f-97e7dee40794,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(12)-NS_NET146_F2_(13),0.02800000086426735,8254d91b-e5da-4402-bb8f-301eafa09d28,49e14db3-a4bc-464a-b606-653ac8a604dd,"olm:{(0.0,1.0)}",,,,1,f66fc57d-f2be-41fd-bc60-d1177b091ac6 +af565c79-9953-4934-9afd-91cd64ed1f06,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(6)-NS_NET146_F1_(7),0.03099999949336052,e3c3c6a3-c383-4dbb-9b3f-a14125615386,67c1746c-3af8-403f-983e-1c7c047383df,"olm:{(0.0,1.0)}",,,,1,8bfec339-14db-48d1-869b-c46b602a5940 +0ffacffd-4f3f-465b-8525-bc22facc45da,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S3_2-NS_NET136_S3_3,0.029999999329447746,b46d4395-6724-4830-ba55-357e81fc2814,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,"olm:{(0.0,1.0)}",,,,1,9bcd4dbb-18d3-43af-85e0-e475f6371030 +e50ba18f-8019-4824-b835-cc33c70b0196,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(3)-NS_NET146_F2_(4),0.026000000536441803,0170837a-1876-45f9-a613-666f9991964d,369cffa5-bcee-4489-8193-1d9b10230eca,"olm:{(0.0,1.0)}",,,,1,69cea08f-72d2-4f65-b4b9-ae0a137da20b +e3b38aa2-dd38-445e-86c4-600331d108d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(18)-NS_NET126_F3_(19),0.03099999949336052,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,922a6375-b97c-412e-a6c9-b0ea55a23f76,"olm:{(0.0,1.0)}",,,,1,716ef541-2872-42dc-9304-6c2d840c1f0d +09083d14-02aa-40a3-9948-86e86883bda1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(37)-NS_NET146_F1_(36),0.054999999701976776,450426ac-a560-4d17-b1fc-9e169530a655,8f80e777-ccbd-4630-b10e-238e824113fd,"olm:{(0.0,1.0)}",,,,1,ceb28bd4-0090-4920-bedc-4f66968729dc +82e01986-321d-4f21-8453-60220f97bbb1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(4)-NS_NET146_F1_(5),0.02800000086426735,dd9d4153-c56f-4457-ad5e-46a48d4486b6,bd8c7d3d-e830-4a46-bf78-0086ce24909f,"olm:{(0.0,1.0)}",,,,1,1ede9038-2ae8-4794-839d-f60f70d50177 +d9d3a1f3-5090-4015-86a5-60be94fadcbf,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_3-NS_NET136_S2_4,0.029999999329447746,fd534474-cd65-47aa-8005-dc50d17d6920,81cd3f38-867b-4a71-ba22-cb33834e0e58,"olm:{(0.0,1.0)}",,,,1,a0318665-d079-4454-b335-67a08d52063e +8c4d9aa2-298b-466e-9982-6c4be253fbce,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(15)-NS_NET126_F2_(16),0.017999999225139618,2645e336-b0df-4d1e-a0ea-375444488f06,d8c35123-b389-4199-84f9-d417d24bb78d,"olm:{(0.0,1.0)}",,,,1,0d9b5a69-e04d-4617-b46d-6ddb64ca815d +7d9647cb-e7ca-4ecc-a79e-edb1bfbfb666,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(1)-NS_NET126_F3_(2),0.023000000044703484,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,285a4caa-2da8-4bd2-8a60-7d04f168f378,"olm:{(0.0,1.0)}",,,,1,51eff3e4-bffc-42b0-89d0-5c4756e128ba +a92769d6-3f6f-4e67-98b3-303e59dd9cda,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(5)-NS_NET126_F3_(6),0.02500000037252903,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,e018b95e-fca5-40f7-8550-b05a619169dc,"olm:{(0.0,1.0)}",,,,1,7b2c7e95-87c7-4c2d-8174-012a138f9c2f +597126c9-f364-4968-909c-ccc064959397,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(32)-NS_NET126_F1_(31),0.024000000208616257,49b511fa-8cff-45f4-9a59-54faaaf90abf,80d8252b-045f-471a-9638-416ed3f86120,"olm:{(0.0,1.0)}",,,,1,6ac4e62e-72ef-4772-8148-58586dd8d461 +5450f675-565b-4156-9d64-ff4cfeea96d3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(25)-NS_NET146_F2_(26),0.02199999988079071,011e3794-3341-4376-839c-3f5a452e15ab,86af5351-87ef-49c6-bd17-673dceecee5b,"olm:{(0.0,1.0)}",,,,1,5373af9c-0365-498f-959d-80bf86bd9a26 +8bb29769-404b-4bf6-837e-f9ca1b389bf9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_2-NS_NET116_S3_3,0.029999999329447746,550ebca7-1455-44eb-9431-ffbf08e58bd4,d69efff2-ba8b-4aa6-a4a1-27267964147a,"olm:{(0.0,1.0)}",,,,1,9db7e41e-7360-4529-bbdb-dbd220117f61 +1a5bb799-bc03-4de9-a8a1-9a0616ea3add,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(13)-NS_NET146_F2_(14),0.02199999988079071,49e14db3-a4bc-464a-b606-653ac8a604dd,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,"olm:{(0.0,1.0)}",,,,1,5b2b259b-1155-4130-b119-afea37851952 +a8bc3d4a-1113-4f62-b01d-e59e6c35ab84,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_01-MS1_02,2.0,f5839ade-5968-4879-a824-90b5fb3552cd,32b3bb19-c52a-4a19-890a-94a8918d38a9,"olm:{(0.0,1.0)}",,,,1,8c9f87cd-141c-4ba9-a017-5fcde0e542a2 +f2c9a881-eb41-4628-833c-5258e95ec457,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(39)-NS_NET146_F1_(38),0.03200000151991844,904c7476-5f16-4ec2-9138-7d5e32d38a3b,32507a10-1eed-4a3f-820c-bc187f3b052e,"olm:{(0.0,1.0)}",,,,1,f564bbec-720f-4299-b516-e576f02152c8 +e357bf93-aaa3-4870-b6a4-6d2cdb8967da,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(5)-NS_NET126_F1_(6),0.017999999225139618,eb21d716-1b54-4dba-bdc2-d1f6752aef85,99e26ef8-75e2-46f3-aafc-6287bf5e3905,"olm:{(0.0,1.0)}",,,,1,b4dfd39c-38ec-4883-adf7-413c0662694a +58105b87-e27d-4d7f-b492-42434801bdf7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(17)-NS_NET146_F1_(18),0.02500000037252903,0d94a5ea-3a13-48ba-a27f-b2903841c334,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,"olm:{(0.0,1.0)}",,,,1,3d684e78-d7ba-436f-b223-c2f50de8d7ac +2d616d05-fa31-4b7f-b666-0fab28a21a82,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(28)-NS_NET126_F3_(29),0.02199999988079071,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,"olm:{(0.0,1.0)}",,,,1,be79605e-39e3-4a53-b27c-33b5b80e8832 +f6c9e202-6548-405e-9969-bc4ae68ef7c1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(30)-NS_NET126_F1_(29),0.029999999329447746,519ace7e-fd3f-4797-b14b-36c1694b00cd,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,"olm:{(0.0,1.0)}",,,,1,471b943e-0115-4262-beee-ebaef1503b09 +e1315733-0b28-4465-8367-fa4535d282fa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(9)-NS_NET126_F3_(10),0.03200000151991844,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,e25387d0-ab9a-406d-bcb4-555414b88b1b,"olm:{(0.0,1.0)}",,,,1,7da1277a-931e-48f2-8d9f-810e49e0b8ec +199bc8fc-71a0-4c78-a64d-80a87f0f6b78,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(15)-NS_NET146_F4_(14),0.08399999886751175,576840db-7d3c-417b-b587-28b222e740e1,f2d03b34-9595-4819-a00b-ff9ddd92eb07,"olm:{(0.0,1.0)}",,,,1,b6c5b4cb-fc54-478c-9e57-0b5204e06120 +96cc155a-9417-4ed9-911a-b06b7981a2fe,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(33)-NS_NET146_F1_(34),0.027000000700354576,543f7e9f-b9be-486b-b365-2bae79010758,fd4f6232-c28d-4fc3-81dd-03b84aad695e,"olm:{(0.0,1.0)}",,,,1,58f4e0dc-7dd3-4890-af41-0a1730aa0e1d +2e5bf3d7-11a5-496f-9bd5-bb9d3686a576,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(5)-NS_NET146_F3_(6),0.02500000037252903,ce71377d-63ea-462a-9290-67e51946a098,01bdd8b2-145f-42b3-80e3-a2366dea1044,"olm:{(0.0,1.0)}",,,,1,809a36fc-7f08-4800-8714-2b6607974a43 +52ccd989-d87b-4f9f-9d5d-a0609391f56e,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(10)-NS_NET146_F1_(11),0.027000000700354576,6c24b464-790a-4aae-bb11-766718f07cd5,666757e2-292e-473c-ac9c-04c0786574bc,"olm:{(0.0,1.0)}",,,,1,3124880e-a2af-42a1-be47-841a8176e7b6 +e311729e-244e-48a6-bc48-0c7d9823c148,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(3)-NS_NET126_F4_(4),0.05299999937415123,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,"olm:{(0.0,1.0)}",,,,1,0615b7b8-e7ec-4771-9e68-f02948044da2 +445cc0c8-70b8-47d4-987f-308269b845a3,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(25)-NS_NET146_F1_(26),0.028999999165534973,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,154e9a99-467b-4f65-9928-8ebb14149baa,"olm:{(0.0,1.0)}",,,,1,b1614223-e9ef-4551-b50f-074d368a4289 +cd994d2f-b62e-4ab9-8f4c-e5357fd04af7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(22)-NS_NET126_F3_(23),0.02500000037252903,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,"olm:{(0.0,1.0)}",,,,1,b6264d92-34ba-49db-bb48-9a1d16e78482 +3e7e4741-502d-4c8f-bad5-e0c5c6f69958,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(10)-NS_NET126_F1_(11),0.027000000700354576,f6a31362-8b0d-4926-b0d0-10bb61db20df,270c7266-45dc-4e45-829f-c04f6b631cad,"olm:{(0.0,1.0)}",,,,1,80eb9e25-4a5c-49b6-bb57-8fa7cf5dc035 +95644bf5-8dca-4409-bb04-7d4e9a24fa03,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(30)-NS_NET126_F3_(31),0.023000000044703484,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,67af7db0-0fd8-4657-bb4f-43a2141b9f73,"olm:{(0.0,1.0)}",,,,1,d865f47b-3f99-4ba1-973b-4bdb6fe2414b +17e2286d-65ca-4948-8a6c-63bdc13a9b50,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_ONS-NS_NET146_F4_(1),0.04500000178813934,3da4fd3d-ac5e-409d-91fa-36516673cf57,ead38a50-b8f7-4bbb-b65d-f54350825e8e,"olm:{(0.0,1.0)}",,,,1,9a7fdf17-f929-42be-98fb-cf5778ce4358 +ec21c844-ca32-4f95-b6f3-dd8c56128f66,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(8)-NS_NET126_F3_(9),0.01899999938905239,6dcdc87b-a719-416f-9da1-21a701048f3a,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,"olm:{(0.0,1.0)}",,,,1,048a2c36-6fbc-43ec-aa92-3807f7bfec50 +37c8ebe1-5d29-4806-a84a-fc00e4279fa6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_3-NS_NET116_S3_4,0.029999999329447746,d69efff2-ba8b-4aa6-a4a1-27267964147a,36dccefc-f04c-493f-bb88-11343583bf9f,"olm:{(0.0,1.0)}",,,,1,ea01036f-5b25-47dd-98e3-0d944fd2e670 +5f8eb2b8-0f98-4011-bc3a-b182285be4db,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(29)-NS_NET126_F1_(28),0.02500000037252903,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,0c266541-6235-4d01-8258-e763c58af6c7,"olm:{(0.0,1.0)}",,,,1,4f86b68c-cbfe-4f1c-b849-dd17c640aa7c +75098182-83b1-40ae-baaf-95f1e1f93250,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(29)-NS_NET126_F3_(30),0.028999999165534973,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,"olm:{(0.0,1.0)}",,,,1,01ef6262-ae52-48e5-833c-aface9a34b35 +7614ed07-f464-4a56-8ea2-cf07772530c4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(2)-NS_NET146_F3_(3),0.028999999165534973,0b2a3b46-5e43-4879-973e-d8fb96429d8a,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,"olm:{(0.0,1.0)}",,,,1,33bf42ab-01ba-493f-a92e-de302649b490 +b302dc76-9715-45b6-b6ef-8da630acd168,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(20)-NS_NET146_F2_(21),0.02500000037252903,2aa2d409-8bb2-477d-ac7a-6439552e136a,bd292f64-65e8-42ec-9b78-b9b9f013750e,"olm:{(0.0,1.0)}",,,,1,03877157-9a63-40f9-a4ba-12b86cf2ccd4 +b08cf4bc-d9f2-4608-a162-74db09b16db0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(27)-NS_NET126_F1_(9),0.03200000151991844,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,5dfd45b8-48e7-42fd-ac53-cc57455486b5,"olm:{(0.0,1.0)}",,,,1,b44c03a0-c838-4de1-b329-e2df2a769d53 +76d82f19-65d7-447d-a14c-95d050139fa5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(2)-NS_NET146_F1_(3),0.027000000700354576,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,"olm:{(0.0,1.0)}",,,,1,3b41ea67-4e64-466f-9932-712b23fcf7df +de25721a-7ad9-450f-9e89-f483f19bf8a7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(23)-NS_NET126_F2_(24),0.02800000086426735,9b509c7d-4647-40fd-b03e-7ab919215cc6,625bdd2c-a75f-46ef-850c-ca4704d56e55,"olm:{(0.0,1.0)}",,,,1,f8b900a6-7d3e-41b9-b5c6-48eca9153984 +87a41d29-ad67-4bd6-a5b7-9d1414b38c6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(3)-NS_NET146_F1_(4),0.019999999552965164,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,dd9d4153-c56f-4457-ad5e-46a48d4486b6,"olm:{(0.0,1.0)}",,,,1,9da326a4-b96c-4e3c-bcd2-58be00a460cb +f0d4491e-eb64-49a0-8fc3-44fa5bd9dcee,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S3_4-NS_NET116_S3_5,0.029999999329447746,36dccefc-f04c-493f-bb88-11343583bf9f,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,"olm:{(0.0,1.0)}",,,,1,e2ee2ab1-8e22-41be-9a1f-cfdee99d611e +13cfe1fb-1cec-4c17-baf8-b7dcb9f744cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(1)-NS_NET126_ONS,0.12099999934434891,4303784e-7193-454a-9be4-3591400b4eeb,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"olm:{(0.0,1.0)}",,,,1,33e2dfb4-60cd-4b99-b7ac-bc28267e8b9c +230eae02-e233-4975-9cbb-268d0af4a492,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(4)-NS_NET126_F1_(5),0.02800000086426735,ff947647-b551-41ae-bcfd-6af228250c96,eb21d716-1b54-4dba-bdc2-d1f6752aef85,"olm:{(0.0,1.0)}",,,,1,000a8091-6782-41a2-aa13-fcf0056989d1 +f8827054-46fd-486c-aa91-9bd813187705,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(3)-NS_NET146_F4_(4),0.05299999937415123,b5548457-5923-4d52-b3c9-fdb75a1df98e,00d4a837-f09c-41df-bed1-dfdb78387116,"olm:{(0.0,1.0)}",,,,1,1568ffdb-4504-4dce-b1d4-680a286f52b2 +d86488f7-cf74-41b4-9d62-e2923d00680f,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(20)-NS_NET126_F1_(21),0.05999999865889549,36cda100-86ae-4a20-ac71-20af603ac0cf,14ae9865-cb9b-4518-9f2a-c0fda3455a42,"olm:{(0.0,1.0)}",,,,1,0610293b-068b-4851-927b-618da07e6fcf +e8329717-1626-4c33-b60e-d83e78514014,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(11)-NS_NET146_F2_(12),0.029999999329447746,f26b5511-3c50-42d5-97c2-be408330eb84,8254d91b-e5da-4402-bb8f-301eafa09d28,"olm:{(0.0,1.0)}",,,,1,76530f38-d7be-4e8b-b1f5-cfe49b59388f +09fdfecb-1ea0-4b99-a7bd-caad84afe160,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(7)-NS_NET126_F1_(8),0.01899999938905239,fc7821d2-ac64-483e-b520-38d9971f4db0,f717b05b-f4e7-43d9-af9e-638e2badee5a,"olm:{(0.0,1.0)}",,,,1,b0640c38-10d2-4f95-aa23-afbd8ad7f21c +dcf3c182-18bd-4536-b11f-960c52c3b36e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(25)-NS_NET126_F3_(26),0.026000000536441803,1bf26b4d-03cc-4490-8c33-d3db8597d807,dc022eec-16b0-4a64-a2f5-498d81aca71e,"olm:{(0.0,1.0)}",,,,1,d8c2bfa8-4782-4989-afe9-4f69e3c42ae1 +9e9550e6-a601-4633-96a1-20220893ce00,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(13)-NS_NET146_F1_(14),0.03200000151991844,f1e55c8b-357f-45a7-9d57-e299f9b207f3,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,"olm:{(0.0,1.0)}",,,,1,e3a643fe-bba4-4a7f-83db-23b0e03c923c +f6dfa796-69c1-4deb-8e5d-78d6a29f2b6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(2)-NS_NET126_F2_(1),0.028999999165534973,5981fe65-3c92-4a78-af92-1461904046d0,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,"olm:{(0.0,1.0)}",,,,1,9bdff8f4-9fc5-4bb4-a346-786543058f6a +29747132-2fe5-4570-8d02-114d3438835c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(26)-NS_NET126_F2_(27),0.02800000086426735,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,daed3552-e382-4153-95be-97f17e2c53e5,"olm:{(0.0,1.0)}",,,,1,04a91974-26b9-4b6c-9c0a-31f4bcc9c8d1 +02d85e44-4196-4ed1-9fa4-af9211dbd753,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(17)-NS_NET146_F4_(2),0.10000000149011612,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,b37ea333-65e1-4211-8449-993b67e8e0e2,"olm:{(0.0,1.0)}",,,,1,8bd8a653-39a7-420d-976d-68d9492601bd +7263918d-4331-43af-bd10-8c06bd2b8667,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(22)-NS_NET146_F3_(23),0.02500000037252903,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,"olm:{(0.0,1.0)}",,,,1,8f7197d4-129a-4493-9a21-55e258d7b6ed +4dbb5675-cc27-4868-a9cc-e28ca232ba23,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(2)-NS_NET126_F3_(3),0.028999999165534973,285a4caa-2da8-4bd2-8a60-7d04f168f378,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,"olm:{(0.0,1.0)}",,,,1,b3cac110-acef-4ec0-9139-3858a4c36acc +d54fcb7e-d472-4035-aff6-2646ce881931,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(3)-NS_NET126_F1_(4),0.019999999552965164,04f29760-9e52-4943-8563-62e1fbd5ed52,ff947647-b551-41ae-bcfd-6af228250c96,"olm:{(0.0,1.0)}",,,,1,54b7a190-585f-4a05-a07f-840289540a3f +c64c73c4-109b-4baa-bf44-3357d4bca7d8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(6)-NS_NET146_F2_(7),0.020999999716877937,5071dd8c-bbc1-4c8d-a180-4492f80e183d,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,"olm:{(0.0,1.0)}",,,,1,be6b1366-0282-427c-99fe-7ee0ae092652 +f59cd3fa-404d-4c42-820b-31346ae47c00,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(7)-NS_NET126_F2_(8),0.02500000037252903,4db634e5-3eb8-4c17-bc44-eb224667580c,366a70fb-8d7f-4201-9eca-0fcbc839239d,"olm:{(0.0,1.0)}",,,,1,0b2b2d0b-0bff-4b57-b505-78d70f9a2d96 +81578256-7c89-4651-8863-31fd206c628c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(19)-NS_NET126_F1_(20),0.04399999976158142,d2aff632-fc26-4595-931c-92e266247ac8,36cda100-86ae-4a20-ac71-20af603ac0cf,"olm:{(0.0,1.0)}",,,,1,90f47116-bd6e-489b-b5c0-8db3ff905d4b +ffdd2907-38ed-4a39-89de-9435e97dadc0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(18)-NS_NET126_F2_(19),0.028999999165534973,e80aa2db-f32c-410d-96a1-a32e03222568,52e15712-2572-442a-b22c-add48af95115,"olm:{(0.0,1.0)}",,,,1,5287c56e-1a3f-4265-bdf6-bad967e03478 +4c98fe8a-ca2a-4503-8843-a800cbf92c82,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(13)-NS_NET126_F3_(14),0.020999999716877937,f29859be-c6e7-4cf9-84d7-239eb98a9e65,df8df8d2-3494-4da9-8d1b-f913d15f520f,"olm:{(0.0,1.0)}",,,,1,5670305b-68cf-4b9a-ab60-ea3bbd57afb4 +0f9bf171-b79b-4009-8b0b-6ec18c523ebf,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(18)-NS_NET146_F3_(19),0.03099999949336052,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,810bebb0-0d5c-4899-b213-3207be661248,"olm:{(0.0,1.0)}",,,,1,21efe2be-86c1-4d0c-ba01-f77b01632ddf +bee47575-ecc8-4f2f-96de-e9a616603bb7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(15)-NS_NET126_F4_(14),0.08399999886751175,55b3d03f-2204-4ab3-84cc-a28476868c9d,d40a1a85-40f2-4ad3-ba58-720d5ba02268,"olm:{(0.0,1.0)}",,,,1,01b81835-2d2a-4e5c-bf78-cb1e789f2d0f +87cd1ae0-2ac4-46fb-aeb8-b2f710da299b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(16)-NS_NET146_F2_(17),0.024000000208616257,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,40537c84-c812-4231-bd23-0ba81922e937,"olm:{(0.0,1.0)}",,,,1,6c4bc7e5-6510-43f2-b370-89e5426d8364 +56603d19-84d5-4c2f-a42c-92777602999a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(16)-NS_NET126_F2_(17),0.024000000208616257,d8c35123-b389-4199-84f9-d417d24bb78d,c5457e35-ad81-4427-9d3a-99e4c44ccae8,"olm:{(0.0,1.0)}",,,,1,df4aeff9-dacd-4326-9126-58e39f4161f9 +997840bf-8c94-444f-83f1-e9c991706d7c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_1-HS_NET1_Station_2,24.0,00d03670-7833-47ee-ad52-04d18d1c64fd,dfae9806-9b44-4995-ba27-d66d8e4a43e0,"olm:{(0.0,1.0)}",,,,1,c940e435-0523-419a-90bc-f3dbf2e463f7 +ea5f6247-4116-4acb-9595-52a7a0412897,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S1_3-NS_NET136_S1_4,0.029999999329447746,eb95ff15-56db-4463-bb54-0ee131167812,ed4697fd-016c-40c2-a66b-e793878dadea,"olm:{(0.0,1.0)}",,,,1,98d23c1c-fd2a-4257-993f-55663b42200b +a4792ce6-c652-43e9-9156-5e9d0aa082c2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_ONS-NS_NET136_S2_1,0.029999999329447746,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,"olm:{(0.0,1.0)}",,,,1,7e56f483-33df-4eb3-b80d-787dcd1d5fec +ca425259-fab4-4dc1-99c9-c19031121645,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(4)-NS_NET146_F2_(5),0.020999999716877937,369cffa5-bcee-4489-8193-1d9b10230eca,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,"olm:{(0.0,1.0)}",,,,1,c3e20038-888d-4d19-91d0-9732110ff433 +98a4759c-696b-4c99-b339-cf39ecc76ba7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET136_S2_1-NS_NET136_S2_2,0.029999999329447746,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,cbcfc3b6-ac90-4215-975c-a033f5cf9912,"olm:{(0.0,1.0)}",,,,1,e6b134f3-2f34-4bdb-a353-0de86ef64651 +1c81ee69-fb75-4bea-bfa9-f627850f9e6b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(10)-NS_NET126_F4_(11),0.07599999755620956,857c264a-7072-4bb7-af56-2f01539b2a2e,95ced3b5-69fd-4171-9c34-f18802064e22,"olm:{(0.0,1.0)}",,,,1,9d193d4b-29bf-4cf5-9ff0-ab04185a6486 +0c73890d-adfa-4936-966f-8e527c06bdbe,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(21)-NS_NET126_F1_(22),0.03200000151991844,14ae9865-cb9b-4518-9f2a-c0fda3455a42,c317a6cd-428b-4c36-8233-91d0c4e2717a,"olm:{(0.0,1.0)}",,,,1,98940ea1-18b6-4823-99aa-ede16c31602f +8f9d19a8-8d64-4f62-b6aa-f5f01a12b566,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(2)-NS_NET126_F2_(3),0.01899999938905239,5981fe65-3c92-4a78-af92-1461904046d0,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,"olm:{(0.0,1.0)}",,,,1,75e63c65-ec08-4c59-aef2-3db3f96904cc +9d1ef0fd-3f8d-4a97-8495-25074243860c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(19)-NS_NET146_F2_(20),0.019999999552965164,636dec7c-4242-46e8-b7ae-db7e5a28c39c,2aa2d409-8bb2-477d-ac7a-6439552e136a,"olm:{(0.0,1.0)}",,,,1,fa60cbc7-5599-4409-b866-dc05a5b27235 +746fa279-2acf-4aa1-b3e1-8d312d66058a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(5)-NS_NET146_F2_(6),0.028999999165534973,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,5071dd8c-bbc1-4c8d-a180-4492f80e183d,"olm:{(0.0,1.0)}",,,,1,9aafec57-d20c-4d25-9a12-0ffb299eddda +7d68b748-ebe5-430e-95b8-bd0eededa136,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(1)-NS_NET146_ONS,0.12099999934434891,4f28e734-5148-4caf-ac64-270231740cbf,3da4fd3d-ac5e-409d-91fa-36516673cf57,"olm:{(0.0,1.0)}",,,,1,744ea833-d481-4583-99e7-4e83728ea176 +fe19ff1f-8ea4-4ffe-881b-ad8d57c4561a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(6)-NS_NET126_F3_(7),0.028999999165534973,e018b95e-fca5-40f7-8550-b05a619169dc,50164699-2018-4b17-b3f1-74b082f27403,"olm:{(0.0,1.0)}",,,,1,f8b5526a-2f8b-4937-864a-4162157a98be +4bdb6569-72da-4d60-97b1-b5a639032d5d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_4-NS_NET116_S1_5,0.029999999329447746,b3a7431d-89b0-41cb-87a9-5853890796cd,92301422-94ae-48ab-89c7-a69eea9450b2,"olm:{(0.0,1.0)}",,,,1,3362b510-7d57-44b1-a6cf-8081aac84a5b +be047b0d-9f7c-413e-bd60-f38b45d5ee80,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(10)-NS_NET146_F1_(9),0.03099999949336052,6c24b464-790a-4aae-bb11-766718f07cd5,0db6e581-37e9-4254-aed8-d5cdf66819f9,"olm:{(0.0,1.0)}",,,,1,a63fd579-c35b-4870-9173-0fd383364c6f +95b47f01-829a-46c3-873a-4df11d798c49,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(7)-NS_NET146_F1_(8),0.01899999938905239,67c1746c-3af8-403f-983e-1c7c047383df,d5489e1b-0e7e-4ca9-a362-09c23576a622,"olm:{(0.0,1.0)}",,,,1,152c2e89-46ec-4b21-9cea-5c10420de37b +815bc4d0-3418-4d15-8f85-c104a24e6b17,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(31)-NS_NET126_F3_(32),0.026000000536441803,67af7db0-0fd8-4657-bb4f-43a2141b9f73,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,"olm:{(0.0,1.0)}",,,,1,a34786e0-a3f2-4420-8754-9af63551cbf8 +f4859003-7182-4ebf-8a96-ce61b2f6191c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_01-MS4_02,2.0,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,174fb4b2-4f9e-415c-bfee-d850ef751307,"olm:{(0.0,1.0)}",,,,1,6fab725c-b58a-47eb-957c-9ca99f4558ce +93cd3af7-2dbb-4804-9386-d15705b5f18e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(31)-NS_NET146_F3_(32),0.026000000536441803,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,fd3b7bb8-3976-4441-9211-745243afd80f,"olm:{(0.0,1.0)}",,,,1,afc0f157-2fcd-4435-8cc1-46b29f8c799a +d5d7329a-08a2-4946-8a02-d4a70746d37b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(31)-NS_NET146_F1_(30),0.019999999552965164,5e213f42-d93e-45c5-a295-adbe09105746,9f95c733-71e2-4bf0-a27a-70144518ea2c,"olm:{(0.0,1.0)}",,,,1,04e8252c-c3f3-4a4e-a11a-a182e94c382e +81f4c585-6170-4a9e-981f-2185a0d7f2ec,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_HS_NET1_Station_3-HS_NET1_Station_4,20.0,33f29587-f63e-45b7-960b-037bda37a3cb,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,"olm:{(0.0,1.0)}",,,,1,0ef707b4-69a5-4e4b-95a0-91dc0752aa46 +91179f48-2d6c-4ae4-864c-d667f57a6e66,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_1-NS_NET116_S1_2,0.029999999329447746,8a50fb37-81cf-47c9-8850-a12b4391e2e7,3e21f3a1-2c9c-4138-bcc9-466b004609ed,"olm:{(0.0,1.0)}",,,,1,9312de84-9197-462f-9d69-7d2fea8f7f68 +bf6e54ab-1c74-4ce7-8371-b47e9019bd25,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_05-MS1_06,0.4000000059604645,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,b22c9299-5fb4-46a7-b566-fc17e0d51d60,"olm:{(0.0,1.0)}",,,,1,5c01eba4-8697-4e06-82f0-7ffd7bb43715 +5c26821d-ea3b-4a00-8d42-1486710a2ca5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(16)-NS_NET126_F3_(17),0.029999999329447746,6232b760-b2e0-485e-9c61-f9721a366a81,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,"olm:{(0.0,1.0)}",,,,1,e8fb78e6-329b-4968-b748-48d27078347a +cfd11fa8-fcf6-4b65-9523-ee5d21e292ed,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(6)-NS_NET126_F2_(7),0.020999999716877937,9d7038e9-5bcc-4676-bead-46c4f1291ba8,4db634e5-3eb8-4c17-bc44-eb224667580c,"olm:{(0.0,1.0)}",,,,1,267979b1-af4a-4ae9-a22c-3e0234ce2271 +10c6a103-3132-4324-8f76-8c1858d51fcb,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S1_2-NS_NET116_S1_3,0.029999999329447746,3e21f3a1-2c9c-4138-bcc9-466b004609ed,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,"olm:{(0.0,1.0)}",,,,1,1173fa67-2573-4476-aa5e-c3fe756a7f07 +eb1cd362-f3bd-4411-a45d-a237bcb07789,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(15)-NS_NET146_F1_(16),0.019999999552965164,00bbc353-d47e-4865-a696-fe5d29b9e6a2,09ac8949-2b79-41d7-b56f-a58f20036df2,"olm:{(0.0,1.0)}",,,,1,6f8f3927-ac51-4b7d-a23e-8e429949f345 +ab7c6c3c-3b7f-4475-8cad-27657bc148c6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(2)-NS_NET146_F2_(1),0.028999999165534973,69efeb2d-9845-49ac-8500-5e017a7a64ef,2c520ab6-507e-4dcf-ab05-8f238e9b9385,"olm:{(0.0,1.0)}",,,,1,82bc6482-24eb-42dd-8dc3-e05b86696a22 +ec4d2395-23de-41c7-a366-af36aed1bf44,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(4)-NS_NET146_F3_(5),0.017999999225139618,f66df6fa-3dfa-4515-85d7-54d0f429fde7,ce71377d-63ea-462a-9290-67e51946a098,"olm:{(0.0,1.0)}",,,,1,98d060f1-bde2-4649-92e9-c818ba66f474 +09125a13-324b-4611-a718-5028b390f1ca,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(1)-NS_NET146_ONS,0.03099999949336052,22e58399-428f-4633-9ee4-e5fa0db68d6d,3da4fd3d-ac5e-409d-91fa-36516673cf57,"olm:{(0.0,1.0)}",,,,1,660acf3d-706b-4daa-83e7-af1edcb02804 +de5aeea7-2505-4f0d-9d53-22a5287ab8b7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(24)-NS_NET126_F2_(25),0.028999999165534973,625bdd2c-a75f-46ef-850c-ca4704d56e55,1dcddd06-f41a-405b-9686-7f7942852196,"olm:{(0.0,1.0)}",,,,1,121eb9fa-9cd8-49ef-a5c5-a382596b9d9f +b714db4a-db55-4957-b503-2300559bb81f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_2-NS_NET116_S2_3,0.029999999329447746,d53ff076-dadd-44f8-85d4-68f48991f7d0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,"olm:{(0.0,1.0)}",,,,1,567497fb-f77c-4e25-a030-9d40b377711c +c6d6ca9d-042c-4525-9221-65bfa04477a4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(13)-NS_NET126_F1_(14),0.03200000151991844,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,b7baa286-cbe2-4143-a08f-4e025af47529,"olm:{(0.0,1.0)}",,,,1,9f3e546f-f81a-4602-8ceb-4401abceb42e +094a0827-54d8-4ed9-bb8f-2766db020c87,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(20)-NS_NET146_F1_(21),0.05999999865889549,7d45f0ab-1e6b-452f-b665-c4846cf046f5,92cb5065-2e57-4099-8e29-75cbc0c80370,"olm:{(0.0,1.0)}",,,,1,0cbc7c1e-1146-40bc-a87e-a4293f1b8765 +73c09f1f-3538-4b5f-acbf-38b686a0dbba,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(2)-NS_NET146_F4_(3),0.04699999839067459,b37ea333-65e1-4211-8449-993b67e8e0e2,b5548457-5923-4d52-b3c9-fdb75a1df98e,"olm:{(0.0,1.0)}",,,,1,1659f544-bc4d-40d8-a62b-70dd611bfc33 +1bb0764a-82b8-4f4c-8208-c9c58b8b92c0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS1_02-MS1_03,0.5,32b3bb19-c52a-4a19-890a-94a8918d38a9,787237ad-b3a8-4f2c-ab70-31c5113d82d7,"olm:{(0.0,1.0)}",,,,1,b3546eb6-8ac0-42c7-b5ee-ad0ba3cdd21a +52df9c70-136a-49bb-9ad4-d300123c7e99,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_02-MS3_03,0.5,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,e4502c52-b4d7-4082-a583-b5688d8244e0,"olm:{(0.0,1.0)}",,,,1,f3a219f3-8999-4b77-90b8-7f78b4a884a8 +a3c0115c-42eb-48a9-a6b0-64635ee66b87,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(11)-NS_NET126_F3_(12),0.019999999552965164,4258f215-5b22-446f-a260-e8cdaa7c95d1,eb125953-31d3-4207-adf7-aba3a3790d6f,"olm:{(0.0,1.0)}",,,,1,62829e00-c835-4fea-b47a-104d258a5393 +041991a2-c961-44a7-bfec-29cccd9a7831,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(9)-NS_NET126_F2_(10),0.017999999225139618,a286f73a-20ee-4056-8129-c7963b34ecd9,3d81adf5-73d1-4708-b03b-3afc7db017f4,"olm:{(0.0,1.0)}",,,,1,22a27f37-a8dc-4316-9795-7525ee7a0ac7 +2424f0ab-9f83-464e-a960-093ab14a2bb5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(17)-NS_NET126_F3_(18),0.020999999716877937,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,"olm:{(0.0,1.0)}",,,,1,fbd5c9d9-96b2-4270-a927-c7a604f032f1 +6bbccaac-2bbe-4d0b-bb07-80dbb605ec1c,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(20)-NS_NET126_F2_(21),0.02500000037252903,de756ddb-793d-4b2d-959c-59d938a8f61f,1dee13af-e638-4858-9c69-0069190cd577,"olm:{(0.0,1.0)}",,,,1,fb585936-8df9-4d57-9545-0372de271044 +060f10e1-2ffd-4972-9ace-7fff8df78658,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F2_(21)-NS_NET146_F2_(22),0.024000000208616257,bd292f64-65e8-42ec-9b78-b9b9f013750e,5862f526-783a-4218-a463-3cbf5de8dade,"olm:{(0.0,1.0)}",,,,1,2ae4a009-1481-412f-aa25-9d74b23a60ce +088e3b53-78f3-445a-bbc6-9da3efbda0a3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F2_(1)-NS_NET126_ONS,0.02199999988079071,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"olm:{(0.0,1.0)}",,,,1,7374aedd-b0cd-467c-99e9-fe3b26adb3b7 +cc8bc119-79d7-479b-8767-8b108a0ba4a0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F3_(20)-NS_NET126_F3_(21),0.020999999716877937,732f83b0-b9c5-4b8e-86fe-753c26f40e78,5af425fa-6ed7-43e1-8898-7af1315128c5,"olm:{(0.0,1.0)}",,,,1,bc540add-8fdb-43b8-b98a-7989b11ff268 +b13204e1-02fa-49dd-92e2-c3310a15909a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(18)-NS_NET146_F1_(19),0.029999999329447746,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,1f040625-ad1d-409f-bd7e-944c4d805e46,"olm:{(0.0,1.0)}",,,,1,b859db2f-036d-4697-887f-cb9445bc0814 +2cbfd089-e602-4f64-8a5b-86a6ecc56d32,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_04-MS3_05,0.800000011920929,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,86dfce49-05b2-4208-a6ae-877c3e98e6be,"olm:{(0.0,1.0)}",,,,1,c130b080-9569-4398-b66f-ee3ac517daca +1cfc85dd-3fb8-48a3-9ea1-b11b1b9ca8d4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(7)-NS_NET146_F4_(8),0.041999999433755875,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,"olm:{(0.0,1.0)}",,,,1,ad9a28fb-b6c5-447f-847f-14480a638bfc +5001666c-1331-43f9-8b09-3667c89951d4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F4_(15)-NS_NET126_F4_(16),0.04800000041723251,55b3d03f-2204-4ab3-84cc-a28476868c9d,b8fa1f73-223c-4b08-a140-44f12484cce3,"olm:{(0.0,1.0)}",,,,1,c21290a1-ce12-4bc1-be0b-3492c9399da3 +2770ee0b-96ca-4677-9933-8d82643501e3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(11)-NS_NET146_F4_(12),0.05000000074505806,8b3e3802-5213-46d0-a498-15eb6e5852b5,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,"olm:{(0.0,1.0)}",,,,1,333e8b90-4af3-4385-a845-ce1e56549bad +d48db7e8-5fde-456f-8b17-02d18a5a2e32,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_S2_4-NS_NET116_S2_5,0.029999999329447746,e05c68b1-11cd-43fd-a4b2-31e4db380c78,32bd37df-255b-4eb2-9d16-5b711132eee6,"olm:{(0.0,1.0)}",,,,1,b42b9195-4953-403f-8e52-55cc8e653c94 +7f853fc7-6d3e-4086-82b0-cc93c8257f46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(1)-NS_NET126_F1_(2),0.023000000044703484,4303784e-7193-454a-9be4-3591400b4eeb,a7ebd30b-b843-405f-9fae-ca6b489601f9,"olm:{(0.0,1.0)}",,,,1,673692bb-40e7-4793-8010-59a6c825fb0f +8c6b2196-6705-45ec-9879-8334924f968c,"{""type"":""LineString"",""coordinates"":[[7.39249992,51.81000137],[7.39249992,51.81000137]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(25)-NS_NET126_F1_(26),0.028999999165534973,3a2f199c-2966-4b9a-939b-3a6c9924341c,3802b603-d08d-4031-b7d7-e29734bcc122,"olm:{(0.0,1.0)}",,,,1,3f4a87a8-dd17-4b3d-acfc-10453391acc6 +7f2e8019-f650-42b7-bd39-6895cb9c4d9f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F3_(9)-NS_NET146_F3_(10),0.03200000151991844,6570535c-0d2e-4846-9951-21559902f67a,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,"olm:{(0.0,1.0)}",,,,1,7286023c-864d-476f-8b54-f23179ed906a +a7a76517-7239-4a95-b9b0-0027cddfa77b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F4_(10)-NS_NET146_F4_(11),0.07599999755620956,ffcaf979-d707-4d25-8f46-f436f9792d7f,8b3e3802-5213-46d0-a498-15eb6e5852b5,"olm:{(0.0,1.0)}",,,,1,1d393258-37f4-4e4f-a77f-781524a55083 +d74febce-1b8d-4f51-9721-5eb1866d6b4e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS3_06-MS3_07,6.0,39dbc5ed-d874-48a8-9128-e970436a94b4,40b0f497-96a3-49d9-9503-8fa67a5b532a,"olm:{(0.0,1.0)}",,,,1,459cc17d-3f08-484b-a886-33c987466b5b +97ce398b-de56-4b28-925c-a37f9029e875,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_MS4_05-MS4_06,0.4000000059604645,ee384ace-040e-4f21-8a8a-d702ab51af55,fa6d5184-b205-4b1b-839f-7b21ac956c29,"olm:{(0.0,1.0)}",,,,1,2cbe87fe-c770-4b7b-b1ac-6e52ea35682a +b140dccb-7251-496b-9402-06ebd13048c2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET126_F1_(24)-NS_NET126_F1_(25),0.02800000086426735,4f2402e8-664a-40f2-970a-abc098a2a0d1,3a2f199c-2966-4b9a-939b-3a6c9924341c,"olm:{(0.0,1.0)}",,,,1,f5402aea-e1ab-43a3-b65b-a101e7358a6f +f93f5e08-f351-4b2b-8cb0-9ec01203c1b9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(28)-NS_NET146_F1_(27),0.029999999329447746,012c9eee-86c2-494c-adcc-bbfc481e4a46,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,"olm:{(0.0,1.0)}",,,,1,d3293c00-7bc8-434f-bfc8-b90cc2ff85be +edbbe75f-8d40-42e8-a6f4-857f64547cbd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET146_F1_(32)-NS_NET146_F1_(31),0.024000000208616257,033d0230-4aee-47cf-91f9-81f5f40e60b0,5e213f42-d93e-45c5-a295-adbe09105746,"olm:{(0.0,1.0)}",,,,1,c1eab793-7cb2-44b1-a309-e6a96e5ee80e +25a1e96e-b425-48bf-a3ae-dc54ea9da47f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",LTG_NS_NET116_ONS-NS_NET116_S3_1,0.029999999329447746,31a2b9bf-e785-4475-aa44-1c34646e8c79,4a6f6058-e654-464d-9367-2dca7185c6d7,"olm:{(0.0,1.0)}",,,,1,cde5f3a8-4a99-49b7-a7e7-b73e1c6d8003 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_type_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_type_input.csv index 056c33fb7..fd5ffebb0 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_type_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/line_type_input.csv @@ -1,9 +1,292 @@ -"uuid","b","g","i_max","id","r","v_rated","x" -803c298b-61c6-412c-9b60-21cabc5bd945,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 -f66fc57d-f2be-41fd-bc60-d1177b091ac6,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.069114997982978 -f265e497-3a6d-4f96-9329-a7644cd8e785,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 -d3293c00-7bc8-434f-bfc8-b90cc2ff85be,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 -0cf49259-c126-4602-9b8a-764208d67914,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 -9ac19e4c-0379-4aaf-a96a-b2e71462abb3,0.0,0.0,800.0,Kabel_110kV_1,0.0283,110.0,0.11 +uuid,b,g,i_max,id,r,v_rated,x +c3e20038-888d-4d19-91d0-9732110ff433,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +491312ff-b705-4baf-ad5e-139ca62abd13,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +17e87208-d092-4514-8b23-ab91598798ce,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +000a8091-6782-41a2-aa13-fcf0056989d1,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +7eb50926-f5b2-4fc4-b293-c679eaf19f65,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +6986321a-0a85-411e-8b2d-9d929a7f298b,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +34bcbd39-34fe-4ba4-896b-e123e597985a,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +fe7f2726-e60e-4111-9577-61f332eebf2e,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +d639d54f-19ff-4b56-bf41-206c1736258c,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +3bfb3448-4aa4-4390-88ab-b73e539c336f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +86828e8b-9ff2-4bb6-8a32-f291c397acea,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +af9a3ab2-48e6-4972-b589-8baae5c74fb9,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +f3a219f3-8999-4b77-90b8-7f78b4a884a8,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +a246d41e-4ad0-4dbc-9261-99104c22f0d8,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +899d2b91-69bc-46fb-a4bb-0b97c7c8751a,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +f8b900a6-7d3e-41b9-b5c6-48eca9153984,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +d4ff2175-de32-4f24-99ad-ab11517444f9,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +f24aa8ff-676a-4638-a1b4-4c16566079e8,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +bc540add-8fdb-43b8-b98a-7989b11ff268,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +36876e77-ccb6-4cc1-8508-d1728c149a07,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +9d193d4b-29bf-4cf5-9ff0-ab04185a6486,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +184d5283-e90b-4ad1-9a28-51f09df26312,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +71d2059f-ed6c-4cd1-9c3a-28b3409e93bb,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +342054c6-c0dc-4b03-b914-6bdc69c17d1b,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +bdcb3549-eb2e-4903-8f0d-cf6a2166c09f,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +f564bbec-720f-4299-b516-e576f02152c8,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +1659f544-bc4d-40d8-a62b-70dd611bfc33,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +e8fb78e6-329b-4968-b748-48d27078347a,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +29ce3d34-1e26-468c-af62-19ff0d0fd70f,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +a34786e0-a3f2-4420-8754-9af63551cbf8,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +7482222e-f925-4004-abdd-0b69ef453d8d,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +5287c56e-1a3f-4265-bdf6-bad967e03478,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +fa07a917-4d21-4e0b-abc4-527420509063,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +6fefbb49-0419-447c-9431-657cb0dc29fe,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +f6ac868a-f7c6-48b7-a86e-ede7100859ea,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +235dc9e4-7328-4386-8ca5-ce9c3202210e,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +ca622ca6-25e3-4ddc-9516-99e2376ded1d,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +1173fa67-2573-4476-aa5e-c3fe756a7f07,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +3cde9801-6334-4e0d-8994-6d18b3906a71,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +b3546eb6-8ac0-42c7-b5ee-ad0ba3cdd21a,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +2ae4a009-1481-412f-aa25-9d74b23a60ce,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +471b943e-0115-4262-beee-ebaef1503b09,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +7895fb66-d867-4e4a-bab9-ce5165207321,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +29925a58-7664-486a-a503-ab0d994c9e75,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +ceb28bd4-0090-4920-bedc-4f66968729dc,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +69cea08f-72d2-4f65-b4b9-ae0a137da20b,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +98d23c1c-fd2a-4257-993f-55663b42200b,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +3b41ea67-4e64-466f-9932-712b23fcf7df,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +5f39d862-cf14-4619-847d-1b77eaa80546,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +0bfe6869-6869-438d-918c-e697955a922f,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +c2618b8d-df63-4bc1-8eab-3ce2fd74e183,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +267979b1-af4a-4ae9-a22c-3e0234ce2271,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +64336228-e311-47a6-aa65-4e2883352109,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +8bd8a653-39a7-420d-976d-68d9492601bd,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +7204651a-462e-4a96-ab91-9bec7dbdcb92,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +9f3e546f-f81a-4602-8ceb-4401abceb42e,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +12ccc9e0-9987-4c1c-b176-84574ab2d262,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +1ede9038-2ae8-4794-839d-f60f70d50177,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +6daeb4b5-b137-4ed4-8bac-f6193d5daf33,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +62829e00-c835-4fea-b47a-104d258a5393,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +fbd5c9d9-96b2-4270-a927-c7a604f032f1,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +d03eee1c-0c11-41c4-90a3-2743ab894974,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +6ac4e62e-72ef-4772-8148-58586dd8d461,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +b2edb582-9e3e-4381-8807-75abd1710902,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +0610293b-068b-4851-927b-618da07e6fcf,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +6e3b7cd2-87cb-4155-a5a8-1e7ad6557a47,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +be79605e-39e3-4a53-b27c-33b5b80e8832,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 c940e435-0523-419a-90bc-f3dbf2e463f7,0.0,0.0,1360.0,Freileitung_110kV_2,0.0547,110.0,0.4 +44f95594-319f-47ba-9df2-5d9833e47408,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +cbe6053c-f1fc-46e4-8c47-1291d84083ba,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +f181cb5c-2234-49d5-9e3f-d21f14963074,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +6d1930ba-b144-459f-9a7f-463c0a0f46b4,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +87591389-0527-4fe0-8b33-7800b89a50c6,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +2cbe87fe-c770-4b7b-b1ac-6e52ea35682a,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +b42b9195-4953-403f-8e52-55cc8e653c94,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +b8bec046-5587-4a35-a262-233452558bfa,0.0,0.0,800.0,Kabel_110kV_1,0.0283,110.0,0.11 +f2a9246c-1d44-4903-b6a1-f038b786c01b,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +6fab725c-b58a-47eb-957c-9ca99f4558ce,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +7286023c-864d-476f-8b54-f23179ed906a,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +89a28eeb-daae-4a0b-bfd5-6c5ba90f7440,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d3f48b67-8081-41a8-a9ea-2515ef4c70ee,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +5670305b-68cf-4b9a-ab60-ea3bbd57afb4,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +7da1277a-931e-48f2-8d9f-810e49e0b8ec,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +b0640c38-10d2-4f95-aa23-afbd8ad7f21c,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +b859db2f-036d-4697-887f-cb9445bc0814,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +f1974038-6ca4-4c43-8cf9-b9e6988b035c,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +5050a032-62b4-4239-aa13-9672c890e74a,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9db7e41e-7360-4529-bbdb-dbd220117f61,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +7e6f9030-73ff-4fcb-a384-f71820af1a41,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +4318646d-6b12-411d-9fe1-6151c5106479,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +01b81835-2d2a-4e5c-bf78-cb1e789f2d0f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +e745cdd4-1c30-447f-8694-d3b3d2e01a96,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +a4aab125-8af4-4ef9-8842-4cf718f998bc,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +a61bace6-0050-436a-8715-0e042a8582f6,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9989a72f-2587-4a15-804e-e81d9af7ee93,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +04e8252c-c3f3-4a4e-a11a-a182e94c382e,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +7445744d-21dd-46ad-805b-1d8b8a470294,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +f265e497-3a6d-4f96-9329-a7644cd8e785,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +e0c1129d-75ba-4639-928d-2f43eeabc88e,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +3362b510-7d57-44b1-a6cf-8081aac84a5b,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +0615b7b8-e7ec-4771-9e68-f02948044da2,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +a2f51a3d-5e1e-41cd-8be6-696ac1a12d52,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +ce61ee4b-0244-416f-b3e0-80577b58781c,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +803c298b-61c6-412c-9b60-21cabc5bd945,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +e6b134f3-2f34-4bdb-a353-0de86ef64651,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +ec77a581-8148-4b2c-bb6a-3f7c24ebb93b,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +33e2dfb4-60cd-4b99-b7ac-bc28267e8b9c,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +5c01eba4-8697-4e06-82f0-7ffd7bb43715,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +3124880e-a2af-42a1-be47-841a8176e7b6,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +b4dfd39c-38ec-4883-adf7-413c0662694a,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d5addbe0-2d36-489a-8552-b3a0e66aa5b8,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +8cb6dcdc-c648-4c54-8cda-1df69f317b47,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +3d684e78-d7ba-436f-b223-c2f50de8d7ac,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +9987d3ab-2135-4c6d-bb7b-209659ab9356,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 d0f81106-444d-4832-ad0b-a293d719206a,3.0,0.0,550.0,HS_1,0.109999999403954,110.0,0.379999995231628 +fa60cbc7-5599-4409-b866-dc05a5b27235,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +6f8f3927-ac51-4b7d-a23e-8e429949f345,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +970e0436-65e3-48d6-9d9c-1f194f94f02c,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +612f81f3-5f7f-45c7-ad13-f729ef2ee07d,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d334240a-49ef-430f-8924-3d3104b636ba,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +7513c490-99e4-4d11-983d-3d6bcf8dea93,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9bcd4dbb-18d3-43af-85e0-e475f6371030,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +5b2b259b-1155-4130-b119-afea37851952,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +5f05acb2-b125-47e1-af39-878997a48981,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +ea01036f-5b25-47dd-98e3-0d944fd2e670,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +cb059d73-c67b-41d4-9c49-844c12351e77,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +048a2c36-6fbc-43ec-aa92-3807f7bfec50,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +f66fc57d-f2be-41fd-bc60-d1177b091ac6,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +763854f1-b1c6-44fb-a458-c7878ac026e5,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +8bfec339-14db-48d1-869b-c46b602a5940,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +ce1623cf-68c5-4f91-842a-2845ca7aa0e1,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +744ea833-d481-4583-99e7-4e83728ea176,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +df4aeff9-dacd-4326-9126-58e39f4161f9,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +f5402aea-e1ab-43a3-b65b-a101e7358a6f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +ad9a28fb-b6c5-447f-847f-14480a638bfc,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +1dd89c18-1436-4212-a053-5c6435368da5,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +03627bdf-9d77-44d5-a9c2-9e3109ec8a32,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +c27513a1-3d09-4f03-9fdd-cdf15cb83dfb,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +51eff3e4-bffc-42b0-89d0-5c4756e128ba,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +82bc6482-24eb-42dd-8dc3-e05b86696a22,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9a3869ee-c4b1-4b3a-89ce-02d79a2cf4ad,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +9ac19e4c-0379-4aaf-a96a-b2e71462abb3,0.0,0.0,800.0,Kabel_110kV_1,0.0283,110.0,0.11 +c130b080-9569-4398-b66f-ee3ac517daca,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +3654a929-29a8-4945-80df-5fd5a7ab6218,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +b3cac110-acef-4ec0-9139-3858a4c36acc,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +0417354b-2a35-4499-965d-24b153f98769,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +b63674e1-6827-4e8b-b3e6-34ee6d4823a9,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +90f47116-bd6e-489b-b5c0-8db3ff905d4b,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +80eb9e25-4a5c-49b6-bb57-8fa7cf5dc035,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +0b2b2d0b-0bff-4b57-b505-78d70f9a2d96,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +c1eab793-7cb2-44b1-a309-e6a96e5ee80e,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +f4a72519-d0f2-4208-b7c7-032cb5e5516d,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +98940ea1-18b6-4823-99aa-ede16c31602f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +716ef541-2872-42dc-9304-6c2d840c1f0d,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +359e568b-3167-4c1b-9e94-6e6aa74e36cc,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +97a2a008-5c56-41d4-bef2-f1af45f2925b,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +e04e5d5a-1f24-40ce-9869-1835e0ade796,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +4f86b68c-cbfe-4f1c-b849-dd17c640aa7c,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +2f625e1a-ff4b-4379-bd79-e309d5841ffb,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +b8e2950a-6213-4502-bcd3-16a287428fbe,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +6a818827-ddba-4916-ab33-2c326d3c5745,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +5806cf0a-5c5c-44ec-ac36-83a0030fb9dc,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +6d8c33a0-9d13-40fb-a8ed-66f653461521,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +e4d237c9-b025-4838-8b12-34bbf1265fb9,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +22a27f37-a8dc-4316-9795-7525ee7a0ac7,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +785dc700-c099-44fa-88b8-4242184395cf,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +dffa0c85-3ad7-4cae-b3f4-48bc41826b84,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +103e89f7-9c1d-459d-abb8-cf964570340a,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +0d9b5a69-e04d-4617-b46d-6ddb64ca815d,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +6eae5d86-3269-4d7c-aca6-150008d85eb2,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +6bc2f42c-d4bb-422c-9aa8-6255d18bf010,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +ec6693de-2458-4ace-b303-4ef744f72884,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +e0de3267-5ef6-4fcb-83c9-771d53e7fde8,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +c4caf964-fe70-47f4-9596-b52418ee8d39,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9a7fdf17-f929-42be-98fb-cf5778ce4358,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +82e77523-a1ad-40e4-a7d1-0a9ae55a5b2f,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +673692bb-40e7-4793-8010-59a6c825fb0f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +d4890af8-3627-4397-b962-31e5ae9a8164,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +0ce5f7e7-51b3-4da3-ad12-1c50dc44c6c9,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +58f4e0dc-7dd3-4890-af41-0a1730aa0e1d,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +0ae22511-6661-4a9c-a3b4-62e28f0c6301,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +0d77358d-422b-4f97-8eb9-b36f717da4a2,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +a4c7ef55-d178-4967-a6cf-8a762672d27c,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +5373af9c-0365-498f-959d-80bf86bd9a26,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +03877157-9a63-40f9-a4ba-12b86cf2ccd4,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +a61d2b6a-2ae3-4e87-b69c-d6ef03746edb,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +333e8b90-4af3-4385-a845-ce1e56549bad,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +28c423bf-1639-4599-847c-d0db54b6d55d,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +b1614223-e9ef-4551-b50f-074d368a4289,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +54a5e86e-8535-427e-b07b-638ba00913a5,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +04a91974-26b9-4b6c-9c0a-31f4bcc9c8d1,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +b6264d92-34ba-49db-bb48-9a1d16e78482,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +abbe9d99-e6b5-4958-9637-b3a36e3283ce,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +85771d96-26ec-47d7-b8ef-f991a0bb996e,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +0250b2f4-4cbf-449f-87ef-b90dc451673e,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +b0242798-3ebc-43b5-b26d-0afc2e3af126,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +c6ec6f58-dae8-4dcc-b486-d0ba6df880c6,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +fb585936-8df9-4d57-9545-0372de271044,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +8c9f87cd-141c-4ba9-a017-5fcde0e542a2,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +567497fb-f77c-4e25-a030-9d40b377711c,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +b6c5b4cb-fc54-478c-9e57-0b5204e06120,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9f363635-277f-49ad-9d59-17ba6fe87989,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +ab79d7fc-15bc-4ab6-bd7c-432ae87839d7,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +9aafec57-d20c-4d25-9a12-0ffb299eddda,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +1568ffdb-4504-4dce-b1d4-680a286f52b2,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +76530f38-d7be-4e8b-b1f5-cfe49b59388f,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +7e56f483-33df-4eb3-b80d-787dcd1d5fec,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +29538d4e-9d99-4701-b21a-0d8ee5b665de,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +8ad70eaf-8f88-49ac-9369-556f8d4e4981,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +0cbc7c1e-1146-40bc-a87e-a4293f1b8765,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +1846cb8f-2d1f-48ec-a73c-9f9a8392bf1f,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +4503f215-7ded-4230-9f94-e8ce4f2560ab,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +bb9bd979-bf7e-48cb-840f-e63e85f00911,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +1a77afda-35bc-4902-a32e-a3a8f3d1a88a,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +1d393258-37f4-4e4f-a77f-781524a55083,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +e3a643fe-bba4-4a7f-83db-23b0e03c923c,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +2de36fa6-bedc-413d-b9ea-ac1a47459531,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +809a36fc-7f08-4800-8714-2b6607974a43,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +2c4f86a0-5161-4f3f-b6c6-bcc9c7c0ed4e,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +afc0f157-2fcd-4435-8cc1-46b29f8c799a,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +0d7473a5-dd01-460f-a1ee-624d10f34c8e,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +7b2c7e95-87c7-4c2d-8174-012a138f9c2f,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +152c2e89-46ec-4b21-9cea-5c10420de37b,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +138c7831-202a-4f00-9a5f-8c205a810816,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +8c6655c4-4ab0-4eb9-9ef3-ccc4c1c58b86,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +6734c033-4156-4e9f-b924-2f5d6aee5c7f,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +a4a49bc8-ea2c-4728-8c40-d6863e46f042,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +9b5784f1-0ae5-4692-9deb-3d74743f59e0,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +fdae377a-76ff-447c-a64b-ae3a431691a3,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +cb8e491b-e99f-4a68-a0e0-dfa07b77ca7f,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +dc2dafb1-dd6f-489e-9fb1-36d029b03980,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +c56980f1-59a0-4966-8743-a6a8165efdda,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +9c4d86bb-ab1d-42ff-a5f2-4d1f39778f6c,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +d03f95b2-28c1-41cc-a80b-768a2a2f4788,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +9312de84-9197-462f-9d69-7d2fea8f7f68,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +37b03eb6-ef0f-48c2-ba36-e1a5ed1747b4,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +c435432c-3647-4b5b-96e1-ac1e32a546e4,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +54b7a190-585f-4a05-a07f-840289540a3f,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +0622aad8-6436-429e-a46b-4e09adad1a6c,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +a0318665-d079-4454-b335-67a08d52063e,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +90499632-fb19-4b07-9726-8741307a2f77,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +2c4b31fd-9662-4b0a-95da-bab5a1b541cd,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +e2ee2ab1-8e22-41be-9a1f-cfdee99d611e,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +2440030d-910e-4a4b-ac70-15f09e34e23b,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +ddfd9f5d-c943-4c9a-a019-58ef25e3cbb1,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +98d060f1-bde2-4649-92e9-c818ba66f474,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +c21290a1-ce12-4bc1-be0b-3492c9399da3,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +9bdff8f4-9fc5-4bb4-a346-786543058f6a,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +01ef6262-ae52-48e5-833c-aface9a34b35,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +33bf42ab-01ba-493f-a92e-de302649b490,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +91bec055-7ab3-49f0-940d-f7399bbb129e,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +660acf3d-706b-4daa-83e7-af1edcb02804,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +0199a8ad-0453-4362-90a8-49ee825029ac,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +caf07358-b134-46ae-a7f4-7c64d06ab25b,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +b8c8070f-0668-4a5c-bbff-4326670eedc3,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +b44c03a0-c838-4de1-b329-e2df2a769d53,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +21efe2be-86c1-4d0c-ba01-f77b01632ddf,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +be6b1366-0282-427c-99fe-7ee0ae092652,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +110964ab-decd-4f63-af13-dfe2ee499ba7,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d8c2bfa8-4782-4989-afe9-4f69e3c42ae1,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +6c4bc7e5-6510-43f2-b370-89e5426d8364,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +71bc51af-be08-413f-8165-90822ffef011,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +28ff8422-4924-4669-8352-2d5fd68a084c,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d865f47b-3f99-4ba1-973b-4bdb6fe2414b,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +5407472c-b967-4600-864d-c79362f5658c,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +3be9f63d-c316-4aa1-8695-6cfcfac29790,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +a63fd579-c35b-4870-9173-0fd383364c6f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +0ef707b4-69a5-4e4b-95a0-91dc0752aa46,0.0,0.0,680.0,Freileitung_110kV_1,0.1094,110.0,0.4 +c9444107-2d82-4591-a80e-eacc5bea633f,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +29a0785e-569d-4941-b7a3-9f4710dcb749,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +0cf49259-c126-4602-9b8a-764208d67914,191.636993408203,0.0,300.0,MS_2,0.207000002264977,20.0,0.0691149979829788 +a7071b97-2be4-40bf-a0b1-b8faf6bff6d6,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +121eb9fa-9cd8-49ef-a5c5-a382596b9d9f,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +63a743b3-b45e-4862-b571-b4448545fb21,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +8f7197d4-129a-4493-9a21-55e258d7b6ed,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +75e63c65-ec08-4c59-aef2-3db3f96904cc,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +cde5f3a8-4a99-49b7-a7e7-b73e1c6d8003,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +ba85a896-08d3-4b95-8a21-1c06f29513e4,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +3f4a87a8-dd17-4b3d-acfc-10453391acc6,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +9da326a4-b96c-4e3c-bcd2-58be00a460cb,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d3293c00-7bc8-434f-bfc8-b90cc2ff85be,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +7374aedd-b0cd-467c-99e9-fe3b26adb3b7,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +d984e978-5734-43e7-ac15-fd8cb4d281a6,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +4ee89e0b-1e97-4dde-ba57-3b0b862957c5,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +ce8ff61c-97fd-441a-914a-250c0dc80ed2,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +e5d110d3-321b-4726-bc51-e265f83891df,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +62a6a50e-8d16-415c-960d-8ef133627350,191.636993408203,0.0,265.0,NS_3,0.253899991512299,0.4,0.0691149979829788 +f8b5526a-2f8b-4937-864a-4162157a98be,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 +459cc17d-3f08-484b-a886-33c987466b5b,85.7655029296875,0.0,361.0,MS_3,0.165999993681908,20.0,0.117200002074242 +f701322d-3c8f-4c18-9259-117ac854df91,185.35400390625,0.0,235.0,NS_2,0.319999992847443,0.4,0.0691149979829788 +b423a5cf-ca70-4a11-9b97-07d002a10837,163.363006591797,0.0,195.0,NS_1,0.442999988794327,0.4,0.0722566023468971 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv index 5c2ebd341..349524ca5 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/load_input.csv @@ -1,497 +1,497 @@ -"uuid","cos_phi_rated","e_cons_annual","id","node","operates_from","operates_until","operator","q_characteristics","s_rated","load_profile" -c2402412-97fa-4ca4-aa66-e6e04d010001,0.9700000286102295,4000.0,NS_NET126_L_F1_(36),ca3391eb-ca94-4945-ac72-e116f396f82c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -fa8ef266-5b15-4fdd-a145-71ba95e3463d,0.949999988079071,4000.0,NS_NET146_L_F3_(17),0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4dd0785a-482c-47e3-bb82-e315083684d1,0.9700000286102295,4000.0,NS_NET116_L_S3_2(6),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9b027eb7-abfa-43ef-8eae-b20b47a631e6,0.949999988079071,4000.0,NS_NET146_L_F3_(18),85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7bbb2c62-36f7-4aab-8802-e3ddf478adf2,0.949999988079071,4000.0,NS_NET146_L_F3_(14),3dec12fd-3dc6-481d-be05-8df9df7f0c5d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ec035312-7214-4060-a502-71cbe819f32a,0.9700000286102295,4000.0,NS_NET136_L_S2_1(1),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -40ddb9cf-46f1-4ee6-8feb-432affbc95bf,0.9700000286102295,4000.0,NS_NET116_L_S2_4(1),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3b9ae1ad-11e5-4fb5-ba03-9027e39c33b4,0.9700000286102295,4000.0,NS_NET116_L_S1_3(8),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -16cd0d9b-bbaa-4d71-ad87-b8e834cf478d,0.9700000286102295,4000.0,MS2_Last_01,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -c806a93a-5f1c-47ba-9c67-31a86ae2658c,0.9700000286102295,4000.0,NS_NET126_L_F1_(39),60173008-809d-4d8f-b06a-3c4a838dd989,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -5b821f32-64d4-436f-9840-40d04872f20f,0.949999988079071,4000.0,NS_NET126_L_F3_(12),eb125953-31d3-4207-adf7-aba3a3790d6f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -dcaeda6e-2dfc-4b53-9c25-cf51d486bb34,0.949999988079071,4000.0,NS_NET126_L_F2_(21),1dee13af-e638-4858-9c69-0069190cd577,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c78b87bd-855b-4741-9e82-c9d814dc5a7c,0.9700000286102295,4000.0,NS_NET116_L_S2_1(7),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -aef6783d-889c-48a2-bdf5-7a9086a73548,0.9700000286102295,4000.0,NS_NET116_L_S1_2(7),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9cc70cc7-642f-4fb1-9782-20a446368645,0.9700000286102295,4000.0,NS_NET136_L_S3_4(1),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2de16d4b-e4e0-41e0-ae33-105930964fcd,0.9700000286102295,4000.0,NS_NET126_L_F1_(31),80d8252b-045f-471a-9638-416ed3f86120,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -07ac3307-90a9-4d74-9434-b977741a8858,0.949999988079071,4000.0,NS_NET126_L_F4_(4),a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -590108ac-416d-44fe-b574-4069cea1dbb1,0.9700000286102295,4000.0,MS3_Last_04,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -df1ebc6d-1252-4496-98bc-50f6ff46a085,0.949999988079071,4000.0,NS_NET126_L_F1_(18),2f64bf67-cee9-44bb-8c13-ff96878932af,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a850c129-beef-48d6-9543-1e217a5349ce,0.9700000286102295,4000.0,NS_NET136_L_S1_2(8),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ceec9e98-5303-4df3-99e8-592509c19d74,0.9700000286102295,4000.0,NS_NET136_L_S1_5(7),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -984470e3-f117-4b8c-932f-caeacf10ff2c,0.9700000286102295,4000.0,NS_NET116_L_S3_1(2),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -94ef12cc-d3bc-42b1-b8b0-6177b93bb25c,0.9700000286102295,4000.0,NS_NET116_L_S3_5(4),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e87a4990-0f33-44dc-bb98-ca7dd38e2493,0.949999988079071,4000.0,NS_NET146_L_F1_(18),2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5fa8b3e6-ed79-4804-997b-4c6eb2c7727b,0.9700000286102295,4000.0,NS_NET136_L_S1_1(5),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -716dc985-7e6d-4681-b4d8-aa9c039a347e,0.9700000286102295,4000.0,MS1_Last_07,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -c9576364-4a47-450d-a25d-864dd12ef7fa,0.9700000286102295,4000.0,NS_NET136_L_S1_1(3),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a8f50827-29eb-4c27-a60c-fb74c3a5f3fd,0.9700000286102295,4000.0,NS_NET136_L_S3_4(2),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9c4f5e8d-b780-4e31-9bb0-37e975066beb,0.9700000286102295,4000.0,NS_NET116_L_S2_5(8),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3d297678-497c-4620-ad5e-1e70cea8119d,0.949999988079071,4000.0,NS_NET146_L_F3_(5),ce71377d-63ea-462a-9290-67e51946a098,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -895edb06-282c-4965-acab-36c8b86f8f65,0.9700000286102295,4000.0,NS_NET116_L_S2_3(5),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8d84639d-d746-49c5-bc46-33a2aae666e7,0.949999988079071,4000.0,NS_NET126_L_F1_(16),4f78fe6d-3cb2-4d99-8c67-4f14cb626813,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8cd07c7c-1264-4141-b90e-e2b6f39c44be,0.949999988079071,4000.0,NS_NET126_L_F4_(9),119d270a-ff22-4fdb-8214-cb5b336790bf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0c5d8e98-e059-4768-be56-73e0e8914092,0.9700000286102295,4000.0,NS_NET136_L_S3_1(3),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -06747e73-c108-40d5-8ce6-6538e38b4ef2,0.949999988079071,4000.0,NS_NET126_L_F1_(6),99e26ef8-75e2-46f3-aafc-6287bf5e3905,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5d09da2a-e37c-4cca-93fd-0bf61918a2b2,0.9700000286102295,4000.0,NS_NET136_L_S2_3(4),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7ce95168-5af2-4274-943d-601176146ce8,0.9700000286102295,4000.0,NS_NET116_L_S1_5(8),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -188c5841-af7d-48ea-95ac-7178dc7407c9,0.9700000286102295,4000.0,NS_NET116_L_S1_1(8),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1d96cdde-d9d3-4d47-b3a4-60474b9caa92,0.9700000286102295,4000.0,MS2_Last_05,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -130b7cb2-f379-4d6c-b71d-404d87260133,0.949999988079071,4000.0,NS_NET146_L_F2_(19),636dec7c-4242-46e8-b7ae-db7e5a28c39c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b4b07036-0d49-4f8f-9194-0181e11d0470,0.9700000286102295,4000.0,NS_NET116_L_S2_3(7),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0442c234-22f8-4022-8daa-2f191e4a6bf3,0.949999988079071,4000.0,NS_NET146_L_F1_(24),205fcee1-928c-4374-950c-34575f07fa49,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -29a47779-6c11-490f-a0b2-e33c6c7a06b3,0.949999988079071,4000.0,NS_NET126_L_F3_(25),1bf26b4d-03cc-4490-8c33-d3db8597d807,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2b20b17c-774b-4b41-a1e8-ef9d8f39b0e3,0.9700000286102295,4000.0,NS_NET136_L_S2_5(8),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -70fcdefd-49c1-455f-9ceb-013dcbf26887,0.9700000286102295,4000.0,NS_NET116_L_S1_3(1),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5d842fa6-eb7a-4f88-8dd3-f7eac01afaad,0.9700000286102295,4000.0,NS_NET146_L_F1_(29),867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -d7a1b657-6d15-45c7-8d04-d2eef97429b0,0.9700000286102295,4000.0,NS_NET116_L_S1_1(6),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e17786aa-4cf5-46d6-ad37-96f4d4502b1f,0.949999988079071,4000.0,NS_NET146_L_F4_(8),6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c22e9a91-f522-446d-8dc8-ae3e720a5053,0.949999988079071,4000.0,NS_NET126_L_F2_(19),52e15712-2572-442a-b22c-add48af95115,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1ec03866-9e92-43b9-9c13-1501533c8e1e,0.949999988079071,4000.0,NS_NET146_L_F1_(26),154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -26bf78c9-48ea-4004-9148-eaee014d6f09,0.9700000286102295,4000.0,NS_NET116_L_S3_2(7),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0a8bf78c-1e57-44f1-baee-0a8d8383875c,0.9700000286102295,4000.0,NS_NET136_L_S3_3(1),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5f58fa15-aff8-4a9b-bfc0-8ef690d6dba3,0.949999988079071,4000.0,NS_NET146_L_F2_(27),b179c38b-5af0-4304-84b1-1dc03314fd80,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a9f8dce4-b664-4bbd-9e52-c2ca6aa669aa,0.949999988079071,4000.0,NS_NET146_L_F1_(19),1f040625-ad1d-409f-bd7e-944c4d805e46,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -e3e2d73e-3dfc-42ae-ad50-fadebdf38868,0.949999988079071,4000.0,NS_NET126_L_F1_(26),3802b603-d08d-4031-b7d7-e29734bcc122,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -62800519-5f5f-4081-ae89-9b2b0784a714,0.949999988079071,4000.0,NS_NET126_L_F2_(6),9d7038e9-5bcc-4676-bead-46c4f1291ba8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1100ef62-0d33-46df-8ac7-c949d843217c,0.949999988079071,4000.0,NS_NET146_L_F3_(22),616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -33cd1941-51f2-425a-8f4d-67e00d0b1876,0.9700000286102295,4000.0,NS_NET136_L_S3_1(6),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9cff3e75-4374-48fc-a20a-27968427dc1a,0.949999988079071,4000.0,NS_NET126_L_F3_(5),f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2485a766-3e5c-4950-b598-0c3b84c747a7,0.949999988079071,4000.0,NS_NET146_L_F2_(4),369cffa5-bcee-4489-8193-1d9b10230eca,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5312d132-f5bc-4c34-98ca-16221a0111e2,0.949999988079071,4000.0,NS_NET146_L_F3_(2),0b2a3b46-5e43-4879-973e-d8fb96429d8a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8bd4fb73-bc7f-45c9-b1e6-916afd2e7359,0.9700000286102295,4000.0,NS_NET136_L_S1_5(4),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -05124256-80e0-43cf-a3c5-dc565ef38a07,0.949999988079071,4000.0,NS_NET146_L_F3_(27),55caf2ec-a21b-4afd-8830-1e4009cce396,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -283a1252-a774-4b04-bfcf-fe8879065982,0.949999988079071,4000.0,HS_NET1_L_S4,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -09fb83df-cd0f-4dca-a5b6-edc18d662e93,0.9700000286102295,4000.0,NS_NET136_L_S2_5(7),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f4536a0c-33d2-4c57-918c-0ebdf768265a,0.9700000286102295,4000.0,NS_NET116_L_S3_3(1),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -27f66b7b-f1ac-46e4-9c11-b9ff0d0f2990,0.949999988079071,4000.0,NS_NET146_L_F3_(31),b7a5be0d-2662-41b2-99c6-3b8121a75e9e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8df8d6b5-ef51-4901-aaed-bf29c912acd5,0.949999988079071,4000.0,NS_NET146_L_F3_(21),a4a44d93-48d6-4b87-8053-87fe0778e75c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d75d06ae-7ac0-491c-87ed-e1bb625e349a,0.9700000286102295,4000.0,NS_NET136_L_S2_4(3),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3ac82a59-756c-4ead-b34e-02957fc69ec4,0.949999988079071,4000.0,NS_NET126_L_F1_(21),14ae9865-cb9b-4518-9f2a-c0fda3455a42,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -96da3f13-3c72-4e9a-b433-a319a9018b40,0.949999988079071,4000.0,NS_NET146_L_F2_(21),bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -57d74ff0-f6c4-4932-93c5-9837d101297c,0.9700000286102295,4000.0,NS_NET136_L_S2_2(2),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a2d372db-d13c-4d3c-a987-ccf4138d43f2,0.9700000286102295,4000.0,MS4_Last_07,898d8295-bf35-4079-9374-99b059c2c956,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -182f6157-58ea-4fe2-92a2-90845427fbd0,0.949999988079071,4000.0,NS_NET126_L_F3_(13),f29859be-c6e7-4cf9-84d7-239eb98a9e65,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ae603fbc-a262-47ab-bea7-251fd61f3964,0.9700000286102295,4000.0,NS_NET116_L_S2_5(4),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2e7dda3e-4bd4-4bb7-8e15-260f709ab92e,0.9700000286102295,4000.0,NS_NET136_L_S3_4(3),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b5c6af22-2d56-4bd1-8235-74db06106eba,0.949999988079071,4000.0,NS_NET146_L_F3_(23),ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7f642ba6-1492-4bf6-9857-113c60a18709,0.949999988079071,4000.0,NS_NET146_L_F3_(11),e2267696-669b-48e8-b43a-37d0db95011d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -497de722-6c3b-49a5-8f1c-125c76a4a9cd,0.9700000286102295,4000.0,NS_NET116_L_S1_5(5),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1b64ea94-b338-40aa-92c8-144c7caaa8c2,0.9700000286102295,4000.0,MS1_Last_05,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -086208d0-52d4-4198-9f3d-966aa7a5557e,0.9700000286102295,4000.0,NS_NET136_L_S3_5(7),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fc5139da-5e61-44c5-8843-4f76df7c6e33,0.9700000286102295,4000.0,NS_NET146_L_F1_(39),904c7476-5f16-4ec2-9138-7d5e32d38a3b,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -abe6ade3-f1c5-41c0-a850-1292506f3837,0.949999988079071,4000.0,NS_NET146_L_F3_(10),4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cbb8c279-5b80-4583-bec3-b878ab0c2755,0.9700000286102295,4000.0,NS_NET136_L_S1_5(1),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b431628f-bc6f-49ca-9f23-19fe41aadb53,0.9700000286102295,4000.0,NS_NET116_L_S3_3(2),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -6069eb20-4107-483f-8144-5bd479e32d98,0.949999988079071,4000.0,NS_NET126_L_F2_(12),9d02ea80-98d8-4cd0-a635-9104a14a56dd,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c81fa33a-1c21-4646-b43f-b9a93baf04ad,0.949999988079071,4000.0,NS_NET146_L_F2_(5),0228ffcd-f6bc-47c8-b26c-fcc0abacd963,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -660e69f8-cba2-45d0-9d0c-f7d5be09451d,0.9700000286102295,4000.0,NS_NET136_L_S2_2(6),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ee33524a-6c8e-4c12-8b40-7a116e386dbd,0.9700000286102295,4000.0,NS_NET116_L_S2_5(3),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4c6e6e4f-d4cb-4de3-b406-ff3ec1d50280,0.949999988079071,4000.0,NS_NET146_L_F2_(3),0170837a-1876-45f9-a613-666f9991964d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d85bcbda-20fb-481b-bb8d-aead291aa3c1,0.9700000286102295,4000.0,NS_NET136_L_S3_1(7),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -86754cd3-ba74-49fb-bf3b-5702b4fd5928,0.9700000286102295,4000.0,NS_NET146_L_F1_(33),543f7e9f-b9be-486b-b365-2bae79010758,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -4dcec977-6c98-4bd2-b6f2-dc32d9c61cf2,0.9700000286102295,4000.0,NS_NET136_L_S3_3(4),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1a155e7e-9636-4760-a84d-430e293142cc,0.9700000286102295,4000.0,NS_NET116_L_S1_4(4),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e90dfb70-2372-40d3-9577-01d2145eb59d,0.9700000286102295,4000.0,NS_NET116_L_S2_5(7),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -85bfce37-1c9a-4e5a-84ec-47faf7b13821,0.9700000286102295,4000.0,MS4_Last_02,174fb4b2-4f9e-415c-bfee-d850ef751307,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -16b0791d-eeff-4b12-b1fe-2961bf0fd4c2,0.949999988079071,4000.0,NS_NET126_L_F4_(10),857c264a-7072-4bb7-af56-2f01539b2a2e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -aa1ce00f-1a17-4172-9040-9ba15b179a15,0.949999988079071,4000.0,NS_NET146_L_F4_(16),9f7599de-c488-46c5-b053-1279a511f7b9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -34671961-b8a8-49f9-a99e-c7b5a33c600e,0.9700000286102295,4000.0,NS_NET116_L_S3_4(2),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e4f045d6-7f37-4871-b357-621d97b9c2a8,0.9700000286102295,4000.0,NS_NET136_L_S3_4(8),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -58cb8168-7a34-41e2-9db6-88a67287c5e9,0.949999988079071,4000.0,NS_NET146_L_F2_(8),792b505c-87ab-4665-a31d-b6035c5ece70,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -35555bee-2634-45cb-888b-d850767955a6,0.9700000286102295,4000.0,NS_NET116_L_S1_1(3),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -6322878b-9db6-4481-858b-64dbd00dc091,0.949999988079071,4000.0,NS_NET126_L_F3_(26),dc022eec-16b0-4a64-a2f5-498d81aca71e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0cf1f5c4-996b-4422-b61b-b4fbc840d004,0.949999988079071,4000.0,NS_NET146_L_F3_(24),773aebe4-fc03-46be-8209-0213e2760a8e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8ef945c1-4586-4755-98a8-bff3ee581620,0.949999988079071,4000.0,NS_NET146_L_F1_(7),67c1746c-3af8-403f-983e-1c7c047383df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -61c9c21b-38a5-45b3-8a41-60df0bb698ee,0.949999988079071,4000.0,NS_NET146_L_F1_(22),1ee9de9a-0095-4b58-beeb-e56fb908844a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -81e75c16-c8a4-4328-bc97-635049829f57,0.949999988079071,4000.0,NS_NET146_L_F2_(24),970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -53ae546b-c94f-4619-a613-3291f26fb78b,0.949999988079071,4000.0,NS_NET146_L_F3_(4),f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c73800aa-9f9e-46da-83eb-82a88b2ab502,0.9700000286102295,4000.0,NS_NET136_L_S2_5(4),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8b9c12d1-5398-4c42-80a6-9604978de820,0.949999988079071,4000.0,NS_NET146_L_F4_(3),b5548457-5923-4d52-b3c9-fdb75a1df98e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -48ae1ea4-e001-4152-b54c-320fc9f35e92,0.949999988079071,4000.0,NS_NET126_L_F4_(5),de5ee252-ebb6-42b0-875c-77ae557ffbf6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9018c4d9-5b86-4c11-b5b3-2c26e756ad0e,0.949999988079071,4000.0,NS_NET126_L_F2_(20),de756ddb-793d-4b2d-959c-59d938a8f61f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3a2470e0-1d3f-4f33-990d-20c8b9611ac5,0.9700000286102295,4000.0,NS_NET136_L_S1_1(7),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1e79cec6-2546-4e64-92fc-c509d4eea216,0.9700000286102295,4000.0,NS_NET126_L_F1_(32),49b511fa-8cff-45f4-9a59-54faaaf90abf,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -a1af0e38-339c-491c-94d8-446cf662d89b,0.9700000286102295,4000.0,NS_NET116_L_S3_4(1),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -91d402b7-e8c7-4919-bdbd-93c1c8492920,0.949999988079071,4000.0,NS_NET146_L_F4_(14),f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -521d8738-0393-4519-8b31-52ed06c9ed18,0.9700000286102295,4000.0,NS_NET116_L_S3_1(6),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -038ee933-439a-4705-b526-0373a4b0b16a,0.9700000286102295,4000.0,NS_NET136_L_S3_1(1),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a964d9b8-a035-41df-86c0-4c5306af2158,0.9700000286102295,4000.0,NS_NET116_L_S2_4(7),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c67f5f1a-7adf-4715-a0ee-1bc0156b7bb9,0.9700000286102295,4000.0,NS_NET116_L_S3_3(6),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8decd09e-f82a-4f38-8946-14a9b437303f,0.949999988079071,4000.0,NS_NET126_L_F2_(18),e80aa2db-f32c-410d-96a1-a32e03222568,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8736f13d-fcf4-486a-8225-259bfd9bd206,0.9700000286102295,4000.0,NS_NET136_L_S1_3(8),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0211454c-9be4-470f-9cf5-cef9b87cb640,0.9700000286102295,4000.0,NS_NET116_L_S3_2(5),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9b12597e-619f-4953-86c6-21f8d262bfbd,0.949999988079071,4000.0,NS_NET146_L_F4_(6),49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -bedce1e8-d623-469a-b7ff-bb618588bb3e,0.949999988079071,4000.0,NS_NET126_L_F2_(2),5981fe65-3c92-4a78-af92-1461904046d0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -080cbc7e-6acf-434d-ae38-b693f19edc69,0.9700000286102295,4000.0,NS_NET116_L_S2_3(4),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7b187641-d6fa-49f2-afd6-b03125c1acea,0.949999988079071,4000.0,NS_NET126_L_F2_(22),177a20fe-83b1-46df-94a3-4faa54348d10,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4336ad38-37d0-4bba-914e-b2ebec0cc8ab,0.9700000286102295,4000.0,NS_NET116_L_S1_5(2),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c098f9cd-09c8-4eef-8941-652cb8365992,0.9700000286102295,4000.0,NS_NET136_L_S3_1(4),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c9acf3dd-2d38-47f1-9449-421104c47171,0.9700000286102295,4000.0,NS_NET116_L_S3_1(8),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f855cedf-e3f0-4c0f-addd-c57deb4f9e03,0.9700000286102295,4000.0,NS_NET116_L_S3_5(2),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cb0661c0-15fb-4475-9e0b-fbcf734e19c7,0.949999988079071,4000.0,NS_NET146_L_F1_(4),dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -75b3f626-a1e0-47d6-9d2f-658500ac7630,0.9700000286102295,4000.0,NS_NET146_L_F1_(38),32507a10-1eed-4a3f-820c-bc187f3b052e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -d5b04d0c-bdda-450b-b939-aec8af923eea,0.9700000286102295,4000.0,NS_NET136_L_S3_2(5),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -040e8122-1873-4622-952d-87ddef148e7e,0.949999988079071,4000.0,NS_NET126_L_F2_(1),196fe620-d4a7-45f9-93ad-0579e2bcbb9a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8052a8a9-d5a5-481e-a772-87f71ee8fbb9,0.9700000286102295,4000.0,NS_NET116_L_S2_3(3),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d3b5447b-a2ba-4f17-a10c-bd6354ab2338,0.9700000286102295,4000.0,NS_NET136_L_S1_2(5),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -08a60d08-3a12-4263-a831-274f3b374cbb,0.9700000286102295,4000.0,MS3_Last_03,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -bc54e624-8931-4188-9405-950e8deae723,0.9700000286102295,4000.0,NS_NET136_L_S1_3(6),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -62fad34c-a778-4140-a13d-dee5f0af255d,0.9700000286102295,4000.0,NS_NET126_L_F1_(33),b425b28e-48a8-4ec4-a15a-387fcfb79895,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -dc34b951-89f4-4e28-8f04-3e6522bfa0c9,0.9700000286102295,4000.0,NS_NET116_L_S1_4(7),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c1049c54-1558-4d61-b47f-004b17e38770,0.949999988079071,4000.0,NS_NET126_L_F4_(16),b8fa1f73-223c-4b08-a140-44f12484cce3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -07ba8eae-b76d-4034-b378-a3ef8134fc2b,0.949999988079071,4000.0,NS_NET126_L_F2_(27),daed3552-e382-4153-95be-97f17e2c53e5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9413bafe-4537-4247-ae22-8b3d03bf6309,0.949999988079071,4000.0,NS_NET146_L_F1_(16),09ac8949-2b79-41d7-b56f-a58f20036df2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ec81e030-4dc6-462a-9218-b5c791e82da7,0.949999988079071,4000.0,NS_NET146_L_F4_(5),d7023c15-adb7-4d56-9f86-b182611a47ef,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2c90248b-ce63-492c-a2e1-2bd66a3f3287,0.9700000286102295,4000.0,NS_NET136_L_S3_5(8),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1107328f-3c13-4f0b-bde3-1d9580cf40db,0.949999988079071,4000.0,NS_NET146_L_F3_(12),f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8387b2f1-1e5f-4d85-8ca1-a78a44b09788,0.949999988079071,4000.0,NS_NET126_L_F2_(5),c8b1fd67-2f03-4153-8ed3-284e7a721ec5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -73c923b1-49ef-49b6-863f-8badb0915f70,0.9700000286102295,4000.0,NS_NET136_L_S1_5(2),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f60efe06-32af-466f-9359-52cc8a59b985,0.949999988079071,4000.0,NS_NET126_L_F2_(17),c5457e35-ad81-4427-9d3a-99e4c44ccae8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -12f5a119-679c-4198-b133-a4596816f6d1,0.949999988079071,4000.0,NS_NET146_L_F2_(14),9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -acc82c39-9615-4a9b-83a5-76c4704cbee0,0.949999988079071,4000.0,NS_NET146_L_F3_(13),bdf97a4d-622c-4251-8183-8b1a696f376e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -66f54dc9-83dc-435d-9c21-3361838e88d6,0.949999988079071,4000.0,NS_NET126_L_F3_(14),df8df8d2-3494-4da9-8d1b-f913d15f520f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f2f13d1d-3643-4d94-b519-94ea266b8816,0.9700000286102295,4000.0,NS_NET116_L_S3_5(3),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -180167d5-7277-407f-a269-da5d2f1e30f0,0.9700000286102295,4000.0,NS_NET136_L_S2_2(3),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -99a0a508-d25a-4136-8300-40a676832d35,0.9700000286102295,4000.0,NS_NET136_L_S2_3(2),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -146fba6b-bbbe-4f3b-ba51-2f3a2c31b118,0.949999988079071,4000.0,NS_NET126_L_F1_(22),c317a6cd-428b-4c36-8233-91d0c4e2717a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -96dbdf3b-98cd-45de-92e0-3743c609b08e,0.9700000286102295,4000.0,NS_NET136_L_S1_4(2),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2c970df7-5644-4665-835a-825b8df8aaf4,0.949999988079071,4000.0,NS_NET146_L_F4_(4),00d4a837-f09c-41df-bed1-dfdb78387116,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d24c0d3d-bfe6-4ae6-b707-eb781d7f7d2a,0.9700000286102295,4000.0,NS_NET136_L_S3_1(8),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9367b934-d77d-4f3b-b5e6-0692ec6789a3,0.9700000286102295,4000.0,NS_NET116_L_S2_2(7),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -397c7198-feee-4f46-9149-1ef9d31d9ba2,0.9700000286102295,4000.0,MS3_Last_01,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -6993add7-7f94-4f50-b87a-0b77dc41c421,0.9700000286102295,4000.0,NS_NET116_L_S1_3(6),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a9bb2858-c56d-4594-a364-fcfaf448d0e5,0.9700000286102295,4000.0,NS_NET116_L_S3_3(7),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -54f64be5-5966-4c66-8cfa-dd688e59e992,0.9700000286102295,4000.0,NS_NET116_L_S3_1(4),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -bc617ea3-3b85-4ba8-8b12-f243f077d6bb,0.9700000286102295,4000.0,NS_NET136_L_S2_4(4),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -513e31ea-560d-4e33-b1ec-c1aca5f63339,0.9700000286102295,4000.0,NS_NET116_L_S1_3(5),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5f825da0-bf7e-4846-9601-9049cac0f958,0.9700000286102295,4000.0,NS_NET136_L_S2_1(3),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cdd0ae9a-c06e-4234-aea3-255f359dbe64,0.949999988079071,4000.0,NS_NET146_L_F3_(16),3ec2f2a0-36a3-4d11-88ee-cc4df001e876,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -50c89980-8da2-4e98-8602-e2f0b560e7c4,0.949999988079071,4000.0,NS_NET146_L_F1_(8),d5489e1b-0e7e-4ca9-a362-09c23576a622,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a00956d5-6648-484c-a485-b3491c5181c2,0.949999988079071,4000.0,NS_NET126_L_F1_(20),36cda100-86ae-4a20-ac71-20af603ac0cf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ab77ac85-7990-4b93-a4e7-6fb812ad345a,0.949999988079071,4000.0,NS_NET146_L_F3_(3),8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6559c5f4-c9ed-4f01-af36-72d18f04ca9a,0.949999988079071,4000.0,NS_NET126_L_F1_(15),41c0087f-ce27-4da3-97d2-92d711b639b4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -bab50a41-657d-454b-91eb-3e64de845098,0.9700000286102295,4000.0,NS_NET136_L_S1_3(4),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4958e21c-cf9d-4bae-ad3f-a1612171c398,0.949999988079071,4000.0,NS_NET126_L_F1_(7),fc7821d2-ac64-483e-b520-38d9971f4db0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3025fcc5-7a14-4bbe-93a1-0b2533306ea1,0.949999988079071,4000.0,NS_NET146_L_F1_(11),666757e2-292e-473c-ac9c-04c0786574bc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -53347503-af44-482a-8b97-d1b638bb3634,0.949999988079071,4000.0,NS_NET146_L_F2_(23),ce513b50-b57a-41e2-b744-4c0fd2ae97d0,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0de47e33-a4fb-4a86-839d-ec9ad49a8414,0.9700000286102295,4000.0,NS_NET136_L_S2_1(6),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e035cc33-0a53-4dc4-b35d-f3f44764a5aa,0.9700000286102295,4000.0,NS_NET136_L_S2_4(1),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -903c6f31-7c78-4d1e-b4ee-bf0dcbb9e938,0.949999988079071,4000.0,NS_NET146_L_F1_(10),6c24b464-790a-4aae-bb11-766718f07cd5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -422a643a-04d2-480b-b107-e8582b36e641,0.9700000286102295,4000.0,NS_NET136_L_S2_4(7),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9993f48a-8ee2-49b7-af31-afbfa3690c45,0.9700000286102295,4000.0,MS3_Last_07,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -f870937a-6644-4ef8-9bfd-15835471e775,0.9700000286102295,4000.0,NS_NET126_L_F1_(30),519ace7e-fd3f-4797-b14b-36c1694b00cd,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -ed173f7f-071e-4687-b7fe-b59616148ee3,0.949999988079071,4000.0,NS_NET126_L_F4_(17),7125de08-1d28-409a-8b23-023a0294def5,,,,"cosPhiFixed:{(0.00,1.00)}",0.10000000149011612,h0 -eb8622e3-0dd8-42e4-ab49-23b5cec0eb9c,0.9700000286102295,4000.0,NS_NET116_L_S3_4(8),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -038c506d-59b4-406b-88b0-7f74719c55e7,0.9700000286102295,4000.0,NS_NET136_L_S3_5(3),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -25be1a94-a0cc-4de5-acc4-097d9e8639ff,0.9700000286102295,4000.0,NS_NET116_L_S3_3(8),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -449eaff2-92ca-4075-ae9f-2d517e7f0642,0.9700000286102295,4000.0,NS_NET116_L_S2_3(6),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d08a8e2d-0ab1-4d89-b111-6a8efe2a76af,0.9700000286102295,4000.0,NS_NET136_L_S1_1(1),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a1a11124-0e04-4a0c-bab9-eb68c9f20a9e,0.949999988079071,4000.0,NS_NET126_L_F3_(28),e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5596dd40-f34f-4ec4-bf80-17fcf122a67b,0.9700000286102295,4000.0,NS_NET136_L_S1_5(6),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7f6b1274-7b1b-4313-8027-6fc4a31f34e0,0.9700000286102295,4000.0,NS_NET116_L_S2_4(4),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9abc4242-f58f-474a-99fc-613e083e2589,0.9700000286102295,4000.0,NS_NET116_L_S1_3(4),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e733ea74-1c51-4592-9fb3-cc2d0a007450,0.9700000286102295,4000.0,NS_NET116_L_S2_4(3),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -04063357-c213-4cc9-a870-9cc11ac4ad92,0.9700000286102295,4000.0,NS_NET116_L_S1_1(7),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f231c4e2-2872-4d83-b486-894d846dc4d7,0.949999988079071,4000.0,NS_NET146_L_F2_(10),41414318-73e3-4bdc-8147-570a96b28d37,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6f97361f-d4e6-45b5-9bf2-d880d42eae25,0.949999988079071,4000.0,NS_NET126_L_F3_(17),462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7794309a-7ecd-436d-ae38-51bbdab5df11,0.949999988079071,4000.0,NS_NET146_L_F3_(6),01bdd8b2-145f-42b3-80e3-a2366dea1044,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a6ce4a93-174a-4ca0-92bb-f09abc579d81,0.9700000286102295,4000.0,NS_NET136_L_S3_2(1),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2d758bef-0a8a-4dac-aca6-556ace61ec84,0.949999988079071,4000.0,NS_NET126_L_F3_(32),7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -beb7a9e2-4394-4808-af58-d984ab871f98,0.9700000286102295,4000.0,NS_NET116_L_S2_2(3),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -66f00451-3542-41f2-adcf-24068c870afc,0.9700000286102295,4000.0,NS_NET136_L_S2_1(2),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -80d0b6a9-8d08-4262-81a0-83b13beaad45,0.9700000286102295,4000.0,MS1_Last_02,32b3bb19-c52a-4a19-890a-94a8918d38a9,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -8d1ee87d-73a7-46eb-b174-602683d702d9,0.9700000286102295,4000.0,NS_NET146_L_F1_(28),012c9eee-86c2-494c-adcc-bbfc481e4a46,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -11bc6378-bb54-4ddb-846f-1488baaf1c00,0.9700000286102295,4000.0,NS_NET116_L_S3_3(4),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5ab2e1b6-7c4b-4cba-8528-94bda71c3dcd,0.9700000286102295,4000.0,MS1_Last_03,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -2a9149a4-4778-41d8-8865-090499833016,0.9700000286102295,4000.0,NS_NET116_L_S2_1(1),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -79a2d93b-3583-4e90-bc40-9e7ff84bf0a2,0.949999988079071,4000.0,NS_NET146_L_F2_(15),d82fae59-844a-4c85-997e-326dd876137c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -95be2f70-bd5a-4785-983c-2aa7eba6546b,0.949999988079071,4000.0,NS_NET146_L_F3_(26),bd288184-99d8-4233-bb3d-484f3922200a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f3168cab-a847-4314-9bf9-4dbe269c1c3c,0.949999988079071,4000.0,NS_NET146_L_F3_(8),6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2eca146b-7c7e-47fa-a0be-807b7fc72fd5,0.949999988079071,4000.0,NS_NET126_L_F3_(4),bf7e7268-2fb6-4948-ace6-9037ae148fa3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -89971afc-919e-4153-92b2-f0a43ad0e535,0.9700000286102295,4000.0,NS_NET126_L_F1_(27),c81d6099-66b2-45d8-b8a4-c19ceb862f6e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -a8e26f05-54f0-4da7-abfa-228661833e03,0.949999988079071,4000.0,NS_NET126_L_F3_(18),9502fd3e-c00f-48fa-8b56-c72d21f80f3c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -72d00bfa-4967-485a-b5a3-519a6826fa9c,0.9700000286102295,4000.0,NS_NET116_L_S1_2(4),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -de2b452a-9eee-4481-b0f0-72d9ab56a4b5,0.9700000286102295,4000.0,NS_NET136_L_S2_3(1),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -924dbbfa-abb0-42b2-83a9-15897bf5806e,0.9700000286102295,4000.0,NS_NET136_L_S3_3(5),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8d326225-ff42-40ab-b58e-adc0cb32c9ff,0.949999988079071,4000.0,NS_NET146_L_F3_(9),6570535c-0d2e-4846-9951-21559902f67a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -dd893829-b4af-4cf1-9d70-79ae68b91bf0,0.9700000286102295,4000.0,NS_NET136_L_S1_4(6),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ab476579-7fb3-408f-a065-73f6d2140fb2,0.9700000286102295,4000.0,NS_NET136_L_S3_5(5),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7b8abd75-9967-4505-b919-3accd78908e4,0.949999988079071,4000.0,NS_NET146_L_F3_(19),810bebb0-0d5c-4899-b213-3207be661248,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -58b9f934-f7c4-4335-9894-3c80d9e6b852,0.949999988079071,4000.0,HS_NET1_L_S3,33f29587-f63e-45b7-960b-037bda37a3cb,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -b8ad6547-aa55-4fca-ad0c-b5a0078b2203,0.949999988079071,4000.0,NS_NET126_L_F1_(14),b7baa286-cbe2-4143-a08f-4e025af47529,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7e337720-59f5-4d3f-bf95-71c6228587f3,0.949999988079071,4000.0,NS_NET146_L_F1_(17),0d94a5ea-3a13-48ba-a27f-b2903841c334,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d4d3ea3e-cce2-480b-9a7c-bbdd1a7c96ad,0.949999988079071,4000.0,NS_NET126_L_F1_(8),f717b05b-f4e7-43d9-af9e-638e2badee5a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3b51a0c6-060f-40ce-b207-6146fde8e724,0.9700000286102295,4000.0,NS_NET136_L_S2_1(8),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -89f93344-8dc3-46ea-805b-8c43bffc7577,0.949999988079071,4000.0,NS_NET126_L_F4_(15),55b3d03f-2204-4ab3-84cc-a28476868c9d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -dc65cd27-84a2-49a6-aa22-d9c1968a72b4,0.949999988079071,4000.0,NS_NET126_L_F4_(8),75f2dfb9-75a0-496d-9c44-79e7df54c1df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ff0b995a-86ff-4f4d-987e-e475a64f2180,0.9700000286102295,4000.0,NS_NET116_L_S1_2(1),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7c03d124-df4a-46c3-9b74-66bd888f750e,0.9700000286102295,4000.0,NS_NET116_L_S3_1(7),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7a17120f-8522-4eca-95aa-f6b5d985103b,0.9700000286102295,4000.0,NS_NET116_L_S3_4(7),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -86cbef43-bde0-41a6-a684-f42fdb4ba527,0.9700000286102295,4000.0,NS_NET136_L_S1_4(4),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f880a0dd-991c-4646-a0a4-c6c877171870,0.9700000286102295,4000.0,MS4_Last_04,890f2162-b4cb-49e7-a16f-4b552c5e245c,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -c7a0e7d2-276f-41e7-bfbc-f11fac26a0e1,0.9700000286102295,4000.0,MS3_Last_05,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -32be027e-1ee2-41bc-9fe5-18daa3613efa,0.949999988079071,4000.0,NS_NET126_L_F1_(2),a7ebd30b-b843-405f-9fae-ca6b489601f9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5f1b7472-2a01-4203-8318-878b1a4460c5,0.9700000286102295,4000.0,NS_NET116_L_S3_4(5),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cb65c2bc-fb36-4338-9a13-34bd999f4fa5,0.9700000286102295,4000.0,NS_NET116_L_S2_4(8),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a12570e4-afeb-4af8-a86c-9e804eea4886,0.9700000286102295,4000.0,NS_NET116_L_S3_5(1),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3ce5abcb-0eb1-403f-9fca-90d255619cc5,0.949999988079071,4000.0,NS_NET146_L_F2_(13),49e14db3-a4bc-464a-b606-653ac8a604dd,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1308b834-4b0c-4c91-b5fc-8529368005ea,0.949999988079071,4000.0,NS_NET146_L_F2_(25),011e3794-3341-4376-839c-3f5a452e15ab,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9f0d4b5f-7563-40bc-b20e-bc54a96e9019,0.9700000286102295,4000.0,NS_NET146_L_F1_(30),9f95c733-71e2-4bf0-a27a-70144518ea2c,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -8f0150c7-b217-43ca-85d5-c1e4d2e903d0,0.9700000286102295,4000.0,NS_NET136_L_S3_1(2),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -67379832-1cfb-4015-ac96-0fe499463c42,0.949999988079071,4000.0,NS_NET126_L_F4_(3),1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -12c58b41-2ebb-4bc0-8ca2-a3693d5d5f8b,0.949999988079071,4000.0,NS_NET126_L_F3_(1),2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0610df61-bdb9-45d1-ab48-a72dca4079c4,0.949999988079071,4000.0,NS_NET146_L_F1_(1),4f28e734-5148-4caf-ac64-270231740cbf,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -28a6872b-abf5-412e-b887-b0503addaa7a,0.9700000286102295,4000.0,NS_NET116_L_S3_3(5),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -599e7b5f-7a78-4bb4-a3c3-e6f2779bbda2,0.9700000286102295,4000.0,NS_NET136_L_S3_5(2),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0944b3b6-15e3-4704-b50d-fa1e407ade7e,0.9700000286102295,4000.0,NS_NET116_L_S1_3(7),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3a5e7e35-53ad-48da-89b9-98342a9875ac,0.9700000286102295,4000.0,NS_NET136_L_S1_3(7),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c3434742-e4f0-49e5-baa7-c1e3045c732c,0.9700000286102295,4000.0,NS_NET116_L_S1_5(1),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -eed8fa68-08b5-49f3-a6d7-2632fe7b13b9,0.9700000286102295,4000.0,NS_NET116_L_S3_1(3),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3e3225f9-2dd9-402d-9a0d-1d8cde60b1f6,0.949999988079071,4000.0,NS_NET126_L_F2_(4),cdda8fa5-9a18-4f3e-951d-1ec0009191b4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -245666cd-881b-44ca-9b47-536c96e15bce,0.9700000286102295,4000.0,NS_NET116_L_S2_3(2),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9b4f4a8b-3aaa-4b77-afdb-049d2b83869b,0.9700000286102295,4000.0,NS_NET136_L_S3_4(6),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d95c7612-af94-4ac4-94a0-a1dca839f33a,0.9700000286102295,4000.0,NS_NET116_L_S3_2(4),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5c3fb165-f374-44fa-802e-e82e5a2538f0,0.9700000286102295,4000.0,NS_NET136_L_S2_2(4),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -550f9346-fe14-46ef-bd54-00980834e0d6,0.9700000286102295,4000.0,NS_NET126_L_F1_(34),17f7a477-d9c7-4f58-8ba0-1a2694dcc874,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -be985e5e-19b6-49c4-bb64-f37a627be13b,0.9700000286102295,4000.0,NS_NET126_L_F1_(35),c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -9e5845cb-9ad1-42c6-8630-724375a4e323,0.9700000286102295,4000.0,NS_NET136_L_S1_1(8),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -10963efb-44d7-49bf-b926-c2d29239de60,0.949999988079071,4000.0,NS_NET126_L_F2_(3),8f422111-67d7-42f0-9f80-fbd0ec64c4fc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -11e776fa-ecc1-4332-821f-d7e56758b988,0.9700000286102295,4000.0,NS_NET116_L_S2_2(1),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -689527be-31a0-4791-970d-8542e367401c,0.949999988079071,4000.0,NS_NET126_L_F2_(23),9b509c7d-4647-40fd-b03e-7ab919215cc6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a610a50c-de39-46e6-b53b-95e3868d1072,0.949999988079071,4000.0,NS_NET126_L_F2_(11),6678c226-c5d2-4ce3-9728-dc1163be799f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3857ce77-a630-4b43-a1a1-6bebc0817e1d,0.9700000286102295,4000.0,NS_NET136_L_S2_4(2),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -63fb1af5-91e5-472b-b798-b2846cf701ba,0.949999988079071,4000.0,NS_NET146_L_F2_(16),8f2ba96f-a47a-46d3-b5a1-d19de0a32419,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1a88ba6f-9005-432d-9a8f-54a48c90015a,0.9700000286102295,4000.0,MS4_Last_05,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -6bd61b8c-2b53-4fc8-8e35-b17ed81ba8c9,0.9700000286102295,4000.0,NS_NET136_L_S3_4(7),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d5e593f1-727e-4983-8abe-92a328aa203b,0.9700000286102295,4000.0,NS_NET116_L_S2_5(2),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b52b4bea-014e-4aad-8481-2f2761957f69,0.9700000286102295,4000.0,NS_NET136_L_S3_4(4),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ef07774d-107b-4536-8d1d-45c28f755a80,0.9700000286102295,4000.0,NS_NET136_L_S3_3(6),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -46644e3e-b00c-4707-ae8d-94fed9f0adcd,0.9700000286102295,4000.0,NS_NET126_L_F1_(38),06b7f21a-d6d7-4ec0-94c6-141845f14986,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -f2284780-6019-4864-bf29-915330717f5b,0.9700000286102295,4000.0,NS_NET116_L_S2_5(5),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8c2ea045-0890-4ee5-8d66-0ce5f5eba7d1,0.949999988079071,4000.0,NS_NET146_L_F4_(12),f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -598f0d53-7c8f-435b-b333-95b6f4d359f2,0.949999988079071,4000.0,NS_NET126_L_F3_(31),67af7db0-0fd8-4657-bb4f-43a2141b9f73,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -520e2b61-ef52-406a-bc3d-83fd47da2696,0.949999988079071,4000.0,NS_NET146_L_F4_(13),b608d71e-3ede-4156-a015-3f6e1d22242a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8bad5752-c9c1-4669-802d-b1c4c7bbb909,0.9700000286102295,4000.0,NS_NET136_L_S3_1(5),416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3df803d8-4af6-426e-a51a-4b736ff06d51,0.949999988079071,4000.0,NS_NET146_L_F2_(20),2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -59f1999e-008d-47f0-b99d-1305fcb8f525,0.9700000286102295,4000.0,NS_NET136_L_S1_4(7),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -deb6456a-d472-4f1e-8698-006e8cd51dfc,0.9700000286102295,4000.0,NS_NET136_L_S1_4(5),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0290a7de-8c73-44d4-9a06-cf469d20c90c,0.9700000286102295,4000.0,NS_NET116_L_S1_4(3),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ea515ef0-c8e1-4e3f-9420-577ba394c7dc,0.9700000286102295,4000.0,NS_NET136_L_S3_3(7),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -666ac620-2151-430e-a9a1-624be6c61cb8,0.9700000286102295,4000.0,NS_NET116_L_S3_5(5),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2f4df67a-e33a-4a1b-9caa-41bfb4408b8c,0.9700000286102295,4000.0,NS_NET116_L_S2_2(8),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8d50a47b-95ce-4a8e-84a3-80d5781dcc53,0.9700000286102295,4000.0,MS4_Last_01,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -4cbcffbf-d9c8-463a-8f11-6990fbda235e,0.9700000286102295,4000.0,NS_NET116_L_S1_1(2),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -63374b45-aa28-4e06-85c2-704c00754ba8,0.949999988079071,4000.0,NS_NET146_L_F1_(20),7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -16f7000e-1f95-4003-bbbf-8c73cfd02763,0.9700000286102295,4000.0,NS_NET116_L_S3_2(2),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3ad0235e-751b-4682-89a5-b359aef0dd98,0.9700000286102295,4000.0,NS_NET136_L_S1_3(2),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2b02fad4-245d-4ada-ae5f-0252f2aa59f1,0.949999988079071,4000.0,NS_NET146_L_F2_(11),f26b5511-3c50-42d5-97c2-be408330eb84,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -62b0b771-b773-4b25-af1d-bbd8a7ad68d4,0.949999988079071,4000.0,NS_NET126_L_F2_(8),366a70fb-8d7f-4201-9eca-0fcbc839239d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -aff03ab3-9595-499f-931c-8730b1350a2c,0.949999988079071,4000.0,NS_NET146_L_F2_(12),8254d91b-e5da-4402-bb8f-301eafa09d28,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -81a6ed8d-f29e-4478-bbf3-ccb6514922f2,0.949999988079071,4000.0,NS_NET146_L_F4_(7),bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a7de4997-eddc-4306-b1ac-982c1872863b,0.949999988079071,4000.0,NS_NET146_L_F1_(6),e3c3c6a3-c383-4dbb-9b3f-a14125615386,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4642d648-b0dd-4597-a3bd-2cc1fce74f27,0.9700000286102295,4000.0,NS_NET116_L_S3_1(1),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1fb9be59-d27c-4748-a090-db5a58063d82,0.949999988079071,4000.0,NS_NET126_L_F4_(6),e3a40690-d085-4796-9fcb-48d776e58594,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d957a9c6-500e-457d-918b-7f6c4e560bbc,0.949999988079071,4000.0,NS_NET146_L_F1_(15),00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5aeaccc2-f9cd-4292-9b9a-2e05d5c63fe4,0.9700000286102295,4000.0,NS_NET116_L_S1_2(6),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -209cebb3-6706-49d0-af2c-b2ae23ca3873,0.9700000286102295,4000.0,MS4_Last_03,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -17a02ab8-32b2-436d-8aab-04fbd3809c87,0.949999988079071,4000.0,NS_NET146_L_F3_(25),c6c177b0-5004-4db0-8cde-6293330a4757,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1fbefcb1-57ec-4b86-8b7e-c892f0e6b179,0.9700000286102295,4000.0,NS_NET116_L_S3_4(6),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fd2e19b6-d5e3-4776-9456-8787a2160d9d,0.9700000286102295,4000.0,NS_NET116_L_S1_4(1),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2ab66e57-dd5f-4295-a6f5-f017fb4db8b1,0.9700000286102295,4000.0,NS_NET136_L_S3_3(8),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c7834ac4-2f72-483e-8ecf-1d0ce715716b,0.9700000286102295,4000.0,NS_NET116_L_S2_1(6),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b89b8560-b729-46d5-8aa1-3c678dd30be4,0.9700000286102295,4000.0,NS_NET136_L_S2_4(5),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3b63c80f-a5c6-439b-97be-4e1efda58ccd,0.949999988079071,4000.0,NS_NET146_L_F2_(22),5862f526-783a-4218-a463-3cbf5de8dade,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5f2d65fc-7e92-497e-8c51-ead1985d66fa,0.949999988079071,4000.0,NS_NET126_L_F2_(24),625bdd2c-a75f-46ef-850c-ca4704d56e55,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c27ac6bb-5227-42d4-832f-985d69bc9c4e,0.949999988079071,4000.0,NS_NET146_L_F3_(1),22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f1804def-a6f6-4603-bfd3-52968a2de732,0.9700000286102295,4000.0,MS2_Last_07,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,"cosPhiFixed:{(0.00,1.00)}",2400.0,h0 -bcb5abf4-7b31-4860-af53-78ec457f21a2,0.949999988079071,4000.0,NS_NET146_L_F3_(30),7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c58dc7e4-f6c5-47e1-a914-e566b8aa6385,0.9700000286102295,4000.0,NS_NET136_L_S2_2(1),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ee726dbd-8a70-4d50-8cc3-cdda596166c7,0.9700000286102295,4000.0,NS_NET136_L_S3_3(3),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c9689bd8-6717-49d5-90d9-a6245b5116e6,0.9700000286102295,4000.0,NS_NET116_L_S1_5(3),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c3df03ac-0dff-4304-b327-3e88d023f692,0.949999988079071,4000.0,NS_NET126_L_F1_(25),3a2f199c-2966-4b9a-939b-3a6c9924341c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -72e4504c-0362-4fe0-a6be-43870f627f7f,0.9700000286102295,4000.0,NS_NET136_L_S1_5(8),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b3ce3d49-d4d5-4b76-a589-02d0c7faf5a5,0.9700000286102295,4000.0,NS_NET136_L_S2_5(6),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -de3eef0c-2f09-4f57-a04b-dae5011fac7a,0.949999988079071,4000.0,NS_NET126_L_F4_(12),6a4547a8-630b-46e4-8144-9cd649e67c07,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ab0d8c5c-fc68-4ae0-87a9-8edfa3b25339,0.949999988079071,4000.0,NS_NET126_L_F1_(4),ff947647-b551-41ae-bcfd-6af228250c96,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7b040b43-011a-4402-a176-9b9b41ce0c37,0.9700000286102295,4000.0,NS_NET116_L_S2_3(1),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b47f1063-12e8-4b1f-a015-6c5be821a24e,0.949999988079071,4000.0,NS_NET126_L_F3_(22),61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -af4c1bfe-4e4c-437d-9eff-42060aaf4027,0.9700000286102295,4000.0,NS_NET136_L_S2_1(7),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4c7ee262-a021-408a-aada-27677feeeec9,0.949999988079071,4000.0,NS_NET126_L_F1_(17),5fe9c522-37d0-48f8-b3b8-e91b956e39f6,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3c9a2f9a-8cd0-42f2-9d16-f6314c741aa3,0.9700000286102295,4000.0,NS_NET136_L_S2_1(4),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -93128545-6977-41fa-8e20-5d7a930d80c9,0.9700000286102295,4000.0,NS_NET136_L_S1_2(3),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -759ff1e6-5ad6-4701-bbe1-059c08a1781d,0.949999988079071,4000.0,NS_NET146_L_F4_(15),576840db-7d3c-417b-b587-28b222e740e1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b16bea09-e042-4bd1-837e-78125b0085dc,0.949999988079071,4000.0,NS_NET126_L_F1_(13),847fd5fc-b515-4a9d-8a6f-66df1e71ded2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7cee8d98-be5b-400c-9655-409e1eae9f6d,0.9700000286102295,4000.0,NS_NET136_L_S3_2(6),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0c62dc7f-45a7-44e3-9240-f9ff9d62e4a0,0.949999988079071,4000.0,NS_NET126_L_F4_(13),da79c960-d35a-4193-9b06-2d4d57051706,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -bee4283a-0d36-4f98-a837-23d0667a6675,0.949999988079071,4000.0,NS_NET126_L_F3_(9),bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a82e1da2-1af2-40d8-b8f9-b4027118d029,0.9700000286102295,4000.0,NS_NET116_L_S2_4(5),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ef6f6592-1b85-4204-82e1-c33a6ed3d582,0.9700000286102295,4000.0,NS_NET136_L_S1_2(1),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -66f30a61-7722-48a7-a527-99ff55e12754,0.9700000286102295,4000.0,NS_NET136_L_S1_4(8),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3f37f3bc-f9cf-4a55-96e4-ee4be9f22a63,0.9700000286102295,4000.0,NS_NET116_L_S2_4(2),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -388ecdb9-b7e1-429e-990b-b5124fac12cf,0.949999988079071,4000.0,NS_NET146_L_F2_(6),5071dd8c-bbc1-4c8d-a180-4492f80e183d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5012a529-b7d2-4f9e-a2d4-90641470cba2,0.9700000286102295,4000.0,NS_NET136_L_S3_2(8),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3f903ef1-047f-4f28-9d9f-c35b2c440315,0.9700000286102295,4000.0,NS_NET116_L_S1_4(8),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5f56df23-f5b3-42d0-9896-85015f7b1274,0.949999988079071,4000.0,NS_NET126_L_F2_(28),5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a265d035-d8ea-41e0-ad10-04e064b9a968,0.9700000286102295,4000.0,NS_NET136_L_S3_4(5),2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -95a1e026-be40-4209-9752-fbab3a626b87,0.949999988079071,4000.0,NS_NET146_L_F1_(2),ab3645a7-af26-480d-b1bd-5b0fa00dc83f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -e9660cc3-b2b6-4b8d-8673-dd3bcb6305fe,0.9700000286102295,4000.0,NS_NET116_L_S2_1(2),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fd17352b-b2ad-4e77-92cf-08b48a1ba757,0.9700000286102295,4000.0,NS_NET116_L_S1_2(2),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -080e6ab5-8021-43c0-bf9f-2424ec0a1de8,0.949999988079071,4000.0,NS_NET126_L_F3_(30),443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0ccf950e-a9bf-4de8-ac3f-5ca04a3f0b60,0.9700000286102295,4000.0,NS_NET136_L_S3_5(6),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -62a4a30c-7bf2-4813-a00e-7002b8c56832,0.9700000286102295,4000.0,NS_NET136_L_S1_3(3),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3feb112d-8a47-49eb-b719-d7226b6fe7a0,0.949999988079071,4000.0,NS_NET146_L_F2_(18),21359dd1-7a23-4932-b656-c196fbffe751,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -94203400-1579-4cc0-9395-ac67f94c6c01,0.9700000286102295,4000.0,NS_NET136_L_S1_4(3),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7b6cd13c-8f54-421e-b2e9-5888f181737b,0.9700000286102295,4000.0,NS_NET146_L_F1_(27),9baae5ff-40e3-48cb-9ddf-de6d1c133e13,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -3f47dbb5-8254-43d1-83a8-21385cb666dd,0.949999988079071,4000.0,NS_NET126_L_F2_(25),1dcddd06-f41a-405b-9686-7f7942852196,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4dca3b1d-5d24-444a-b4df-f4fa23b9ef1b,0.949999988079071,4000.0,HS_NET1_L_S1,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -12c85bfd-a5a1-4812-b168-86b94f624f18,0.9700000286102295,4000.0,NS_NET116_L_S2_3(8),df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3c309ec9-42a4-441d-8c0e-e29cefa6bf18,0.949999988079071,4000.0,NS_NET126_L_F1_(5),eb21d716-1b54-4dba-bdc2-d1f6752aef85,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -8bee3a68-8990-46eb-9230-067111caceb5,0.9700000286102295,4000.0,NS_NET136_L_S2_3(3),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b9fb3d41-bb0e-4c4c-bff5-1b50d40efc33,0.949999988079071,4000.0,NS_NET126_L_F1_(3),04f29760-9e52-4943-8563-62e1fbd5ed52,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -36d59a0a-17a5-4955-996b-e3aafb86f4f1,0.949999988079071,4000.0,NS_NET126_L_F3_(23),33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9b0cca4d-f27f-4190-b35f-a84fa09ac157,0.949999988079071,4000.0,NS_NET146_L_F1_(14),b73208dd-f4a8-4e90-bf2d-7ea67a89525a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ea51cb96-068f-4359-b1d0-27438ce87b49,0.9700000286102295,4000.0,NS_NET146_L_F1_(31),5e213f42-d93e-45c5-a295-adbe09105746,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -7513eb4a-3244-40fb-b500-0132947a02e0,0.9700000286102295,4000.0,MS3_Last_02,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -8a5a7de2-d61c-4172-b917-7404a2aba038,0.9700000286102295,4000.0,NS_NET116_L_S3_4(3),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0cdea42f-57da-4a8a-bd83-c4252b7868bf,0.9700000286102295,4000.0,NS_NET136_L_S2_3(8),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9d2c5b78-ad86-4055-b74b-e5b24f89a75b,0.9700000286102295,4000.0,NS_NET116_L_S2_1(4),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2efedcfd-4972-4d13-9d62-180f1b9a76ad,0.9700000286102295,4000.0,NS_NET116_L_S2_5(1),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -5d4b96bf-a6ad-4026-b97a-4e6d77896480,0.9700000286102295,4000.0,NS_NET116_L_S2_2(4),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -aaa0a903-46f7-4109-adb3-9f43398fc932,0.949999988079071,4000.0,NS_NET126_L_F4_(11),95ced3b5-69fd-4171-9c34-f18802064e22,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -04c0cbcf-4e9d-4608-bb92-6ab97e59ece7,0.9700000286102295,4000.0,NS_NET116_L_S3_4(4),36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1a2d5842-96f6-452f-aa82-6064618d5f49,0.949999988079071,4000.0,NS_NET126_L_F3_(29),f0f8f187-5dbf-46ab-8a43-d6169ab5042d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5d930bf2-0b63-4821-bd6c-02383e3b4220,0.9700000286102295,4000.0,MS1_Last_04,1396cb4c-cee7-4116-97c9-290f98785719,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -24de669f-4786-4388-ae36-aaef1ce40ffa,0.949999988079071,4000.0,NS_NET126_L_F3_(27),d5b861a6-2a5b-4dec-a66e-adbfc6d62873,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -860a37f7-7add-4613-bef4-326ee5ea328b,0.949999988079071,4000.0,NS_NET146_L_F1_(25),2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -00a6de01-2304-484b-90f2-5abb044167a3,0.9700000286102295,4000.0,NS_NET116_L_S2_2(2),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8e9debcb-ce25-450c-b016-170bb7622008,0.9700000286102295,4000.0,NS_NET136_L_S3_2(4),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2550ae33-6540-4602-b59a-a46c49747c97,0.949999988079071,4000.0,NS_NET146_L_F4_(9),9b889b73-c108-4b38-b6eb-3377841e0c83,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -692728c7-5ecf-4c0a-8ead-ae19fc029ba4,0.9700000286102295,4000.0,NS_NET116_L_S2_5(6),32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -09a47013-bac7-4879-9b8a-9dd854ea9786,0.949999988079071,4000.0,NS_NET126_L_F1_(23),94713e6c-c47e-422c-8ab3-2a2903b7dcd2,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c3d643d1-1b2d-4f9f-838d-5b1ce270fc33,0.949999988079071,4000.0,NS_NET126_L_F2_(9),a286f73a-20ee-4056-8129-c7963b34ecd9,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -099f4cde-75ca-4928-904d-37717b5b1b02,0.9700000286102295,4000.0,NS_NET116_L_S2_1(3),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9ae56e43-54fc-4ab7-8989-abbc14596fd3,0.949999988079071,4000.0,NS_NET146_L_F3_(20),0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1469946c-101e-42e9-9e48-28801e9610af,0.9700000286102295,4000.0,NS_NET126_L_F1_(28),0c266541-6235-4d01-8258-e763c58af6c7,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -02e0c339-6dfd-4cbc-bebf-56b850053a7c,0.949999988079071,4000.0,NS_NET146_L_F1_(3),b237dd88-bcba-4a7c-aee6-c0c3e151e14e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a0147111-39c4-465a-8a10-48d1de1d349c,0.949999988079071,4000.0,NS_NET126_L_F3_(19),922a6375-b97c-412e-a6c9-b0ea55a23f76,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b03db97b-06ef-406c-a5b3-7e9ca9f7bf66,0.949999988079071,4000.0,NS_NET146_L_F4_(17),155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,"cosPhiFixed:{(0.00,1.00)}",0.10000000149011612,h0 -000e54d4-cf92-4cdb-9777-3d40d320d2b6,0.9700000286102295,4000.0,NS_NET116_L_S1_4(6),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -6c4c7e65-4598-4855-b057-25773ffdf5f2,0.9700000286102295,4000.0,NS_NET116_L_S1_5(6),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -9d19bae7-6fa1-4620-8ec2-38cae5596b9e,0.9700000286102295,4000.0,NS_NET116_L_S1_5(7),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -076b9055-3329-4e88-a1a0-93ad904e72a2,0.9700000286102295,4000.0,NS_NET116_L_S3_2(8),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3fed7598-a77e-4929-9bb3-687e51346cfd,0.9700000286102295,4000.0,NS_NET116_L_S3_2(3),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ef94c79c-ade7-4215-ba16-0bb14d558aab,0.949999988079071,4000.0,NS_NET146_L_F1_(13),f1e55c8b-357f-45a7-9d57-e299f9b207f3,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -ff5bf65c-e880-4a49-a286-fd51ce1f48b7,0.9700000286102295,4000.0,MS2_Last_03,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -5cffadab-94f6-4d98-a804-9d74189982cc,0.9700000286102295,4000.0,NS_NET116_L_S3_5(7),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a08a45bb-552f-435d-b614-aed657073527,0.949999988079071,4000.0,NS_NET126_L_F2_(15),2645e336-b0df-4d1e-a0ea-375444488f06,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2dcdb711-8872-4e51-ab4c-ef23c685674d,0.9700000286102295,4000.0,NS_NET146_L_F1_(35),f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -d4004ab6-3b00-4eeb-b62a-4ec28dc9cec6,0.949999988079071,4000.0,NS_NET126_L_F2_(14),9ce9d92c-5583-4b16-bec6-9f67834663cb,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -61314082-488b-4045-8c90-dad4629be04c,0.949999988079071,4000.0,NS_NET126_L_F2_(10),3d81adf5-73d1-4708-b03b-3afc7db017f4,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -573a3f21-49d8-4e2b-bca0-d546d77bb143,0.9700000286102295,4000.0,NS_NET116_L_S1_2(3),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -c2446989-6050-49f9-ab98-d8cfb8058709,0.949999988079071,4000.0,NS_NET126_L_F2_(26),5545d21b-bdc8-495f-bd28-d22ffcc0fafc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d12ce59d-2cf8-4186-9174-46a8b7f7c9cf,0.949999988079071,4000.0,NS_NET146_L_F4_(10),ffcaf979-d707-4d25-8f46-f436f9792d7f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -35414e99-525f-455a-b4ef-137b6e48ff87,0.9700000286102295,4000.0,NS_NET136_L_S2_2(8),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cdf650f2-8200-482a-b5b4-6f96e7f9e0f9,0.949999988079071,4000.0,NS_NET126_L_F1_(10),f6a31362-8b0d-4926-b0d0-10bb61db20df,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -1a08b0a0-ae75-4ff8-b28b-643ca2dbca1a,0.9700000286102295,4000.0,NS_NET136_L_S2_1(5),4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1f901bde-3ada-4e30-8a4c-a264df5b2f38,0.9700000286102295,4000.0,NS_NET136_L_S2_2(5),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e65cd082-dd8f-45d6-895c-e14357e76ac8,0.9700000286102295,4000.0,NS_NET136_L_S1_2(2),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3a278137-bf5c-4e2d-96c5-4779bcf947c0,0.9700000286102295,4000.0,NS_NET136_L_S3_2(2),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ca863e7f-1e42-4716-a214-e79fa91b3222,0.9700000286102295,4000.0,NS_NET116_L_S3_5(8),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -742de2f0-f057-47d0-83a3-9f57f84eb314,0.949999988079071,4000.0,NS_NET126_L_F4_(1),3f63be7c-7f1a-4e7e-87ee-90ada222f64a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f971674c-7f11-4e9d-b701-1736b2effb65,0.9700000286102295,4000.0,NS_NET136_L_S1_2(4),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -0045a53f-8f38-4239-8109-073a768cc593,0.949999988079071,4000.0,NS_NET146_L_F4_(1),ead38a50-b8f7-4bbb-b65d-f54350825e8e,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3e94ff28-fd2e-4028-a188-58ce85136fdf,0.9700000286102295,4000.0,NS_NET116_L_S2_2(5),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -98c1a2ab-bd09-4c77-a389-d088aed894b1,0.9700000286102295,4000.0,NS_NET116_L_S3_2(1),550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -916670c1-1575-4fe8-acb0-1dcf1c218386,0.9700000286102295,4000.0,NS_NET116_L_S2_2(6),d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -b2789995-79a1-4859-8d1c-70107b83c18b,0.9700000286102295,4000.0,NS_NET136_L_S3_3(2),2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -be63473d-a375-4ce7-9970-80358e5c54bd,0.9700000286102295,4000.0,NS_NET136_L_S3_2(3),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4384a56f-5b34-430c-89d8-354f367fa7ff,0.949999988079071,4000.0,NS_NET146_L_F3_(29),15345698-c319-461f-b969-37d50fb84220,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -89aeade0-ac58-4120-a743-577afdb72b5b,0.949999988079071,4000.0,NS_NET146_L_F3_(7),f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0d983289-2ff2-4f2c-b38a-bab3ec967c76,0.9700000286102295,4000.0,NS_NET136_L_S1_1(4),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -f630b338-5685-424d-bfbe-338bf94a0e01,0.949999988079071,4000.0,NS_NET126_L_F3_(6),e018b95e-fca5-40f7-8550-b05a619169dc,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d7f49aa5-ab62-4148-911b-086e8a848af4,0.949999988079071,4000.0,NS_NET146_L_F3_(15),d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -10b5f3d3-60c9-45b9-a70e-fa75140e9a9d,0.9700000286102295,4000.0,NS_NET136_L_S1_5(3),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -dd53cc4e-93a6-47f1-afa0-a46f82e3b371,0.949999988079071,4000.0,NS_NET146_L_F4_(11),8b3e3802-5213-46d0-a498-15eb6e5852b5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3f5718ca-fc58-4b00-b634-1aa6307c6cfa,0.949999988079071,4000.0,NS_NET146_L_F2_(1),2c520ab6-507e-4dcf-ab05-8f238e9b9385,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b47d3f0a-f480-49ef-ba7e-7979c81b0f70,0.9700000286102295,4000.0,NS_NET146_L_F1_(32),033d0230-4aee-47cf-91f9-81f5f40e60b0,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -1aeeacdc-e61b-4d44-ac76-699c7b459325,0.9700000286102295,4000.0,NS_NET116_L_S1_3(2),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a34932f7-012c-4a27-aa5f-4dd043028d5e,0.9700000286102295,4000.0,NS_NET116_L_S2_1(8),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -35408c17-cd77-4115-8357-9fb0e8f76532,0.949999988079071,4000.0,NS_NET146_L_F2_(9),a5c73608-5a85-495d-bea0-df77b6ce66ea,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -7194cc61-5445-43a9-9039-ddde7ab2be55,0.949999988079071,4000.0,NS_NET126_L_F3_(11),4258f215-5b22-446f-a260-e8cdaa7c95d1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9985e8e1-d8fa-4fdc-86aa-70f5b0ab70fc,0.949999988079071,4000.0,NS_NET126_L_F1_(11),270c7266-45dc-4e45-829f-c04f6b631cad,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f8a76852-55d7-4a20-99a7-cf1fb5a5b1b0,0.949999988079071,4000.0,NS_NET146_L_F2_(17),40537c84-c812-4231-bd23-0ba81922e937,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3052ef96-e3f1-4469-a64e-059f09306044,0.9700000286102295,4000.0,NS_NET136_L_S2_5(2),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a94ba026-b4fc-40d2-a20f-c8201996d717,0.9700000286102295,4000.0,MS2_Last_04,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.00,1.00)}",320.0,h0 -99a1fb27-fa7c-440b-9f25-74237b4e0279,0.949999988079071,4000.0,NS_NET126_L_F3_(24),97ae0aa4-bf05-4b88-8020-83cbda415d22,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -fe429426-1884-4ad7-8d50-69237e4a6a1b,0.9700000286102295,4000.0,NS_NET146_L_F1_(34),fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -7388e938-85cb-495b-bb00-30a050b18327,0.9700000286102295,4000.0,MS1_Last_01,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -8221a6b1-eff3-48fe-88ab-0685a9f59cce,0.9700000286102295,4000.0,NS_NET116_L_S1_2(8),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a3bcf5fc-5937-4182-8a54-180f9810d21d,0.949999988079071,4000.0,NS_NET126_L_F1_(1),4303784e-7193-454a-9be4-3591400b4eeb,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9219bda4-01ce-4067-92b1-595b86e9bbdf,0.9700000286102295,4000.0,NS_NET116_L_S1_1(5),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2596f43d-e805-46b6-a79a-adf9f21fee96,0.949999988079071,4000.0,NS_NET126_L_F3_(2),285a4caa-2da8-4bd2-8a60-7d04f168f378,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -40550e1d-7453-4f20-a5e5-8839d17c2fdf,0.9700000286102295,4000.0,NS_NET136_L_S2_3(7),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -bd4fa1dc-a73a-4aa4-ac9f-d263a45a6cce,0.9700000286102295,4000.0,NS_NET116_L_S2_4(6),e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7e875803-7e9d-4808-8d8c-a722d46fb6af,0.949999988079071,4000.0,NS_NET126_L_F3_(20),732f83b0-b9c5-4b8e-86fe-753c26f40e78,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -33dfa920-da94-44b2-8be9-85a0eeafa626,0.9700000286102295,4000.0,NS_NET136_L_S2_5(1),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e2795c9b-dddb-4012-b56c-e24c3d1c3cdf,0.9700000286102295,4000.0,NS_NET136_L_S1_1(6),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fd1a8de9-722a-4304-8799-e1e976d9979c,0.9700000286102295,4000.0,NS_NET116_L_S1_1(1),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -a4145b3e-7143-4618-99f1-16b43aec3c9e,0.9700000286102295,4000.0,NS_NET136_L_S2_3(5),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8a535e63-ff09-4236-ac68-fb6a21bb0516,0.9700000286102295,4000.0,NS_NET116_L_S1_2(5),3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -47878ba6-7b08-4af8-a7ab-c859d0ac3415,0.9700000286102295,4000.0,NS_NET136_L_S1_3(5),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d5a1a95f-e2b8-402c-86e6-617489ca865d,0.9700000286102295,4000.0,NS_NET116_L_S3_3(3),d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cd65e476-ba5b-46be-b87d-a689b79269eb,0.949999988079071,4000.0,NS_NET126_L_F3_(3),69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -5535881c-50ec-4a74-a67e-5b963aec5b38,0.949999988079071,4000.0,NS_NET146_L_F1_(5),bd8c7d3d-e830-4a46-bf78-0086ce24909f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -4924a294-0f71-4f0d-a058-447a1a74de6c,0.9700000286102295,4000.0,NS_NET136_L_S2_4(8),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4d3af2ae-7637-46bc-a492-1bca70d3bc56,0.9700000286102295,4000.0,NS_NET146_L_F1_(37),450426ac-a560-4d17-b1fc-9e169530a655,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -ae21cb77-4f17-4996-89f3-b2172f479bcc,0.949999988079071,4000.0,NS_NET126_L_F2_(16),d8c35123-b389-4199-84f9-d417d24bb78d,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -2ba29ae5-8b0a-4fee-be31-c6d0cc83f97e,0.9700000286102295,4000.0,NS_NET136_L_S2_4(6),81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -4cf4c2ac-3c96-456e-858b-5000f183230c,0.949999988079071,4000.0,NS_NET126_L_F2_(7),4db634e5-3eb8-4c17-bc44-eb224667580c,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cc08fc6e-1932-4daa-af04-f0376c8be6e2,0.949999988079071,4000.0,NS_NET126_L_F3_(7),50164699-2018-4b17-b3f1-74b082f27403,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -3e0d4895-f0c4-4b4d-8eeb-8c8e24e3e610,0.9700000286102295,4000.0,NS_NET136_L_S2_2(7),cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -cad1c678-6e76-430f-bf7c-db12c6f06239,0.949999988079071,4000.0,NS_NET126_L_F4_(7),98072ded-726f-4f0b-8bbc-4fb6d5086a7b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cc470184-d4ce-468a-b7ef-ed2cb84debfd,0.9700000286102295,4000.0,NS_NET116_L_S1_1(4),8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -db87c6cf-7673-4e25-b510-50086de5d4b8,0.949999988079071,4000.0,NS_NET126_L_F1_(24),4f2402e8-664a-40f2-970a-abc098a2a0d1,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -e25c3969-7e44-48f5-860c-03ff67a65284,0.9700000286102295,4000.0,NS_NET126_L_F1_(29),27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -6a4d97c2-3c6b-4fb8-91a6-2c9a2f9523b1,0.949999988079071,4000.0,NS_NET126_L_F3_(21),5af425fa-6ed7-43e1-8898-7af1315128c5,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -fe02ae6f-bb61-4ab9-83db-43a41f32b0c8,0.9700000286102295,4000.0,MS2_Last_02,535843a3-cf93-412f-b4d7-585337791ba8,,,,"cosPhiFixed:{(0.00,1.00)}",400.0,h0 -cec8879b-a90b-4e15-b664-a7ed0739ae0a,0.9700000286102295,4000.0,NS_NET136_L_S1_2(6),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -791307b1-d235-4df9-9400-e6c2af8b3825,0.9700000286102295,4000.0,NS_NET136_L_S1_1(2),535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -996313f2-93af-477c-92dc-2011a43afd7c,0.9700000286102295,4000.0,NS_NET136_L_S1_5(5),926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -87fb203a-6cbb-4598-8172-8cdef6b04a63,0.949999988079071,4000.0,NS_NET146_L_F2_(26),86af5351-87ef-49c6-bd17-673dceecee5b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6e260432-2b25-444f-8e37-5300eee5a89e,0.949999988079071,4000.0,NS_NET146_L_F2_(2),69efeb2d-9845-49ac-8500-5e017a7a64ef,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -6ad26a2b-9139-4008-bd91-ba2c8918e1e3,0.949999988079071,4000.0,NS_NET126_L_F3_(10),e25387d0-ab9a-406d-bcb4-555414b88b1b,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -32d607eb-c3a1-4906-af14-9e7bf12e5a20,0.9700000286102295,4000.0,NS_NET146_L_F1_(36),8f80e777-ccbd-4630-b10e-238e824113fd,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -b334c8b6-0f65-4891-a761-5208a39aa9d0,0.949999988079071,4000.0,NS_NET126_L_F3_(8),6dcdc87b-a719-416f-9da1-21a701048f3a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -cde58a33-fc7e-4fc6-8843-e0c372234be0,0.9700000286102295,4000.0,NS_NET136_L_S1_4(1),ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8c9dbef2-bf3d-4f5b-bc9f-6c867f016c89,0.9700000286102295,4000.0,NS_NET136_L_S3_5(1),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -08bb3387-aaf3-4005-894b-c195849fcad0,0.949999988079071,4000.0,NS_NET146_L_F1_(12),3b879239-20c8-4adf-bd51-92924327ee71,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d3c547e1-cf64-4993-9b55-5ae1b1d4601c,0.9700000286102295,4000.0,NS_NET136_L_S3_2(7),b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3cec8f8c-5a69-4813-a788-11cfbd48f718,0.9700000286102295,4000.0,NS_NET126_L_F1_(37),3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,,,,"cosPhiFixed:{(0.00,1.00)}",2.0618600845336914,h0 -7ebc343e-c3a4-4f6c-a1f8-e81d2ee35d08,0.9700000286102295,4000.0,NS_NET136_L_S2_5(3),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -ae80f9a2-151c-4f24-99bf-928032df3383,0.9700000286102295,4000.0,NS_NET116_L_S3_5(6),b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -1610169b-0870-40d0-bc26-259e443b30db,0.9700000286102295,4000.0,NS_NET136_L_S3_5(4),3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -528616f2-81a9-44ad-b103-e36cf5c585d9,0.949999988079071,4000.0,NS_NET146_L_F2_(28),ca438ab9-3abc-4416-91d1-df01d1c5fa5a,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -d28f1e85-c5ff-41c9-93b7-ba4ea62eb56d,0.949999988079071,4000.0,NS_NET126_L_F4_(14),d40a1a85-40f2-4ad3-ba58-720d5ba02268,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -60492496-1ab3-4b51-b2c4-245f44a4ce45,0.9700000286102295,4000.0,NS_NET136_L_S2_5(5),c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -d7a977d9-d95f-46f1-b993-2ba120bcd366,0.949999988079071,4000.0,NS_NET146_L_F1_(23),1a1e63f7-6196-4856-9f4e-876a44bdf2f8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -0d6b1569-0276-4f4b-9831-9a99821ff240,0.9700000286102295,4000.0,NS_NET116_L_S3_1(5),4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e8443260-ac5c-4210-9f84-4f40cec0b63b,0.949999988079071,4000.0,NS_NET126_L_F2_(13),b32c5f5e-b6b8-41ed-a192-078e1aed05ac,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -c79513d2-7d86-45be-ab44-3bd13f502a5b,0.9700000286102295,4000.0,NS_NET136_L_S1_3(1),eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -fae24064-659b-4f3b-80f9-c3ecf337cb25,0.949999988079071,4000.0,NS_NET146_L_F2_(7),f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9a751f29-69b8-4ca0-b019-3001e50922d3,0.9700000286102295,4000.0,NS_NET116_L_S1_4(2),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -e81df4d7-0935-40d7-be0b-5b696b24d220,0.949999988079071,4000.0,NS_NET146_L_F1_(21),92cb5065-2e57-4099-8e29-75cbc0c80370,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -571ee907-5b24-46df-872d-560c5f119800,0.9700000286102295,4000.0,NS_NET116_L_S1_4(5),b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -bfb7a7c2-6426-4392-9070-85dd5210a5cf,0.9700000286102295,4000.0,NS_NET116_L_S1_5(4),92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -20f3da7f-110c-48d6-b6f0-9df6f6dfecbc,0.9700000286102295,4000.0,NS_NET116_L_S1_3(3),e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -2848033f-54ed-4507-8d9c-59ec3eb5c3a9,0.949999988079071,4000.0,NS_NET126_L_F1_(19),d2aff632-fc26-4595-931c-92e266247ac8,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -a194f9a2-1380-412b-8285-80ca7ba3a538,0.949999988079071,4000.0,NS_NET126_L_F3_(15),ae234bc5-b751-41f2-95ee-b78de124c583,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -b925ad8d-edb2-4f59-a302-9b33d21d900c,0.949999988079071,4000.0,NS_NET126_L_F3_(16),6232b760-b2e0-485e-9c61-f9721a366a81,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -9c5991bc-24df-496b-b4ce-5ec27657454c,0.949999988079071,4000.0,HS_NET1_L_S2,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,"cosPhiFixed:{(0.00,1.00)}",42105.30078125,h0 -68ca017a-8327-4a88-a2ab-0c7c20383a3e,0.9700000286102295,4000.0,NS_NET136_L_S1_2(7),032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -3eac1fa7-99ba-4f3e-bc50-c7b88a022734,0.949999988079071,4000.0,NS_NET126_L_F1_(12),9d10a92f-576d-4777-99ff-59d145924fea,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -477fdcdc-1983-4190-8f83-3f32ce95d1df,0.949999988079071,4000.0,NS_NET146_L_F3_(28),c72a08bc-4685-49b1-b8ef-803aebc8c388,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 -f817f48f-b565-44a8-9cf9-6824c9bbd012,0.9700000286102295,4000.0,NS_NET136_L_S2_3(6),fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -8f6178ef-fc51-431e-a91a-1b1802a7373c,0.9700000286102295,4000.0,NS_NET116_L_S2_1(5),39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.00,1.00)}",4.1237101554870605,h0 -7063fecf-8601-4a03-8dfe-410b2419133b,0.949999988079071,4000.0,NS_NET146_L_F3_(32),fd3b7bb8-3976-4441-9211-745243afd80f,,,,"cosPhiFixed:{(0.00,1.00)}",2.3157899379730225,h0 +uuid,cos_phi_rated,dsm,e_cons_annual,id,load_profile,node,operates_from,operates_until,operator,q_characteristics,s_rated +bedce1e8-d623-469a-b7ff-bb618588bb3e,0.949999988079071,false,4000.0,NS_NET126_L_F2_(2),h0,5981fe65-3c92-4a78-af92-1461904046d0,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7388e938-85cb-495b-bb00-30a050b18327,0.9700000286102295,false,4000.0,MS1_Last_01,h0,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +8221a6b1-eff3-48fe-88ab-0685a9f59cce,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(8),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5d4b96bf-a6ad-4026-b97a-4e6d77896480,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(4),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a964d9b8-a035-41df-86c0-4c5306af2158,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(7),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7063fecf-8601-4a03-8dfe-410b2419133b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(32),h0,fd3b7bb8-3976-4441-9211-745243afd80f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +62b0b771-b773-4b25-af1d-bbd8a7ad68d4,0.949999988079071,false,4000.0,NS_NET126_L_F2_(8),h0,366a70fb-8d7f-4201-9eca-0fcbc839239d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ff5bf65c-e880-4a49-a286-fd51ce1f48b7,0.9700000286102295,false,4000.0,MS2_Last_03,h0,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +09a47013-bac7-4879-9b8a-9dd854ea9786,0.949999988079071,false,4000.0,NS_NET126_L_F1_(23),h0,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f8a76852-55d7-4a20-99a7-cf1fb5a5b1b0,0.949999988079071,false,4000.0,NS_NET146_L_F2_(17),h0,40537c84-c812-4231-bd23-0ba81922e937,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +50c89980-8da2-4e98-8602-e2f0b560e7c4,0.949999988079071,false,4000.0,NS_NET146_L_F1_(8),h0,d5489e1b-0e7e-4ca9-a362-09c23576a622,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +61c9c21b-38a5-45b3-8a41-60df0bb698ee,0.949999988079071,false,4000.0,NS_NET146_L_F1_(22),h0,1ee9de9a-0095-4b58-beeb-e56fb908844a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +99a0a508-d25a-4136-8300-40a676832d35,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(2),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d95c7612-af94-4ac4-94a0-a1dca839f33a,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(4),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2596f43d-e805-46b6-a79a-adf9f21fee96,0.949999988079071,false,4000.0,NS_NET126_L_F3_(2),h0,285a4caa-2da8-4bd2-8a60-7d04f168f378,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f1804def-a6f6-4603-bfd3-52968a2de732,0.9700000286102295,false,4000.0,MS2_Last_07,h0,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,"cosPhiFixed:{(0.0,1.0)}",2400.0 +1a2d5842-96f6-452f-aa82-6064618d5f49,0.949999988079071,false,4000.0,NS_NET126_L_F3_(29),h0,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +2c90248b-ce63-492c-a2e1-2bd66a3f3287,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(8),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5012a529-b7d2-4f9e-a2d4-90641470cba2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(8),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8387b2f1-1e5f-4d85-8ca1-a78a44b09788,0.949999988079071,false,4000.0,NS_NET126_L_F2_(5),h0,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +6993add7-7f94-4f50-b87a-0b77dc41c421,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(6),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +48ae1ea4-e001-4152-b54c-320fc9f35e92,0.949999988079071,false,4000.0,NS_NET126_L_F4_(5),h0,de5ee252-ebb6-42b0-875c-77ae557ffbf6,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +0ccf950e-a9bf-4de8-ac3f-5ca04a3f0b60,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(6),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +81a6ed8d-f29e-4478-bbf3-ccb6514922f2,0.949999988079071,false,4000.0,NS_NET146_L_F4_(7),h0,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +aff03ab3-9595-499f-931c-8730b1350a2c,0.949999988079071,false,4000.0,NS_NET146_L_F2_(12),h0,8254d91b-e5da-4402-bb8f-301eafa09d28,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +fd17352b-b2ad-4e77-92cf-08b48a1ba757,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(2),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1e79cec6-2546-4e64-92fc-c509d4eea216,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(32),h0,49b511fa-8cff-45f4-9a59-54faaaf90abf,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +89f93344-8dc3-46ea-805b-8c43bffc7577,0.949999988079071,false,4000.0,NS_NET126_L_F4_(15),h0,55b3d03f-2204-4ab3-84cc-a28476868c9d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +16f7000e-1f95-4003-bbbf-8c73cfd02763,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(2),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ee33524a-6c8e-4c12-8b40-7a116e386dbd,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(3),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2848033f-54ed-4507-8d9c-59ec3eb5c3a9,0.949999988079071,false,4000.0,NS_NET126_L_F1_(19),h0,d2aff632-fc26-4595-931c-92e266247ac8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c81fa33a-1c21-4646-b43f-b9a93baf04ad,0.949999988079071,false,4000.0,NS_NET146_L_F2_(5),h0,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +0cdea42f-57da-4a8a-bd83-c4252b7868bf,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(8),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d12ce59d-2cf8-4186-9174-46a8b7f7c9cf,0.949999988079071,false,4000.0,NS_NET146_L_F4_(10),h0,ffcaf979-d707-4d25-8f46-f436f9792d7f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c3434742-e4f0-49e5-baa7-c1e3045c732c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(1),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +0610df61-bdb9-45d1-ab48-a72dca4079c4,0.949999988079071,false,4000.0,NS_NET146_L_F1_(1),h0,4f28e734-5148-4caf-ac64-270231740cbf,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3df803d8-4af6-426e-a51a-4b736ff06d51,0.949999988079071,false,4000.0,NS_NET146_L_F2_(20),h0,2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +12c58b41-2ebb-4bc0-8ca2-a3693d5d5f8b,0.949999988079071,false,4000.0,NS_NET126_L_F3_(1),h0,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8c2ea045-0890-4ee5-8d66-0ce5f5eba7d1,0.949999988079071,false,4000.0,NS_NET146_L_F4_(12),h0,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +040e8122-1873-4622-952d-87ddef148e7e,0.949999988079071,false,4000.0,NS_NET126_L_F2_(1),h0,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +692728c7-5ecf-4c0a-8ead-ae19fc029ba4,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(6),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d75d06ae-7ac0-491c-87ed-e1bb625e349a,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(3),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +63374b45-aa28-4e06-85c2-704c00754ba8,0.949999988079071,false,4000.0,NS_NET146_L_F1_(20),h0,7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3e3225f9-2dd9-402d-9a0d-1d8cde60b1f6,0.949999988079071,false,4000.0,NS_NET126_L_F2_(4),h0,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a0147111-39c4-465a-8a10-48d1de1d349c,0.949999988079071,false,4000.0,NS_NET126_L_F3_(19),h0,922a6375-b97c-412e-a6c9-b0ea55a23f76,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d85bcbda-20fb-481b-bb8d-aead291aa3c1,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(7),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +de2b452a-9eee-4481-b0f0-72d9ab56a4b5,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(1),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c9acf3dd-2d38-47f1-9449-421104c47171,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(8),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +85bfce37-1c9a-4e5a-84ec-47faf7b13821,0.9700000286102295,false,4000.0,MS4_Last_02,h0,174fb4b2-4f9e-415c-bfee-d850ef751307,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +d957a9c6-500e-457d-918b-7f6c4e560bbc,0.949999988079071,false,4000.0,NS_NET146_L_F1_(15),h0,00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +6a4d97c2-3c6b-4fb8-91a6-2c9a2f9523b1,0.949999988079071,false,4000.0,NS_NET126_L_F3_(21),h0,5af425fa-6ed7-43e1-8898-7af1315128c5,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7f6b1274-7b1b-4313-8027-6fc4a31f34e0,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(4),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7cee8d98-be5b-400c-9655-409e1eae9f6d,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(6),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d7f49aa5-ab62-4148-911b-086e8a848af4,0.949999988079071,false,4000.0,NS_NET146_L_F3_(15),h0,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +66f30a61-7722-48a7-a527-99ff55e12754,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(8),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c58dc7e4-f6c5-47e1-a914-e566b8aa6385,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(1),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ee726dbd-8a70-4d50-8cc3-cdda596166c7,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(3),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b89b8560-b729-46d5-8aa1-3c678dd30be4,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(5),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ab0d8c5c-fc68-4ae0-87a9-8edfa3b25339,0.949999988079071,false,4000.0,NS_NET126_L_F1_(4),h0,ff947647-b551-41ae-bcfd-6af228250c96,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9cff3e75-4374-48fc-a20a-27968427dc1a,0.949999988079071,false,4000.0,NS_NET126_L_F3_(5),h0,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +521d8738-0393-4519-8b31-52ed06c9ed18,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(6),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +57d74ff0-f6c4-4932-93c5-9837d101297c,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(2),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1107328f-3c13-4f0b-bde3-1d9580cf40db,0.949999988079071,false,4000.0,NS_NET146_L_F3_(12),h0,f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9abc4242-f58f-474a-99fc-613e083e2589,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(4),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +54f64be5-5966-4c66-8cfa-dd688e59e992,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(4),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ea51cb96-068f-4359-b1d0-27438ce87b49,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(31),h0,5e213f42-d93e-45c5-a295-adbe09105746,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +1a155e7e-9636-4760-a84d-430e293142cc,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(4),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5f2d65fc-7e92-497e-8c51-ead1985d66fa,0.949999988079071,false,4000.0,NS_NET126_L_F2_(24),h0,625bdd2c-a75f-46ef-850c-ca4704d56e55,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c27ac6bb-5227-42d4-832f-985d69bc9c4e,0.949999988079071,false,4000.0,NS_NET146_L_F3_(1),h0,22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +1aeeacdc-e61b-4d44-ac76-699c7b459325,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(2),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +72e4504c-0362-4fe0-a6be-43870f627f7f,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(8),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +36d59a0a-17a5-4955-996b-e3aafb86f4f1,0.949999988079071,false,4000.0,NS_NET126_L_F3_(23),h0,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +038c506d-59b4-406b-88b0-7f74719c55e7,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(3),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4cbcffbf-d9c8-463a-8f11-6990fbda235e,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(2),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c9689bd8-6717-49d5-90d9-a6245b5116e6,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(3),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3a2470e0-1d3f-4f33-990d-20c8b9611ac5,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(7),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3d297678-497c-4620-ad5e-1e70cea8119d,0.949999988079071,false,4000.0,NS_NET146_L_F3_(5),h0,ce71377d-63ea-462a-9290-67e51946a098,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +4336ad38-37d0-4bba-914e-b2ebec0cc8ab,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(2),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ca863e7f-1e42-4716-a214-e79fa91b3222,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(8),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +10963efb-44d7-49bf-b926-c2d29239de60,0.949999988079071,false,4000.0,NS_NET126_L_F2_(3),h0,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +b47f1063-12e8-4b1f-a015-6c5be821a24e,0.949999988079071,false,4000.0,NS_NET126_L_F3_(22),h0,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +86754cd3-ba74-49fb-bf3b-5702b4fd5928,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(33),h0,543f7e9f-b9be-486b-b365-2bae79010758,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +be985e5e-19b6-49c4-bb64-f37a627be13b,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(35),h0,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +895edb06-282c-4965-acab-36c8b86f8f65,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(5),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c3df03ac-0dff-4304-b327-3e88d023f692,0.949999988079071,false,4000.0,NS_NET126_L_F1_(25),h0,3a2f199c-2966-4b9a-939b-3a6c9924341c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +cdf650f2-8200-482a-b5b4-6f96e7f9e0f9,0.949999988079071,false,4000.0,NS_NET126_L_F1_(10),h0,f6a31362-8b0d-4926-b0d0-10bb61db20df,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +666ac620-2151-430e-a9a1-624be6c61cb8,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(5),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +182f6157-58ea-4fe2-92a2-90845427fbd0,0.949999988079071,false,4000.0,NS_NET126_L_F3_(13),h0,f29859be-c6e7-4cf9-84d7-239eb98a9e65,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +16b0791d-eeff-4b12-b1fe-2961bf0fd4c2,0.949999988079071,false,4000.0,NS_NET126_L_F4_(10),h0,857c264a-7072-4bb7-af56-2f01539b2a2e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +742de2f0-f057-47d0-83a3-9f57f84eb314,0.949999988079071,false,4000.0,NS_NET126_L_F4_(1),h0,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d7a1b657-6d15-45c7-8d04-d2eef97429b0,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(6),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8d84639d-d746-49c5-bc46-33a2aae666e7,0.949999988079071,false,4000.0,NS_NET126_L_F1_(16),h0,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f2f13d1d-3643-4d94-b519-94ea266b8816,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(3),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7194cc61-5445-43a9-9039-ddde7ab2be55,0.949999988079071,false,4000.0,NS_NET126_L_F3_(11),h0,4258f215-5b22-446f-a260-e8cdaa7c95d1,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +29a47779-6c11-490f-a0b2-e33c6c7a06b3,0.949999988079071,false,4000.0,NS_NET126_L_F3_(25),h0,1bf26b4d-03cc-4490-8c33-d3db8597d807,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +acc82c39-9615-4a9b-83a5-76c4704cbee0,0.949999988079071,false,4000.0,NS_NET146_L_F3_(13),h0,bdf97a4d-622c-4251-8183-8b1a696f376e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f855cedf-e3f0-4c0f-addd-c57deb4f9e03,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(2),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +f60efe06-32af-466f-9359-52cc8a59b985,0.949999988079071,false,4000.0,NS_NET126_L_F2_(17),h0,c5457e35-ad81-4427-9d3a-99e4c44ccae8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +02e0c339-6dfd-4cbc-bebf-56b850053a7c,0.949999988079071,false,4000.0,NS_NET146_L_F1_(3),h0,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +46644e3e-b00c-4707-ae8d-94fed9f0adcd,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(38),h0,06b7f21a-d6d7-4ec0-94c6-141845f14986,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +660e69f8-cba2-45d0-9d0c-f7d5be09451d,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(6),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +759ff1e6-5ad6-4701-bbe1-059c08a1781d,0.949999988079071,false,4000.0,NS_NET146_L_F4_(15),h0,576840db-7d3c-417b-b587-28b222e740e1,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ef6f6592-1b85-4204-82e1-c33a6ed3d582,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(1),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ef94c79c-ade7-4215-ba16-0bb14d558aab,0.949999988079071,false,4000.0,NS_NET146_L_F1_(13),h0,f1e55c8b-357f-45a7-9d57-e299f9b207f3,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +086208d0-52d4-4198-9f3d-966aa7a5557e,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(7),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +eed8fa68-08b5-49f3-a6d7-2632fe7b13b9,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(3),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +477fdcdc-1983-4190-8f83-3f32ce95d1df,0.949999988079071,false,4000.0,NS_NET146_L_F3_(28),h0,c72a08bc-4685-49b1-b8ef-803aebc8c388,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +33cd1941-51f2-425a-8f4d-67e00d0b1876,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(6),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d5e593f1-727e-4983-8abe-92a328aa203b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(2),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +62800519-5f5f-4081-ae89-9b2b0784a714,0.949999988079071,false,4000.0,NS_NET126_L_F2_(6),h0,9d7038e9-5bcc-4676-bead-46c4f1291ba8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +cb0661c0-15fb-4475-9e0b-fbcf734e19c7,0.949999988079071,false,4000.0,NS_NET146_L_F1_(4),h0,dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5f56df23-f5b3-42d0-9896-85015f7b1274,0.949999988079071,false,4000.0,NS_NET126_L_F2_(28),h0,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +40ddb9cf-46f1-4ee6-8feb-432affbc95bf,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(1),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +07ba8eae-b76d-4034-b378-a3ef8134fc2b,0.949999988079071,false,4000.0,NS_NET126_L_F2_(27),h0,daed3552-e382-4153-95be-97f17e2c53e5,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a1af0e38-339c-491c-94d8-446cf662d89b,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(1),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +abe6ade3-f1c5-41c0-a850-1292506f3837,0.949999988079071,false,4000.0,NS_NET146_L_F3_(10),h0,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +0cf1f5c4-996b-4422-b61b-b4fbc840d004,0.949999988079071,false,4000.0,NS_NET146_L_F3_(24),h0,773aebe4-fc03-46be-8209-0213e2760a8e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c1049c54-1558-4d61-b47f-004b17e38770,0.949999988079071,false,4000.0,NS_NET126_L_F4_(16),h0,b8fa1f73-223c-4b08-a140-44f12484cce3,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +20f3da7f-110c-48d6-b6f0-9df6f6dfecbc,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(3),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4642d648-b0dd-4597-a3bd-2cc1fce74f27,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(1),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8a5a7de2-d61c-4172-b917-7404a2aba038,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(3),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8f6178ef-fc51-431e-a91a-1b1802a7373c,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(5),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3eac1fa7-99ba-4f3e-bc50-c7b88a022734,0.949999988079071,false,4000.0,NS_NET126_L_F1_(12),h0,9d10a92f-576d-4777-99ff-59d145924fea,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +67379832-1cfb-4015-ac96-0fe499463c42,0.949999988079071,false,4000.0,NS_NET126_L_F4_(3),h0,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +e17786aa-4cf5-46d6-ad37-96f4d4502b1f,0.949999988079071,false,4000.0,NS_NET146_L_F4_(8),h0,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +188c5841-af7d-48ea-95ac-7178dc7407c9,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(8),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +599e7b5f-7a78-4bb4-a3c3-e6f2779bbda2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(2),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +080e6ab5-8021-43c0-bf9f-2424ec0a1de8,0.949999988079071,false,4000.0,NS_NET126_L_F3_(30),h0,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ea515ef0-c8e1-4e3f-9420-577ba394c7dc,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(7),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c79513d2-7d86-45be-ab44-3bd13f502a5b,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(1),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3025fcc5-7a14-4bbe-93a1-0b2533306ea1,0.949999988079071,false,4000.0,NS_NET146_L_F1_(11),h0,666757e2-292e-473c-ac9c-04c0786574bc,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +e8443260-ac5c-4210-9f84-4f40cec0b63b,0.949999988079071,false,4000.0,NS_NET126_L_F2_(13),h0,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +130b7cb2-f379-4d6c-b71d-404d87260133,0.949999988079071,false,4000.0,NS_NET146_L_F2_(19),h0,636dec7c-4242-46e8-b7ae-db7e5a28c39c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5fa8b3e6-ed79-4804-997b-4c6eb2c7727b,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(5),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5ab2e1b6-7c4b-4cba-8528-94bda71c3dcd,0.9700000286102295,false,4000.0,MS1_Last_03,h0,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +93128545-6977-41fa-8e20-5d7a930d80c9,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(3),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1b64ea94-b338-40aa-92c8-144c7caaa8c2,0.9700000286102295,false,4000.0,MS1_Last_05,h0,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +62fad34c-a778-4140-a13d-dee5f0af255d,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(33),h0,b425b28e-48a8-4ec4-a15a-387fcfb79895,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +0211454c-9be4-470f-9cf5-cef9b87cb640,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(5),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3e0d4895-f0c4-4b4d-8eeb-8c8e24e3e610,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(7),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ab77ac85-7990-4b93-a4e7-6fb812ad345a,0.949999988079071,false,4000.0,NS_NET146_L_F3_(3),h0,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a00956d5-6648-484c-a485-b3491c5181c2,0.949999988079071,false,4000.0,NS_NET126_L_F1_(20),h0,36cda100-86ae-4a20-ac71-20af603ac0cf,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +6559c5f4-c9ed-4f01-af36-72d18f04ca9a,0.949999988079071,false,4000.0,NS_NET126_L_F1_(15),h0,41c0087f-ce27-4da3-97d2-92d711b639b4,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9a751f29-69b8-4ca0-b019-3001e50922d3,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(2),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +73c923b1-49ef-49b6-863f-8badb0915f70,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(2),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +16cd0d9b-bbaa-4d71-ad87-b8e834cf478d,0.9700000286102295,false,4000.0,MS2_Last_01,h0,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +b431628f-bc6f-49ca-9f23-19fe41aadb53,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(2),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3857ce77-a630-4b43-a1a1-6bebc0817e1d,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(2),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +6bd61b8c-2b53-4fc8-8e35-b17ed81ba8c9,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(7),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b5c6af22-2d56-4bd1-8235-74db06106eba,0.949999988079071,false,4000.0,NS_NET146_L_F3_(23),h0,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +63fb1af5-91e5-472b-b798-b2846cf701ba,0.949999988079071,false,4000.0,NS_NET146_L_F2_(16),h0,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5c3fb165-f374-44fa-802e-e82e5a2538f0,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(4),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +bd4fa1dc-a73a-4aa4-ac9f-d263a45a6cce,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(6),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1a88ba6f-9005-432d-9a8f-54a48c90015a,0.9700000286102295,false,4000.0,MS4_Last_05,h0,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +2de16d4b-e4e0-41e0-ae33-105930964fcd,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(31),h0,80d8252b-045f-471a-9638-416ed3f86120,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +689527be-31a0-4791-970d-8542e367401c,0.949999988079071,false,4000.0,NS_NET126_L_F2_(23),h0,9b509c7d-4647-40fd-b03e-7ab919215cc6,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +1fb9be59-d27c-4748-a090-db5a58063d82,0.949999988079071,false,4000.0,NS_NET126_L_F4_(6),h0,e3a40690-d085-4796-9fcb-48d776e58594,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +2d758bef-0a8a-4dac-aca6-556ace61ec84,0.949999988079071,false,4000.0,NS_NET126_L_F3_(32),h0,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5535881c-50ec-4a74-a67e-5b963aec5b38,0.949999988079071,false,4000.0,NS_NET146_L_F1_(5),h0,bd8c7d3d-e830-4a46-bf78-0086ce24909f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a4145b3e-7143-4618-99f1-16b43aec3c9e,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(5),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a6ce4a93-174a-4ca0-92bb-f09abc579d81,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(1),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +33dfa920-da94-44b2-8be9-85a0eeafa626,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(1),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +32d607eb-c3a1-4906-af14-9e7bf12e5a20,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(36),h0,8f80e777-ccbd-4630-b10e-238e824113fd,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +1fbefcb1-57ec-4b86-8b7e-c892f0e6b179,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(6),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7513eb4a-3244-40fb-b500-0132947a02e0,0.9700000286102295,false,4000.0,MS3_Last_02,h0,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +b334c8b6-0f65-4891-a761-5208a39aa9d0,0.949999988079071,false,4000.0,NS_NET126_L_F3_(8),h0,6dcdc87b-a719-416f-9da1-21a701048f3a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +e2795c9b-dddb-4012-b56c-e24c3d1c3cdf,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(6),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b925ad8d-edb2-4f59-a302-9b33d21d900c,0.949999988079071,false,4000.0,NS_NET126_L_F3_(16),h0,6232b760-b2e0-485e-9c61-f9721a366a81,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ae603fbc-a262-47ab-bea7-251fd61f3964,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(4),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5596dd40-f34f-4ec4-bf80-17fcf122a67b,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(6),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ae21cb77-4f17-4996-89f3-b2172f479bcc,0.949999988079071,false,4000.0,NS_NET126_L_F2_(16),h0,d8c35123-b389-4199-84f9-d417d24bb78d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f817f48f-b565-44a8-9cf9-6824c9bbd012,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(6),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +0c62dc7f-45a7-44e3-9240-f9ff9d62e4a0,0.949999988079071,false,4000.0,NS_NET126_L_F4_(13),h0,da79c960-d35a-4193-9b06-2d4d57051706,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8df8d6b5-ef51-4901-aaed-bf29c912acd5,0.949999988079071,false,4000.0,NS_NET146_L_F3_(21),h0,a4a44d93-48d6-4b87-8053-87fe0778e75c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +47878ba6-7b08-4af8-a7ab-c859d0ac3415,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(5),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2eca146b-7c7e-47fa-a0be-807b7fc72fd5,0.949999988079071,false,4000.0,NS_NET126_L_F3_(4),h0,bf7e7268-2fb6-4948-ace6-9037ae148fa3,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +916670c1-1575-4fe8-acb0-1dcf1c218386,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(6),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +0d6b1569-0276-4f4b-9831-9a99821ff240,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(5),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4924a294-0f71-4f0d-a058-447a1a74de6c,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(8),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +716dc985-7e6d-4681-b4d8-aa9c039a347e,0.9700000286102295,false,4000.0,MS1_Last_07,h0,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,"cosPhiFixed:{(0.0,1.0)}",2400.0 +08bb3387-aaf3-4005-894b-c195849fcad0,0.949999988079071,false,4000.0,NS_NET146_L_F1_(12),h0,3b879239-20c8-4adf-bd51-92924327ee71,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3f5718ca-fc58-4b00-b634-1aa6307c6cfa,0.949999988079071,false,4000.0,NS_NET146_L_F2_(1),h0,2c520ab6-507e-4dcf-ab05-8f238e9b9385,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d5b04d0c-bdda-450b-b939-aec8af923eea,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(5),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +60492496-1ab3-4b51-b2c4-245f44a4ce45,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(5),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ed173f7f-071e-4687-b7fe-b59616148ee3,0.949999988079071,false,4000.0,NS_NET126_L_F4_(17),h0,7125de08-1d28-409a-8b23-023a0294def5,,,,"cosPhiFixed:{(0.0,1.0)}",0.10000000149011612 +68ca017a-8327-4a88-a2ab-0c7c20383a3e,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(7),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3cec8f8c-5a69-4813-a788-11cfbd48f718,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(37),h0,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +35408c17-cd77-4115-8357-9fb0e8f76532,0.949999988079071,false,4000.0,NS_NET146_L_F2_(9),h0,a5c73608-5a85-495d-bea0-df77b6ce66ea,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +590108ac-416d-44fe-b574-4069cea1dbb1,0.9700000286102295,false,4000.0,MS3_Last_04,h0,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +d7a977d9-d95f-46f1-b993-2ba120bcd366,0.949999988079071,false,4000.0,NS_NET146_L_F1_(23),h0,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +791307b1-d235-4df9-9400-e6c2af8b3825,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(2),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5d930bf2-0b63-4821-bd6c-02383e3b4220,0.9700000286102295,false,4000.0,MS1_Last_04,h0,1396cb4c-cee7-4116-97c9-290f98785719,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +fae24064-659b-4f3b-80f9-c3ecf337cb25,0.949999988079071,false,4000.0,NS_NET146_L_F2_(7),h0,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8c9dbef2-bf3d-4f5b-bc9f-6c867f016c89,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(1),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +db87c6cf-7673-4e25-b510-50086de5d4b8,0.949999988079071,false,4000.0,NS_NET126_L_F1_(24),h0,4f2402e8-664a-40f2-970a-abc098a2a0d1,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9219bda4-01ce-4067-92b1-595b86e9bbdf,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(5),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +dd53cc4e-93a6-47f1-afa0-a46f82e3b371,0.949999988079071,false,4000.0,NS_NET146_L_F4_(11),h0,8b3e3802-5213-46d0-a498-15eb6e5852b5,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +b4b07036-0d49-4f8f-9194-0181e11d0470,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(7),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +571ee907-5b24-46df-872d-560c5f119800,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(5),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +aef6783d-889c-48a2-bdf5-7a9086a73548,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(7),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a94ba026-b4fc-40d2-a20f-c8201996d717,0.9700000286102295,false,4000.0,MS2_Last_04,h0,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +0045a53f-8f38-4239-8109-073a768cc593,0.949999988079071,false,4000.0,NS_NET146_L_F4_(1),h0,ead38a50-b8f7-4bbb-b65d-f54350825e8e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +397c7198-feee-4f46-9149-1ef9d31d9ba2,0.9700000286102295,false,4000.0,MS3_Last_01,h0,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +99a1fb27-fa7c-440b-9f25-74237b4e0279,0.949999988079071,false,4000.0,NS_NET126_L_F3_(24),h0,97ae0aa4-bf05-4b88-8020-83cbda415d22,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a34932f7-012c-4a27-aa5f-4dd043028d5e,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(8),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a2d372db-d13c-4d3c-a987-ccf4138d43f2,0.9700000286102295,false,4000.0,MS4_Last_07,h0,898d8295-bf35-4079-9374-99b059c2c956,,,,"cosPhiFixed:{(0.0,1.0)}",2400.0 +1610169b-0870-40d0-bc26-259e443b30db,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(4),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +903c6f31-7c78-4d1e-b4ee-bf0dcbb9e938,0.949999988079071,false,4000.0,NS_NET146_L_F1_(10),h0,6c24b464-790a-4aae-bb11-766718f07cd5,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8a535e63-ff09-4236-ac68-fb6a21bb0516,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(5),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ec035312-7214-4060-a502-71cbe819f32a,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(1),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9e5845cb-9ad1-42c6-8630-724375a4e323,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(8),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a8e26f05-54f0-4da7-abfa-228661833e03,0.949999988079071,false,4000.0,NS_NET126_L_F3_(18),h0,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +2ba29ae5-8b0a-4fee-be31-c6d0cc83f97e,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(6),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +61314082-488b-4045-8c90-dad4629be04c,0.949999988079071,false,4000.0,NS_NET126_L_F2_(10),h0,3d81adf5-73d1-4708-b03b-3afc7db017f4,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d5a1a95f-e2b8-402c-86e6-617489ca865d,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(3),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +6e260432-2b25-444f-8e37-5300eee5a89e,0.949999988079071,false,4000.0,NS_NET146_L_F2_(2),h0,69efeb2d-9845-49ac-8500-5e017a7a64ef,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +4384a56f-5b34-430c-89d8-354f367fa7ff,0.949999988079071,false,4000.0,NS_NET146_L_F3_(29),h0,15345698-c319-461f-b969-37d50fb84220,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +08a60d08-3a12-4263-a831-274f3b374cbb,0.9700000286102295,false,4000.0,MS3_Last_03,h0,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +e65cd082-dd8f-45d6-895c-e14357e76ac8,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(2),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +40550e1d-7453-4f20-a5e5-8839d17c2fdf,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(7),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1f901bde-3ada-4e30-8a4c-a264df5b2f38,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(5),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c2402412-97fa-4ca4-aa66-e6e04d010001,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(36),h0,ca3391eb-ca94-4945-ac72-e116f396f82c,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +87fb203a-6cbb-4598-8172-8cdef6b04a63,0.949999988079071,false,4000.0,NS_NET146_L_F2_(26),h0,86af5351-87ef-49c6-bd17-673dceecee5b,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +cec8879b-a90b-4e15-b664-a7ed0739ae0a,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(6),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9b12597e-619f-4953-86c6-21f8d262bfbd,0.949999988079071,false,4000.0,NS_NET146_L_F4_(6),h0,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f2284780-6019-4864-bf29-915330717f5b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(5),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +cc470184-d4ce-468a-b7ef-ed2cb84debfd,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(4),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1469946c-101e-42e9-9e48-28801e9610af,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(28),h0,0c266541-6235-4d01-8258-e763c58af6c7,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +c7a0e7d2-276f-41e7-bfbc-f11fac26a0e1,0.9700000286102295,false,4000.0,MS3_Last_05,h0,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +8decd09e-f82a-4f38-8946-14a9b437303f,0.949999988079071,false,4000.0,NS_NET126_L_F2_(18),h0,e80aa2db-f32c-410d-96a1-a32e03222568,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +1100ef62-0d33-46df-8ac7-c949d843217c,0.949999988079071,false,4000.0,NS_NET146_L_F3_(22),h0,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +00a6de01-2304-484b-90f2-5abb044167a3,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(2),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +dcaeda6e-2dfc-4b53-9c25-cf51d486bb34,0.949999988079071,false,4000.0,NS_NET126_L_F2_(21),h0,1dee13af-e638-4858-9c69-0069190cd577,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5b821f32-64d4-436f-9840-40d04872f20f,0.949999988079071,false,4000.0,NS_NET126_L_F3_(12),h0,eb125953-31d3-4207-adf7-aba3a3790d6f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9d2c5b78-ad86-4055-b74b-e5b24f89a75b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(4),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d28f1e85-c5ff-41c9-93b7-ba4ea62eb56d,0.949999988079071,false,4000.0,NS_NET126_L_F4_(14),h0,d40a1a85-40f2-4ad3-ba58-720d5ba02268,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +000e54d4-cf92-4cdb-9777-3d40d320d2b6,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(6),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +080cbc7e-6acf-434d-ae38-b693f19edc69,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(4),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +df1ebc6d-1252-4496-98bc-50f6ff46a085,0.949999988079071,false,4000.0,NS_NET126_L_F1_(18),h0,2f64bf67-cee9-44bb-8c13-ff96878932af,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +099f4cde-75ca-4928-904d-37717b5b1b02,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(3),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a9bb2858-c56d-4594-a364-fcfaf448d0e5,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(7),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +cbb8c279-5b80-4583-bec3-b878ab0c2755,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(1),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +e035cc33-0a53-4dc4-b35d-f3f44764a5aa,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(1),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ff0b995a-86ff-4f4d-987e-e475a64f2180,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(1),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +53347503-af44-482a-8b97-d1b638bb3634,0.949999988079071,false,4000.0,NS_NET146_L_F2_(23),h0,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +aaa0a903-46f7-4109-adb3-9f43398fc932,0.949999988079071,false,4000.0,NS_NET126_L_F4_(11),h0,95ced3b5-69fd-4171-9c34-f18802064e22,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +180167d5-7277-407f-a269-da5d2f1e30f0,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(3),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +dd893829-b4af-4cf1-9d70-79ae68b91bf0,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(6),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +038ee933-439a-4705-b526-0373a4b0b16a,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(1),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +e87a4990-0f33-44dc-bb98-ca7dd38e2493,0.949999988079071,false,4000.0,NS_NET146_L_F1_(18),h0,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ceec9e98-5303-4df3-99e8-592509c19d74,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(7),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +388ecdb9-b7e1-429e-990b-b5124fac12cf,0.949999988079071,false,4000.0,NS_NET146_L_F2_(6),h0,5071dd8c-bbc1-4c8d-a180-4492f80e183d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +cde58a33-fc7e-4fc6-8843-e0c372234be0,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(1),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +12f5a119-679c-4198-b133-a4596816f6d1,0.949999988079071,false,4000.0,NS_NET146_L_F2_(14),h0,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +2efedcfd-4972-4d13-9d62-180f1b9a76ad,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(1),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +e3e2d73e-3dfc-42ae-ad50-fadebdf38868,0.949999988079071,false,4000.0,NS_NET126_L_F1_(26),h0,3802b603-d08d-4031-b7d7-e29734bcc122,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +bc54e624-8931-4188-9405-950e8deae723,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(6),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +26bf78c9-48ea-4004-9148-eaee014d6f09,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(7),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4cf4c2ac-3c96-456e-858b-5000f183230c,0.949999988079071,false,4000.0,NS_NET126_L_F2_(7),h0,4db634e5-3eb8-4c17-bc44-eb224667580c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ae80f9a2-151c-4f24-99bf-928032df3383,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(6),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a82e1da2-1af2-40d8-b8f9-b4027118d029,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(5),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b16bea09-e042-4bd1-837e-78125b0085dc,0.949999988079071,false,4000.0,NS_NET126_L_F1_(13),h0,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8d326225-ff42-40ab-b58e-adc0cb32c9ff,0.949999988079071,false,4000.0,NS_NET146_L_F3_(9),h0,6570535c-0d2e-4846-9951-21559902f67a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8cd07c7c-1264-4141-b90e-e2b6f39c44be,0.949999988079071,false,4000.0,NS_NET126_L_F4_(9),h0,119d270a-ff22-4fdb-8214-cb5b336790bf,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d4004ab6-3b00-4eeb-b62a-4ec28dc9cec6,0.949999988079071,false,4000.0,NS_NET126_L_F2_(14),h0,9ce9d92c-5583-4b16-bec6-9f67834663cb,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +af4c1bfe-4e4c-437d-9eff-42060aaf4027,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(7),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +bee4283a-0d36-4f98-a837-23d0667a6675,0.949999988079071,false,4000.0,NS_NET126_L_F3_(9),h0,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7b187641-d6fa-49f2-afd6-b03125c1acea,0.949999988079071,false,4000.0,NS_NET126_L_F2_(22),h0,177a20fe-83b1-46df-94a3-4faa54348d10,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5d842fa6-eb7a-4f88-8dd3-f7eac01afaad,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(29),h0,867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +a08a45bb-552f-435d-b614-aed657073527,0.949999988079071,false,4000.0,NS_NET126_L_F2_(15),h0,2645e336-b0df-4d1e-a0ea-375444488f06,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c2446989-6050-49f9-ab98-d8cfb8058709,0.949999988079071,false,4000.0,NS_NET126_L_F2_(26),h0,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c806a93a-5f1c-47ba-9c67-31a86ae2658c,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(39),h0,60173008-809d-4d8f-b06a-3c4a838dd989,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +5f58fa15-aff8-4a9b-bfc0-8ef690d6dba3,0.949999988079071,false,4000.0,NS_NET146_L_F2_(27),h0,b179c38b-5af0-4304-84b1-1dc03314fd80,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3c9a2f9a-8cd0-42f2-9d16-f6314c741aa3,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(4),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c67f5f1a-7adf-4715-a0ee-1bc0156b7bb9,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(6),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7ce95168-5af2-4274-943d-601176146ce8,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(8),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3f37f3bc-f9cf-4a55-96e4-ee4be9f22a63,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(2),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +422a643a-04d2-480b-b107-e8582b36e641,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(7),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +04c0cbcf-4e9d-4608-bb92-6ab97e59ece7,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(4),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +573a3f21-49d8-4e2b-bca0-d546d77bb143,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(3),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8d1ee87d-73a7-46eb-b174-602683d702d9,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(28),h0,012c9eee-86c2-494c-adcc-bbfc481e4a46,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +75b3f626-a1e0-47d6-9d2f-658500ac7630,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(38),h0,32507a10-1eed-4a3f-820c-bc187f3b052e,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +528616f2-81a9-44ad-b103-e36cf5c585d9,0.949999988079071,false,4000.0,NS_NET146_L_F2_(28),h0,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8736f13d-fcf4-486a-8225-259bfd9bd206,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(8),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7ebc343e-c3a4-4f6c-a1f8-e81d2ee35d08,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(3),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5cffadab-94f6-4d98-a804-9d74189982cc,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(7),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +497de722-6c3b-49a5-8f1c-125c76a4a9cd,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(5),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4dca3b1d-5d24-444a-b4df-f4fa23b9ef1b,0.949999988079071,false,4000.0,HS_NET1_L_S1,h0,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,"cosPhiFixed:{(0.0,1.0)}",42105.30078125 +09fb83df-cd0f-4dca-a5b6-edc18d662e93,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(7),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3b63c80f-a5c6-439b-97be-4e1efda58ccd,0.949999988079071,false,4000.0,NS_NET146_L_F2_(22),h0,5862f526-783a-4218-a463-3cbf5de8dade,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8bee3a68-8990-46eb-9230-067111caceb5,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(3),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3ac82a59-756c-4ead-b34e-02957fc69ec4,0.949999988079071,false,4000.0,NS_NET126_L_F1_(21),h0,14ae9865-cb9b-4518-9f2a-c0fda3455a42,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +b3ce3d49-d4d5-4b76-a589-02d0c7faf5a5,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(6),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +fe02ae6f-bb61-4ab9-83db-43a41f32b0c8,0.9700000286102295,false,4000.0,MS2_Last_02,h0,535843a3-cf93-412f-b4d7-585337791ba8,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +f3168cab-a847-4314-9bf9-4dbe269c1c3c,0.949999988079071,false,4000.0,NS_NET146_L_F3_(8),h0,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8d50a47b-95ce-4a8e-84a3-80d5781dcc53,0.9700000286102295,false,4000.0,MS4_Last_01,h0,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +aa1ce00f-1a17-4172-9040-9ba15b179a15,0.949999988079071,false,4000.0,NS_NET146_L_F4_(16),h0,9f7599de-c488-46c5-b053-1279a511f7b9,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a3bcf5fc-5937-4182-8a54-180f9810d21d,0.949999988079071,false,4000.0,NS_NET126_L_F1_(1),h0,4303784e-7193-454a-9be4-3591400b4eeb,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +5312d132-f5bc-4c34-98ca-16221a0111e2,0.949999988079071,false,4000.0,NS_NET146_L_F3_(2),h0,0b2a3b46-5e43-4879-973e-d8fb96429d8a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +05124256-80e0-43cf-a3c5-dc565ef38a07,0.949999988079071,false,4000.0,NS_NET146_L_F3_(27),h0,55caf2ec-a21b-4afd-8830-1e4009cce396,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9b0cca4d-f27f-4190-b35f-a84fa09ac157,0.949999988079071,false,4000.0,NS_NET146_L_F1_(14),h0,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8bd4fb73-bc7f-45c9-b1e6-916afd2e7359,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(4),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +0de47e33-a4fb-4a86-839d-ec9ad49a8414,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(6),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2485a766-3e5c-4950-b598-0c3b84c747a7,0.949999988079071,false,4000.0,NS_NET146_L_F2_(4),h0,369cffa5-bcee-4489-8193-1d9b10230eca,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +6069eb20-4107-483f-8144-5bd479e32d98,0.949999988079071,false,4000.0,NS_NET126_L_F2_(12),h0,9d02ea80-98d8-4cd0-a635-9104a14a56dd,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +2f4df67a-e33a-4a1b-9caa-41bfb4408b8c,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(8),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4958e21c-cf9d-4bae-ad3f-a1612171c398,0.949999988079071,false,4000.0,NS_NET126_L_F1_(7),h0,fc7821d2-ac64-483e-b520-38d9971f4db0,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +94203400-1579-4cc0-9395-ac67f94c6c01,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(3),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2b02fad4-245d-4ada-ae5f-0252f2aa59f1,0.949999988079071,false,4000.0,NS_NET146_L_F2_(11),h0,f26b5511-3c50-42d5-97c2-be408330eb84,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +b9fb3d41-bb0e-4c4c-bff5-1b50d40efc33,0.949999988079071,false,4000.0,NS_NET126_L_F1_(3),h0,04f29760-9e52-4943-8563-62e1fbd5ed52,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9c5991bc-24df-496b-b4ce-5ec27657454c,0.949999988079071,false,4000.0,HS_NET1_L_S2,h0,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,"cosPhiFixed:{(0.0,1.0)}",42105.30078125 +8b9c12d1-5398-4c42-80a6-9604978de820,0.949999988079071,false,4000.0,NS_NET146_L_F4_(3),h0,b5548457-5923-4d52-b3c9-fdb75a1df98e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3f47dbb5-8254-43d1-83a8-21385cb666dd,0.949999988079071,false,4000.0,NS_NET126_L_F2_(25),h0,1dcddd06-f41a-405b-9686-7f7942852196,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +34671961-b8a8-49f9-a99e-c7b5a33c600e,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(2),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2ab66e57-dd5f-4295-a6f5-f017fb4db8b1,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(8),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +fd1a8de9-722a-4304-8799-e1e976d9979c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(1),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +95a1e026-be40-4209-9752-fbab3a626b87,0.949999988079071,false,4000.0,NS_NET146_L_F1_(2),h0,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +209cebb3-6706-49d0-af2c-b2ae23ca3873,0.9700000286102295,false,4000.0,MS4_Last_03,h0,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +4dcec977-6c98-4bd2-b6f2-dc32d9c61cf2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(4),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +f4536a0c-33d2-4c57-918c-0ebdf768265a,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(1),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b47d3f0a-f480-49ef-ba7e-7979c81b0f70,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(32),h0,033d0230-4aee-47cf-91f9-81f5f40e60b0,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +7b6cd13c-8f54-421e-b2e9-5888f181737b,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(27),h0,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +0a8bf78c-1e57-44f1-baee-0a8d8383875c,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(1),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ec81e030-4dc6-462a-9218-b5c791e82da7,0.949999988079071,false,4000.0,NS_NET146_L_F4_(5),h0,d7023c15-adb7-4d56-9f86-b182611a47ef,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3ad0235e-751b-4682-89a5-b359aef0dd98,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(2),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +59f1999e-008d-47f0-b99d-1305fcb8f525,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(7),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +96da3f13-3c72-4e9a-b433-a319a9018b40,0.949999988079071,false,4000.0,NS_NET146_L_F2_(21),h0,bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +81e75c16-c8a4-4328-bc97-635049829f57,0.949999988079071,false,4000.0,NS_NET146_L_F2_(24),h0,970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +b2789995-79a1-4859-8d1c-70107b83c18b,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(2),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +17a02ab8-32b2-436d-8aab-04fbd3809c87,0.949999988079071,false,4000.0,NS_NET146_L_F3_(25),h0,c6c177b0-5004-4db0-8cde-6293330a4757,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +fc5139da-5e61-44c5-8843-4f76df7c6e33,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(39),h0,904c7476-5f16-4ec2-9138-7d5e32d38a3b,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +cdd0ae9a-c06e-4234-aea3-255f359dbe64,0.949999988079071,false,4000.0,NS_NET146_L_F3_(16),h0,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a265d035-d8ea-41e0-ad10-04e064b9a968,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(5),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +58cb8168-7a34-41e2-9db6-88a67287c5e9,0.949999988079071,false,4000.0,NS_NET146_L_F2_(8),h0,792b505c-87ab-4665-a31d-b6035c5ece70,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +ef07774d-107b-4536-8d1d-45c28f755a80,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(6),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d3b5447b-a2ba-4f17-a10c-bd6354ab2338,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(5),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a610a50c-de39-46e6-b53b-95e3868d1072,0.949999988079071,false,4000.0,NS_NET126_L_F2_(11),h0,6678c226-c5d2-4ce3-9728-dc1163be799f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +146fba6b-bbbe-4f3b-ba51-2f3a2c31b118,0.949999988079071,false,4000.0,NS_NET126_L_F1_(22),h0,c317a6cd-428b-4c36-8233-91d0c4e2717a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c9576364-4a47-450d-a25d-864dd12ef7fa,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(3),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +e4f045d6-7f37-4871-b357-621d97b9c2a8,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(8),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +0d983289-2ff2-4f2c-b38a-bab3ec967c76,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(4),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +550f9346-fe14-46ef-bd54-00980834e0d6,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(34),h0,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +5f825da0-bf7e-4846-9601-9049cac0f958,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(3),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3e94ff28-fd2e-4028-a188-58ce85136fdf,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(5),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3052ef96-e3f1-4469-a64e-059f09306044,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(2),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2e7dda3e-4bd4-4bb7-8e15-260f709ab92e,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(3),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c3d643d1-1b2d-4f9f-838d-5b1ce270fc33,0.949999988079071,false,4000.0,NS_NET126_L_F2_(9),h0,a286f73a-20ee-4056-8129-c7963b34ecd9,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +4c6e6e4f-d4cb-4de3-b406-ff3ec1d50280,0.949999988079071,false,4000.0,NS_NET146_L_F2_(3),h0,0170837a-1876-45f9-a613-666f9991964d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +0442c234-22f8-4022-8daa-2f191e4a6bf3,0.949999988079071,false,4000.0,NS_NET146_L_F1_(24),h0,205fcee1-928c-4374-950c-34575f07fa49,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f630b338-5685-424d-bfbe-338bf94a0e01,0.949999988079071,false,4000.0,NS_NET126_L_F3_(6),h0,e018b95e-fca5-40f7-8550-b05a619169dc,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +35414e99-525f-455a-b4ef-137b6e48ff87,0.9700000286102295,false,4000.0,NS_NET136_L_S2_2(8),h0,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8052a8a9-d5a5-481e-a772-87f71ee8fbb9,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(3),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7b040b43-011a-4402-a176-9b9b41ce0c37,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(1),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1a08b0a0-ae75-4ff8-b28b-643ca2dbca1a,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(5),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9018c4d9-5b86-4c11-b5b3-2c26e756ad0e,0.949999988079071,false,4000.0,NS_NET126_L_F2_(20),h0,de756ddb-793d-4b2d-959c-59d938a8f61f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +27f66b7b-f1ac-46e4-9c11-b9ff0d0f2990,0.949999988079071,false,4000.0,NS_NET146_L_F3_(31),h0,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f971674c-7f11-4e9d-b701-1736b2effb65,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(4),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +91d402b7-e8c7-4919-bdbd-93c1c8492920,0.949999988079071,false,4000.0,NS_NET146_L_F4_(14),h0,f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +520e2b61-ef52-406a-bc3d-83fd47da2696,0.949999988079071,false,4000.0,NS_NET146_L_F4_(13),h0,b608d71e-3ede-4156-a015-3f6e1d22242a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +bcb5abf4-7b31-4860-af53-78ec457f21a2,0.949999988079071,false,4000.0,NS_NET146_L_F3_(30),h0,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9b027eb7-abfa-43ef-8eae-b20b47a631e6,0.949999988079071,false,4000.0,NS_NET146_L_F3_(18),h0,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +53ae546b-c94f-4619-a613-3291f26fb78b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(4),h0,f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7f642ba6-1492-4bf6-9857-113c60a18709,0.949999988079071,false,4000.0,NS_NET146_L_F3_(11),h0,e2267696-669b-48e8-b43a-37d0db95011d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f880a0dd-991c-4646-a0a4-c6c877171870,0.9700000286102295,false,4000.0,MS4_Last_04,h0,890f2162-b4cb-49e7-a16f-4b552c5e245c,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +89aeade0-ac58-4120-a743-577afdb72b5b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(7),h0,f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +fa8ef266-5b15-4fdd-a145-71ba95e3463d,0.949999988079071,false,4000.0,NS_NET146_L_F3_(17),h0,0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9b4f4a8b-3aaa-4b77-afdb-049d2b83869b,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(6),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +8ef945c1-4586-4755-98a8-bff3ee581620,0.949999988079071,false,4000.0,NS_NET146_L_F1_(7),h0,67c1746c-3af8-403f-983e-1c7c047383df,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9ae56e43-54fc-4ab7-8989-abbc14596fd3,0.949999988079071,false,4000.0,NS_NET146_L_F3_(20),h0,0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +3b9ae1ad-11e5-4fb5-ba03-9027e39c33b4,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(8),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2550ae33-6540-4602-b59a-a46c49747c97,0.949999988079071,false,4000.0,NS_NET146_L_F4_(9),h0,9b889b73-c108-4b38-b6eb-3377841e0c83,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +6322878b-9db6-4481-858b-64dbd00dc091,0.949999988079071,false,4000.0,NS_NET126_L_F3_(26),h0,dc022eec-16b0-4a64-a2f5-498d81aca71e,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9cc70cc7-642f-4fb1-9782-20a446368645,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(1),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2dcdb711-8872-4e51-ab4c-ef23c685674d,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(35),h0,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +8f0150c7-b217-43ca-85d5-c1e4d2e903d0,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(2),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3a278137-bf5c-4e2d-96c5-4779bcf947c0,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(2),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +076b9055-3329-4e88-a1a0-93ad904e72a2,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(8),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +07ac3307-90a9-4d74-9434-b977741a8858,0.949999988079071,false,4000.0,NS_NET126_L_F4_(4),h0,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +9f0d4b5f-7563-40bc-b20e-bc54a96e9019,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(30),h0,9f95c733-71e2-4bf0-a27a-70144518ea2c,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +11e776fa-ecc1-4332-821f-d7e56758b988,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(1),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3a5e7e35-53ad-48da-89b9-98342a9875ac,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(7),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +860a37f7-7add-4613-bef4-326ee5ea328b,0.949999988079071,false,4000.0,NS_NET146_L_F1_(25),h0,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +0944b3b6-15e3-4704-b50d-fa1e407ade7e,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(7),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +24de669f-4786-4388-ae36-aaef1ce40ffa,0.949999988079071,false,4000.0,NS_NET126_L_F3_(27),h0,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +98c1a2ab-bd09-4c77-a389-d088aed894b1,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(1),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +28a6872b-abf5-412e-b887-b0503addaa7a,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(5),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3fed7598-a77e-4929-9bb3-687e51346cfd,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(3),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1308b834-4b0c-4c91-b5fc-8529368005ea,0.949999988079071,false,4000.0,NS_NET146_L_F2_(25),h0,011e3794-3341-4376-839c-3f5a452e15ab,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +c73800aa-9f9e-46da-83eb-82a88b2ab502,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(4),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +e9660cc3-b2b6-4b8d-8673-dd3bcb6305fe,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(2),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c22e9a91-f522-446d-8dc8-ae3e720a5053,0.949999988079071,false,4000.0,NS_NET126_L_F2_(19),h0,52e15712-2572-442a-b22c-add48af95115,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +2b20b17c-774b-4b41-a1e8-ef9d8f39b0e3,0.9700000286102295,false,4000.0,NS_NET136_L_S2_5(8),h0,c5af5a34-211a-4105-a8e1-f447140073c6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3ce5abcb-0eb1-403f-9fca-90d255619cc5,0.949999988079071,false,4000.0,NS_NET146_L_F2_(13),h0,49e14db3-a4bc-464a-b606-653ac8a604dd,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7bbb2c62-36f7-4aab-8802-e3ddf478adf2,0.949999988079071,false,4000.0,NS_NET146_L_F3_(14),h0,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +35555bee-2634-45cb-888b-d850767955a6,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(3),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9993f48a-8ee2-49b7-af31-afbfa3690c45,0.9700000286102295,false,4000.0,MS3_Last_07,h0,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,"cosPhiFixed:{(0.0,1.0)}",2400.0 +a7de4997-eddc-4306-b1ac-982c1872863b,0.949999988079071,false,4000.0,NS_NET146_L_F1_(6),h0,e3c3c6a3-c383-4dbb-9b3f-a14125615386,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +fd2e19b6-d5e3-4776-9456-8787a2160d9d,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(1),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +12c85bfd-a5a1-4812-b168-86b94f624f18,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(8),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +72d00bfa-4967-485a-b5a3-519a6826fa9c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(4),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a9f8dce4-b664-4bbd-9e52-c2ca6aa669aa,0.949999988079071,false,4000.0,NS_NET146_L_F1_(19),h0,1f040625-ad1d-409f-bd7e-944c4d805e46,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +32be027e-1ee2-41bc-9fe5-18daa3613efa,0.949999988079071,false,4000.0,NS_NET126_L_F1_(2),h0,a7ebd30b-b843-405f-9fae-ca6b489601f9,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +deb6456a-d472-4f1e-8698-006e8cd51dfc,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(5),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +79a2d93b-3583-4e90-bc40-9e7ff84bf0a2,0.949999988079071,false,4000.0,NS_NET146_L_F2_(15),h0,d82fae59-844a-4c85-997e-326dd876137c,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a12570e4-afeb-4af8-a86c-9e804eea4886,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(1),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b03db97b-06ef-406c-a5b3-7e9ca9f7bf66,0.949999988079071,false,4000.0,NS_NET146_L_F4_(17),h0,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,"cosPhiFixed:{(0.0,1.0)}",0.10000000149011612 +cc08fc6e-1932-4daa-af04-f0376c8be6e2,0.949999988079071,false,4000.0,NS_NET126_L_F3_(7),h0,50164699-2018-4b17-b3f1-74b082f27403,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +996313f2-93af-477c-92dc-2011a43afd7c,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(5),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b52b4bea-014e-4aad-8481-2f2761957f69,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(4),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +70fcdefd-49c1-455f-9ceb-013dcbf26887,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(1),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +de3eef0c-2f09-4f57-a04b-dae5011fac7a,0.949999988079071,false,4000.0,NS_NET126_L_F4_(12),h0,6a4547a8-630b-46e4-8144-9cd649e67c07,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +598f0d53-7c8f-435b-b333-95b6f4d359f2,0.949999988079071,false,4000.0,NS_NET126_L_F3_(31),h0,67af7db0-0fd8-4657-bb4f-43a2141b9f73,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8bad5752-c9c1-4669-802d-b1c4c7bbb909,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(5),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3feb112d-8a47-49eb-b719-d7226b6fe7a0,0.949999988079071,false,4000.0,NS_NET146_L_F2_(18),h0,21359dd1-7a23-4932-b656-c196fbffe751,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d4d3ea3e-cce2-480b-9a7c-bbdd1a7c96ad,0.949999988079071,false,4000.0,NS_NET126_L_F1_(8),h0,f717b05b-f4e7-43d9-af9e-638e2badee5a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +8e9debcb-ce25-450c-b016-170bb7622008,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(4),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +924dbbfa-abb0-42b2-83a9-15897bf5806e,0.9700000286102295,false,4000.0,NS_NET136_L_S3_3(5),h0,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9c4f5e8d-b780-4e31-9bb0-37e975066beb,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(8),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +0c5d8e98-e059-4768-be56-73e0e8914092,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(3),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +b8ad6547-aa55-4fca-ad0c-b5a0078b2203,0.949999988079071,false,4000.0,NS_NET126_L_F1_(14),h0,b7baa286-cbe2-4143-a08f-4e025af47529,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +6c4c7e65-4598-4855-b057-25773ffdf5f2,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(6),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +be63473d-a375-4ce7-9970-80358e5c54bd,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(3),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +86cbef43-bde0-41a6-a684-f42fdb4ba527,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(4),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +80d0b6a9-8d08-4262-81a0-83b13beaad45,0.9700000286102295,false,4000.0,MS1_Last_02,h0,32b3bb19-c52a-4a19-890a-94a8918d38a9,,,,"cosPhiFixed:{(0.0,1.0)}",400.0 +5f1b7472-2a01-4203-8318-878b1a4460c5,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(5),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3c309ec9-42a4-441d-8c0e-e29cefa6bf18,0.949999988079071,false,4000.0,NS_NET126_L_F1_(5),h0,eb21d716-1b54-4dba-bdc2-d1f6752aef85,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +06747e73-c108-40d5-8ce6-6538e38b4ef2,0.949999988079071,false,4000.0,NS_NET126_L_F1_(6),h0,99e26ef8-75e2-46f3-aafc-6287bf5e3905,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +e90dfb70-2372-40d3-9577-01d2145eb59d,0.9700000286102295,false,4000.0,NS_NET116_L_S2_5(7),h0,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +11bc6378-bb54-4ddb-846f-1488baaf1c00,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(4),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3f903ef1-047f-4f28-9d9f-c35b2c440315,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(8),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +3b51a0c6-060f-40ce-b207-6146fde8e724,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(8),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +ab476579-7fb3-408f-a065-73f6d2140fb2,0.9700000286102295,false,4000.0,NS_NET136_L_S3_5(5),h0,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1d96cdde-d9d3-4d47-b3a4-60474b9caa92,0.9700000286102295,false,4000.0,MS2_Last_05,h0,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,"cosPhiFixed:{(0.0,1.0)}",320.0 +beb7a9e2-4394-4808-af58-d984ab871f98,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(3),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c78b87bd-855b-4741-9e82-c9d814dc5a7c,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(7),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +62a4a30c-7bf2-4813-a00e-7002b8c56832,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(3),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +10b5f3d3-60c9-45b9-a70e-fa75140e9a9d,0.9700000286102295,false,4000.0,NS_NET136_L_S1_5(3),h0,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a8f50827-29eb-4c27-a60c-fb74c3a5f3fd,0.9700000286102295,false,4000.0,NS_NET136_L_S3_4(2),h0,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +cd65e476-ba5b-46be-b87d-a689b79269eb,0.949999988079071,false,4000.0,NS_NET126_L_F3_(3),h0,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +984470e3-f117-4b8c-932f-caeacf10ff2c,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(2),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +a850c129-beef-48d6-9543-1e217a5349ce,0.9700000286102295,false,4000.0,NS_NET136_L_S1_2(8),h0,032768b4-2426-4abf-806b-83813ac5137a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2a9149a4-4778-41d8-8865-090499833016,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(1),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +1ec03866-9e92-43b9-9c13-1501533c8e1e,0.949999988079071,false,4000.0,NS_NET146_L_F1_(26),h0,154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +fe429426-1884-4ad7-8d50-69237e4a6a1b,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(34),h0,fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +9985e8e1-d8fa-4fdc-86aa-70f5b0ab70fc,0.949999988079071,false,4000.0,NS_NET126_L_F1_(11),h0,270c7266-45dc-4e45-829f-c04f6b631cad,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a194f9a2-1380-412b-8285-80ca7ba3a538,0.949999988079071,false,4000.0,NS_NET126_L_F3_(15),h0,ae234bc5-b751-41f2-95ee-b78de124c583,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +25be1a94-a0cc-4de5-acc4-097d9e8639ff,0.9700000286102295,false,4000.0,NS_NET116_L_S3_3(8),h0,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +6f97361f-d4e6-45b5-9bf2-d880d42eae25,0.949999988079071,false,4000.0,NS_NET126_L_F3_(17),h0,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f870937a-6644-4ef8-9bfd-15835471e775,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(30),h0,519ace7e-fd3f-4797-b14b-36c1694b00cd,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +95be2f70-bd5a-4785-983c-2aa7eba6546b,0.949999988079071,false,4000.0,NS_NET146_L_F3_(26),h0,bd288184-99d8-4233-bb3d-484f3922200a,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7794309a-7ecd-436d-ae38-51bbdab5df11,0.949999988079071,false,4000.0,NS_NET146_L_F3_(6),h0,01bdd8b2-145f-42b3-80e3-a2366dea1044,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +a1a11124-0e04-4a0c-bab9-eb68c9f20a9e,0.949999988079071,false,4000.0,NS_NET126_L_F3_(28),h0,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +96dbdf3b-98cd-45de-92e0-3743c609b08e,0.9700000286102295,false,4000.0,NS_NET136_L_S1_4(2),h0,ed4697fd-016c-40c2-a66b-e793878dadea,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4c7ee262-a021-408a-aada-27677feeeec9,0.949999988079071,false,4000.0,NS_NET126_L_F1_(17),h0,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +bfb7a7c2-6426-4392-9070-85dd5210a5cf,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(4),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +e25c3969-7e44-48f5-860c-03ff67a65284,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(29),h0,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +d24c0d3d-bfe6-4ae6-b707-eb781d7f7d2a,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(8),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +2c970df7-5644-4665-835a-825b8df8aaf4,0.949999988079071,false,4000.0,NS_NET146_L_F4_(4),h0,00d4a837-f09c-41df-bed1-dfdb78387116,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +449eaff2-92ca-4075-ae9f-2d517e7f0642,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(6),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +d08a8e2d-0ab1-4d89-b111-6a8efe2a76af,0.9700000286102295,false,4000.0,NS_NET136_L_S1_1(1),h0,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +eb8622e3-0dd8-42e4-ab49-23b5cec0eb9c,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(8),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +cb65c2bc-fb36-4338-9a13-34bd999f4fa5,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(8),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5aeaccc2-f9cd-4292-9b9a-2e05d5c63fe4,0.9700000286102295,false,4000.0,NS_NET116_L_S1_2(6),h0,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7e875803-7e9d-4808-8d8c-a722d46fb6af,0.949999988079071,false,4000.0,NS_NET126_L_F3_(20),h0,732f83b0-b9c5-4b8e-86fe-753c26f40e78,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +d3c547e1-cf64-4993-9b55-5ae1b1d4601c,0.9700000286102295,false,4000.0,NS_NET136_L_S3_2(7),h0,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +58b9f934-f7c4-4335-9894-3c80d9e6b852,0.949999988079071,false,4000.0,HS_NET1_L_S3,h0,33f29587-f63e-45b7-960b-037bda37a3cb,,,,"cosPhiFixed:{(0.0,1.0)}",42105.30078125 +7c03d124-df4a-46c3-9b74-66bd888f750e,0.9700000286102295,false,4000.0,NS_NET116_L_S3_1(7),h0,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7b8abd75-9967-4505-b919-3accd78908e4,0.949999988079071,false,4000.0,NS_NET146_L_F3_(19),h0,810bebb0-0d5c-4899-b213-3207be661248,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +283a1252-a774-4b04-bfcf-fe8879065982,0.949999988079071,false,4000.0,HS_NET1_L_S4,h0,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,"cosPhiFixed:{(0.0,1.0)}",42105.30078125 +e733ea74-1c51-4592-9fb3-cc2d0a007450,0.9700000286102295,false,4000.0,NS_NET116_L_S2_4(3),h0,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +6ad26a2b-9139-4008-bd91-ba2c8918e1e3,0.949999988079071,false,4000.0,NS_NET126_L_F3_(10),h0,e25387d0-ab9a-406d-bcb4-555414b88b1b,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +f231c4e2-2872-4d83-b486-894d846dc4d7,0.949999988079071,false,4000.0,NS_NET146_L_F2_(10),h0,41414318-73e3-4bdc-8147-570a96b28d37,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +0290a7de-8c73-44d4-9a06-cf469d20c90c,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(3),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c7834ac4-2f72-483e-8ecf-1d0ce715716b,0.9700000286102295,false,4000.0,NS_NET116_L_S2_1(6),h0,39112046-8953-4e73-a5d9-6a8183a77436,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +dc34b951-89f4-4e28-8f04-3e6522bfa0c9,0.9700000286102295,false,4000.0,NS_NET116_L_S1_4(7),h0,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +bab50a41-657d-454b-91eb-3e64de845098,0.9700000286102295,false,4000.0,NS_NET136_L_S1_3(4),h0,eb95ff15-56db-4463-bb54-0ee131167812,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +7a17120f-8522-4eca-95aa-f6b5d985103b,0.9700000286102295,false,4000.0,NS_NET116_L_S3_4(7),h0,36dccefc-f04c-493f-bb88-11343583bf9f,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +5d09da2a-e37c-4cca-93fd-0bf61918a2b2,0.9700000286102295,false,4000.0,NS_NET136_L_S2_3(4),h0,fd534474-cd65-47aa-8005-dc50d17d6920,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9413bafe-4537-4247-ae22-8b3d03bf6309,0.949999988079071,false,4000.0,NS_NET146_L_F1_(16),h0,09ac8949-2b79-41d7-b56f-a58f20036df2,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +89971afc-919e-4153-92b2-f0a43ad0e535,0.9700000286102295,false,4000.0,NS_NET126_L_F1_(27),h0,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +9d19bae7-6fa1-4620-8ec2-38cae5596b9e,0.9700000286102295,false,4000.0,NS_NET116_L_S1_5(7),h0,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4d3af2ae-7637-46bc-a492-1bca70d3bc56,0.9700000286102295,false,4000.0,NS_NET146_L_F1_(37),h0,450426ac-a560-4d17-b1fc-9e169530a655,,,,"cosPhiFixed:{(0.0,1.0)}",2.0618600845336914 +e81df4d7-0935-40d7-be0b-5b696b24d220,0.949999988079071,false,4000.0,NS_NET146_L_F1_(21),h0,92cb5065-2e57-4099-8e29-75cbc0c80370,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +66f54dc9-83dc-435d-9c21-3361838e88d6,0.949999988079071,false,4000.0,NS_NET126_L_F3_(14),h0,df8df8d2-3494-4da9-8d1b-f913d15f520f,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +94ef12cc-d3bc-42b1-b8b0-6177b93bb25c,0.9700000286102295,false,4000.0,NS_NET116_L_S3_5(4),h0,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +dc65cd27-84a2-49a6-aa22-d9c1968a72b4,0.949999988079071,false,4000.0,NS_NET126_L_F4_(8),h0,75f2dfb9-75a0-496d-9c44-79e7df54c1df,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +7e337720-59f5-4d3f-bf95-71c6228587f3,0.949999988079071,false,4000.0,NS_NET146_L_F1_(17),h0,0d94a5ea-3a13-48ba-a27f-b2903841c334,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +cad1c678-6e76-430f-bf7c-db12c6f06239,0.949999988079071,false,4000.0,NS_NET126_L_F4_(7),h0,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,,,,"cosPhiFixed:{(0.0,1.0)}",2.3157899379730225 +513e31ea-560d-4e33-b1ec-c1aca5f63339,0.9700000286102295,false,4000.0,NS_NET116_L_S1_3(5),h0,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +9367b934-d77d-4f3b-b5e6-0692ec6789a3,0.9700000286102295,false,4000.0,NS_NET116_L_S2_2(7),h0,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +bc617ea3-3b85-4ba8-8b12-f243f077d6bb,0.9700000286102295,false,4000.0,NS_NET136_L_S2_4(4),h0,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +245666cd-881b-44ca-9b47-536c96e15bce,0.9700000286102295,false,4000.0,NS_NET116_L_S2_3(2),h0,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +4dd0785a-482c-47e3-bb82-e315083684d1,0.9700000286102295,false,4000.0,NS_NET116_L_S3_2(6),h0,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +04063357-c213-4cc9-a870-9cc11ac4ad92,0.9700000286102295,false,4000.0,NS_NET116_L_S1_1(7),h0,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +66f00451-3542-41f2-adcf-24068c870afc,0.9700000286102295,false,4000.0,NS_NET136_L_S2_1(2),h0,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 +c098f9cd-09c8-4eef-8941-652cb8365992,0.9700000286102295,false,4000.0,NS_NET136_L_S3_1(4),h0,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,"cosPhiFixed:{(0.0,1.0)}",4.1237101554870605 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/measurement_unit_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/measurement_unit_input.csv index ef476e420..eb4fc5c56 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/measurement_unit_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/measurement_unit_input.csv @@ -1,300 +1,300 @@ -"uuid","v_ang","v_mag","id","node","operates_from","operates_until","operator","p","q" -016fb667-9ad7-490a-b338-032ab4b1b61f,false,false,regulate_transformers_1 ,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,false,false -24c529c9-09b5-4fd3-ba12-53b3634c78c4,false,false,regulate_transformers_2 ,dc022eec-16b0-4a64-a2f5-498d81aca71e,,,,false,false -e29a056b-ea0e-4e31-96b9-9c3fdadb7b65,false,false,regulate_transformers_3 ,80d8252b-045f-471a-9638-416ed3f86120,,,,false,false -e194e458-39f2-4c2d-ad50-017817b2ec90,false,false,regulate_transformers_4 ,2f64bf67-cee9-44bb-8c13-ff96878932af,,,,false,false -a464a83d-c2bc-45e7-bad8-e12d6cbf3d83,false,false,regulate_transformers_5 ,32b3bb19-c52a-4a19-890a-94a8918d38a9,,,,false,false -2490fc85-e702-4e33-80b7-6db5e9c44388,false,false,regulate_transformers_6 ,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,,,,false,false -3f619f96-5b98-4787-8293-5f3880ff9bce,false,false,regulate_transformers_7 ,b8fa1f73-223c-4b08-a140-44f12484cce3,,,,false,false -e7fa841e-7284-4e1f-906e-a000bdaba14c,false,false,regulate_transformers_8 ,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,,,,false,false -9e549506-320c-46d7-913d-57e915b7a030,false,false,regulate_transformers_9 ,ae234bc5-b751-41f2-95ee-b78de124c583,,,,false,false -adb1c67d-56e6-4860-9e39-b427af5ae617,false,false,regulate_transformers_10 ,41c0087f-ce27-4da3-97d2-92d711b639b4,,,,false,false -9eebac95-db38-4e2e-9976-2d00fefd9f6f,false,false,regulate_transformers_11 ,67af7db0-0fd8-4657-bb4f-43a2141b9f73,,,,false,false -3a4e7915-e547-4939-8a7c-889792f687d0,false,false,regulate_transformers_12 ,119d270a-ff22-4fdb-8214-cb5b336790bf,,,,false,false -05bebe8d-34ab-4bf6-ba9c-d6056a583075,false,false,regulate_transformers_13 ,926d6113-933f-49e3-9529-a3035acdc9b2,,,,false,false -2d34f617-a32c-4a6f-9182-f7872cbc0677,false,false,regulate_transformers_14 ,519ace7e-fd3f-4797-b14b-36c1694b00cd,,,,false,false -0d968f46-fad9-4884-af21-aad2e07f04b2,false,false,regulate_transformers_15 ,e3a40690-d085-4796-9fcb-48d776e58594,,,,false,false -101440d9-44ec-4f54-87c2-01739d1819c0,false,false,regulate_transformers_16 ,ead38a50-b8f7-4bbb-b65d-f54350825e8e,,,,false,false -923f2d69-3093-4198-86e4-13d2d1c220f8,false,true,regulate_transformers_17 ,31a2b9bf-e785-4475-aa44-1c34646e8c79,,,,false,false -8459745b-4616-4c44-96dd-9e6b1d3623a9,false,false,regulate_transformers_18 ,60173008-809d-4d8f-b06a-3c4a838dd989,,,,false,false -739fc1a2-0c22-4fcb-81e0-1f3941cbb285,false,false,regulate_transformers_19 ,a286f73a-20ee-4056-8129-c7963b34ecd9,,,,false,false -4ebd7b4e-072d-4f0f-a70a-84e415256e77,false,false,regulate_transformers_20 ,5e213f42-d93e-45c5-a295-adbe09105746,,,,false,false -bb6b8889-39b0-4785-9695-4703e776d870,false,false,regulate_transformers_21 ,a5c73608-5a85-495d-bea0-df77b6ce66ea,,,,false,false -f038ad3f-a8cd-48bb-b0dd-3b4a2a7b8442,false,false,regulate_transformers_22 ,6678c226-c5d2-4ce3-9728-dc1163be799f,,,,false,false -e5cf9e99-b2d3-4587-8846-fba4cf5d27b8,false,false,regulate_transformers_23 ,4303784e-7193-454a-9be4-3591400b4eeb,,,,false,false -fabad8e5-31b5-4595-8dd9-f682154c1308,false,false,regulate_transformers_24 ,f6a31362-8b0d-4926-b0d0-10bb61db20df,,,,false,false -48a65e25-d6d1-4fcc-9c5e-c545baa126d3,false,false,regulate_transformers_25 ,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,,,,false,false -7cf9544b-1df8-4287-95e1-222d0a8d7ca4,false,false,regulate_transformers_26 ,0170837a-1876-45f9-a613-666f9991964d,,,,false,false -9a71fbdd-b20f-4a95-83fc-c0188de60f6c,false,false,regulate_transformers_27 ,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,,,,false,false -65fc15a0-ee49-443f-a9c1-1368de89db3e,false,false,regulate_transformers_28 ,de756ddb-793d-4b2d-959c-59d938a8f61f,,,,false,false -74fa5103-0fef-4ad7-9ba6-d6ec255b8662,false,false,regulate_transformers_29 ,904c7476-5f16-4ec2-9138-7d5e32d38a3b,,,,false,false -2fca54c5-687f-4f22-9fa5-0eb368c922c7,false,false,regulate_transformers_30 ,9d7038e9-5bcc-4676-bead-46c4f1291ba8,,,,false,false -a715c2af-7f78-4b29-a55e-d3de02221a3c,false,false,regulate_transformers_31 ,92301422-94ae-48ab-89c7-a69eea9450b2,,,,false,false -958afd26-72a1-4015-a4d4-d3da376a3ce2,false,false,regulate_transformers_32 ,970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,false,false -ae9dc47d-d3e3-404a-a128-15fd69200357,false,false,regulate_transformers_33 ,67c1746c-3af8-403f-983e-1c7c047383df,,,,false,false -d6686041-182c-460f-bffd-7471523732e2,false,false,regulate_transformers_34 ,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,,,,false,false -1c2669ca-4dd5-4144-bb73-f3cef3452284,false,false,regulate_transformers_35 ,810bebb0-0d5c-4899-b213-3207be661248,,,,false,false -99b75455-54b3-40a0-a1af-83a79ac6ffd1,false,false,regulate_transformers_36 ,e2267696-669b-48e8-b43a-37d0db95011d,,,,false,false -d2ca6aed-a966-4bec-a01d-5ea0b95dcf88,false,false,regulate_transformers_37 ,d2aff632-fc26-4595-931c-92e266247ac8,,,,false,false -6a1829f2-f9ee-43b1-a9a3-d61d20976dbe,false,false,regulate_transformers_38 ,ff947647-b551-41ae-bcfd-6af228250c96,,,,false,false -7873c2ea-9478-468e-9ff3-0244983f9a5d,false,false,regulate_transformers_39 ,b425b28e-48a8-4ec4-a15a-387fcfb79895,,,,false,false -f01c279b-e1c9-44dd-a1ca-39561765f360,false,false,regulate_transformers_40 ,174fb4b2-4f9e-415c-bfee-d850ef751307,,,,false,false -abdbf7ea-07f0-49e6-bc36-b5081ebaa430,false,false,regulate_transformers_41 ,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,false,false -25ac3974-2646-4d0a-ba6b-c4ac1f28ce1a,false,false,regulate_transformers_42 ,4f2402e8-664a-40f2-970a-abc098a2a0d1,,,,false,false -b9037158-f27b-44da-811f-a6cc8fd3bbf5,false,false,regulate_transformers_43 ,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,false,false -87d6d17a-5aa3-4746-8c52-478f6e21fa50,false,false,regulate_transformers_44 ,49e14db3-a4bc-464a-b606-653ac8a604dd,,,,false,false -ea45c1fa-f734-4907-8239-4129050e5bc0,false,false,regulate_transformers_45 ,36dccefc-f04c-493f-bb88-11343583bf9f,,,,false,false -7686b818-a0ba-465c-8e4e-f7d3c4e171fc,false,true,regulate_transformers_46, bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,false,false -9802753d-062a-4b6e-8de7-e5fe7b123870,false,false,regulate_transformers_47 ,9d10a92f-576d-4777-99ff-59d145924fea,,,,false,false -64347128-defb-4643-83dc-40158b42fd7f,false,false,regulate_transformers_48 ,5dfd45b8-48e7-42fd-ac53-cc57455486b5,,,,false,false -1eca3f1a-3cca-4486-89c5-879ccbff465a,false,false,regulate_transformers_49 ,2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,false,false -e95dd056-e40f-48db-8554-baa369945467,false,false,regulate_transformers_50 ,06b7f21a-d6d7-4ec0-94c6-141845f14986,,,,false,false -6342ea88-5679-4459-891c-fe7a1f755208,false,false,regulate_transformers_51 ,c72a08bc-4685-49b1-b8ef-803aebc8c388,,,,false,false -1e8e57d3-ab9c-4498-8b33-edf2fbf1cc9b,false,false,regulate_transformers_52 ,d8c35123-b389-4199-84f9-d417d24bb78d,,,,false,false -07228d6d-2bed-43a1-9e63-f67e47fef0e9,false,false,regulate_transformers_53 ,ffcaf979-d707-4d25-8f46-f436f9792d7f,,,,false,false -ed91e37f-98e5-4acd-9372-c369ea722a4a,false,false,regulate_transformers_54 ,bd8c7d3d-e830-4a46-bf78-0086ce24909f,,,,false,false -9c578af4-11a8-4c11-8074-f75031a6f41a,false,false,regulate_transformers_55 ,1dcddd06-f41a-405b-9686-7f7942852196,,,,false,false -1d6b2628-3579-4ec9-8a6a-50187575504c,false,false,regulate_transformers_56 ,1bf26b4d-03cc-4490-8c33-d3db8597d807,,,,false,false -107416b3-3708-43fc-bdc4-dfa1e508d6b8,false,false,regulate_transformers_57 ,1dee13af-e638-4858-9c69-0069190cd577,,,,false,false -2f64a8c2-57f3-4156-ad0d-19c8492a0050,false,false,regulate_transformers_58 ,792b505c-87ab-4665-a31d-b6035c5ece70,,,,false,false -ca3091f3-db57-472e-8e29-94053c9570aa,false,true,regulate_transformers_59, f5839ade-5968-4879-a824-90b5fb3552cd,,,,false,false -1b3db287-eefa-4585-8575-e031b5705aa7,false,false,regulate_transformers_60 ,da79c960-d35a-4193-9b06-2d4d57051706,,,,false,false -140cd6d1-b980-41b4-a22d-2cc289453a43,false,false,regulate_transformers_61 ,b7baa286-cbe2-4143-a08f-4e025af47529,,,,false,false -90267614-2f35-426e-90a2-1bb576c2ebcd,false,false,regulate_transformers_62 ,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,,,,false,false -ccaa2df4-c38e-43f7-b3e5-84905a62e365,false,false,regulate_transformers_63 ,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,false,false -3836660f-f198-436d-a746-1fcf7438e22d,false,false,regulate_transformers_64 ,00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,false,false -ecdd4498-6f9c-4768-81f6-8b00c098a386,false,false,regulate_transformers_65 ,f29859be-c6e7-4cf9-84d7-239eb98a9e65,,,,false,false -3c64b45f-876c-4782-b7d9-2e8e02a427a3,false,false,regulate_transformers_66 ,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,false,false -67c7dd24-1e9a-4d25-a4e6-96548a50f53b,false,false,regulate_transformers_67 ,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,,,,false,false -9a15a6d0-dc24-4066-b0b4-81ffdc05f6d7,false,false,regulate_transformers_68 ,0b2a3b46-5e43-4879-973e-d8fb96429d8a,,,,false,false -4f5ff4aa-c4de-4e0a-9ee5-1b617e5c6ef4,false,false,regulate_transformers_69 ,34cd8ee0-e607-4c47-89a7-121c3e32768a,,,,false,false -7c2af318-272b-4c39-8713-9d2a34f3a15b,false,false,regulate_transformers_70 ,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,,,,false,false -b29b43b6-71a7-4481-b57f-ce9f0355a67d,false,false,regulate_transformers_71 ,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,,,,false,false -6549c764-44de-4f94-8927-f9655f091564,false,false,regulate_transformers_72 ,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,,,,false,false -e44759a5-8da8-48f0-bec7-1236403307b9,false,false,regulate_transformers_73 ,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,,,,false,false -5ac1dfa5-693c-4ee4-9b2e-235dc8ccf7df,false,false,regulate_transformers_74 ,95ced3b5-69fd-4171-9c34-f18802064e22,,,,false,false -56dea707-5a90-45d1-89c0-928e63d804da,false,false,regulate_transformers_75 ,3b879239-20c8-4adf-bd51-92924327ee71,,,,false,false -6d2fe65b-95b7-4767-8264-3fa25cc139f6,false,false,regulate_transformers_76 ,b179c38b-5af0-4304-84b1-1dc03314fd80,,,,false,false -d642d999-be25-414e-9bf6-200ceeb013b4,false,false,regulate_transformers_77 ,bd288184-99d8-4233-bb3d-484f3922200a,,,,false,false -5232cd6e-3e1f-4d7d-8a20-fb668b7c537f,false,false,regulate_transformers_78 ,033d0230-4aee-47cf-91f9-81f5f40e60b0,,,,false,false -168605df-08b7-46f6-9535-57042b317a7f,false,false,regulate_transformers_79 ,4258f215-5b22-446f-a260-e8cdaa7c95d1,,,,false,false -03db556f-0996-4755-9c17-225bc193a2d0,false,false,regulate_transformers_80 ,666757e2-292e-473c-ac9c-04c0786574bc,,,,false,false -a2ef290c-08df-4f25-902f-41b603d95d8f,false,false,regulate_transformers_81 ,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,,,,false,false -87eadfed-e098-4559-9c00-3190832b6374,false,false,regulate_transformers_82 ,773aebe4-fc03-46be-8209-0213e2760a8e,,,,false,false -2caf5fdf-2b26-408c-a26a-a0f4b133d723,false,false,regulate_transformers_83 ,011e3794-3341-4376-839c-3f5a452e15ab,,,,false,false -114be860-a848-48a1-af7e-5265653d1f0c,false,false,regulate_transformers_84 ,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,,,,false,false -d7819a9a-118e-43fe-8f1e-6aaa1feca139,false,false,regulate_transformers_85 ,f1e55c8b-357f-45a7-9d57-e299f9b207f3,,,,false,false -6b7055bc-6daa-4c57-b74d-6beb5cb2f08f,false,false,regulate_transformers_86 ,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,,,,false,false -085776f7-ad53-4574-a871-acfa6192c3a1,false,false,regulate_transformers_87 ,1396cb4c-cee7-4116-97c9-290f98785719,,,,false,false -1988d9ba-10b6-46bd-831d-3a965ecc51d2,false,false,regulate_transformers_88 ,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,,,,false,false -b306276b-e7e0-4712-9577-198e7fcd8d26,false,false,regulate_transformers_89 ,898d8295-bf35-4079-9374-99b059c2c956,,,,false,false -16f15999-3cd5-4181-af2d-f9bc45a8bed5,false,false,regulate_transformers_90 ,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,,,,false,false -dec72781-e950-40e4-ad1a-500dd529a888,false,false,regulate_transformers_91 ,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,false,false -50a1e8d3-7e46-4ece-b664-5d07e09ab13f,false,false,regulate_transformers_92 ,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,false,false -e0e5894f-f02c-4874-8e9a-4f91301a5360,false,false,regulate_transformers_93 ,6570535c-0d2e-4846-9951-21559902f67a,,,,false,false -e6ca6877-53da-4fde-893f-566526699c47,false,false,regulate_transformers_94 ,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,,,,false,false -7cfe9ccc-8a1c-4c1b-a2da-5e7d5e08a8b6,false,false,regulate_transformers_95 ,f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,false,false -5ef3ee7c-67eb-4951-93df-0a3679b41528,false,false,regulate_transformers_96 ,41414318-73e3-4bdc-8147-570a96b28d37,,,,false,false -d6c9ccec-fa8b-401f-808c-5cb33f31203d,false,false,regulate_transformers_97 ,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,false,false -4560a99d-93e2-4a7d-8bd1-9fa77bad422f,false,false,regulate_transformers_98 ,732f83b0-b9c5-4b8e-86fe-753c26f40e78,,,,false,false -61958d64-1c6a-4393-baef-d8f780221a06,false,false,regulate_transformers_99 ,0db6e581-37e9-4254-aed8-d5cdf66819f9,,,,false,false -d539a4ff-bcb3-41e3-a93b-ad939d183697,false,false,regulate_transformers_100,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,,,,false,false -538b55b8-721c-473a-9ff1-a0c5941af71c,false,false,regulate_transformers_101,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,,,,false,false -750c1809-a8d3-4a64-a6d6-3f7b92ab6482,false,false,regulate_transformers_102,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,false,false -42be54c7-6162-43fd-be82-d3afbea31078,false,false,regulate_transformers_103,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,false,false -58080973-140e-473d-bb71-25fffa6617d1,false,false,regulate_transformers_104,2645e336-b0df-4d1e-a0ea-375444488f06,,,,false,false -85a60c00-6d25-40a5-89e2-5de8edc56a3d,false,false,regulate_transformers_105,0d94a5ea-3a13-48ba-a27f-b2903841c334,,,,false,false -61eb12a7-b5c6-49f8-bb0c-710267d7de31,false,false,regulate_transformers_106,625bdd2c-a75f-46ef-850c-ca4704d56e55,,,,false,false -453af838-a5c7-4fd0-8b5c-a1d4466e25a0,false,false,regulate_transformers_107,e25387d0-ab9a-406d-bcb4-555414b88b1b,,,,false,false -a1e95346-4482-4987-8794-b808c5c0ca40,false,false,regulate_transformers_108,3d81adf5-73d1-4708-b03b-3afc7db017f4,,,,false,false -50c060f1-14c1-4b02-8e7c-5a2d5e42c985,false,false,regulate_transformers_109,d5489e1b-0e7e-4ca9-a362-09c23576a622,,,,false,false -dcce4378-c53c-49d5-85c2-25cd9fbddbac,false,false,regulate_transformers_110,0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,false,false -be4041de-b1c4-405d-a3a6-aa83b26387a2,false,false,regulate_transformers_111,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,,,,false,false -2410a3aa-1e38-44e7-bf39-1ccf5dd11993,false,false,regulate_transformers_112,0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,false,false -4407b9fd-dcb2-4029-897d-098096913e53,false,false,regulate_transformers_113,7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,false,false -41a4c501-2af5-495c-9cea-f0ccb0b900b8,false,false,regulate_transformers_114,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,false,false -1576be48-baa2-43e3-87dc-fa105ef2f2d4,false,false,regulate_transformers_115,01bdd8b2-145f-42b3-80e3-a2366dea1044,,,,false,false -c459a1f1-ba9a-4234-8659-50295f90b468,false,false,regulate_transformers_116,6232b760-b2e0-485e-9c61-f9721a366a81,,,,false,false -e0ac0b90-c970-41fc-bbee-3f2934314373,false,false,regulate_transformers_117,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,false,false -88d8ff12-1db1-4c9e-a815-467e34d2207f,false,false,regulate_transformers_118,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,,,,false,false -c6499258-3280-4c71-8410-1a4c7d47db9c,false,false,regulate_transformers_119,eb125953-31d3-4207-adf7-aba3a3790d6f,,,,false,false -f773caf3-3315-4fc7-a5e2-ab39761681cf,false,false,regulate_transformers_120,ce71377d-63ea-462a-9290-67e51946a098,,,,false,false -aad24aed-07b8-49e4-abe3-ece2f8c315fb,false,false,regulate_transformers_121,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,,,,false,false -d30f0801-baf4-4266-b248-f922e141bf23,false,false,regulate_transformers_122,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,false,false -29415047-fba9-400a-b110-a8e256de127f,false,false,regulate_transformers_123,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,false,false -8d45dfe7-5498-432c-b4c6-ab059b4c7180,false,false,regulate_transformers_124,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,false,false -b400da1c-8f46-463a-92aa-28ec48391a7b,false,false,regulate_transformers_125,15345698-c319-461f-b969-37d50fb84220,,,,false,false -f52d2875-0a0a-4644-8d00-1680d1f97dc7,false,false,regulate_transformers_126,97ae0aa4-bf05-4b88-8020-83cbda415d22,,,,false,false -9972b6e7-9a85-497e-99b5-9fff8acd62a9,false,false,regulate_transformers_127,576840db-7d3c-417b-b587-28b222e740e1,,,,false,false -78d7be08-3dda-4a2a-be9f-57fbe2430d78,false,false,regulate_transformers_128,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,,,,false,false -935783c6-e8f3-4903-924f-23b8a6c67d65,false,false,regulate_transformers_129,ca3391eb-ca94-4945-ac72-e116f396f82c,,,,false,false -f7d0ea65-7168-4146-a42d-30b50b1d4089,false,false,regulate_transformers_130,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,false,false -367d9faf-f7d9-4d58-8f0d-f2c16cdaa02d,false,false,regulate_transformers_131,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,false,false -1b475922-4d80-45dc-bde5-b47a481c78bc,false,false,regulate_transformers_132,8f80e777-ccbd-4630-b10e-238e824113fd,,,,false,false -d2697fa8-923f-4607-ad1a-8eb03b1a896c,false,false,regulate_transformers_133,b608d71e-3ede-4156-a015-3f6e1d22242a,,,,false,false -2383eaed-0113-4a6d-af2f-ca749ef41841,false,true,regulate_transformers_134,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,,,,false,false -21e66d24-07be-4bd1-9650-f34a7e246934,false,false,regulate_transformers_135,52e15712-2572-442a-b22c-add48af95115,,,,false,false -adff9795-8842-4f67-827c-c59ded8ca641,false,false,regulate_transformers_136,c6c177b0-5004-4db0-8cde-6293330a4757,,,,false,false -826220a5-49bc-4f97-96c6-6c6885741c11,false,false,regulate_transformers_137,ed4697fd-016c-40c2-a66b-e793878dadea,,,,false,false -adc1aad7-84ad-4770-8db2-70c63ef5dbf3,false,false,regulate_transformers_138,c5457e35-ad81-4427-9d3a-99e4c44ccae8,,,,false,false -850a09fb-034f-4015-9ede-b1d696acbf93,false,false,regulate_transformers_139,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,,,,false,false -a31a4f91-5be5-49bb-aa19-5035efd641ea,false,false,regulate_transformers_140,55caf2ec-a21b-4afd-8830-1e4009cce396,,,,false,false -76f8692d-38fc-45c3-906b-c63cb35a8b64,false,false,regulate_transformers_141,df8df8d2-3494-4da9-8d1b-f913d15f520f,,,,false,false -c705a830-53a4-40b3-9c30-59cf1ce36a56,false,false,regulate_transformers_142,4db634e5-3eb8-4c17-bc44-eb224667580c,,,,false,false -e1966855-f343-4aa3-ab44-cfccaad40e7e,false,false,regulate_transformers_143,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,,,,false,false -6e87b079-c050-46ef-85ca-0b96300dc0ff,false,false,regulate_transformers_144,d7023c15-adb7-4d56-9f86-b182611a47ef,,,,false,false -7f732953-6d4d-42f5-95a8-852f72a1483b,false,false,regulate_transformers_145,8254d91b-e5da-4402-bb8f-301eafa09d28,,,,false,false -504b1cf1-0690-4cdb-b659-13bd451467d0,false,false,regulate_transformers_146,f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,false,false -4d2dac3e-3fda-4fea-a52c-4e481042517e,false,false,regulate_transformers_147,39112046-8953-4e73-a5d9-6a8183a77436,,,,false,false -9072f447-1357-4452-8c5b-f14f1d94a6ab,false,false,regulate_transformers_148,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,false,false -64daf3dc-4714-4aa4-bb67-55cfb1b5ca73,false,false,regulate_transformers_149,33f29587-f63e-45b7-960b-037bda37a3cb,,,,false,false -84dd04cd-abea-4743-8498-0abdbedebd03,false,false,regulate_transformers_150,fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,false,false -5f164f6e-5744-4466-abd7-c7f0f17f399b,false,false,regulate_transformers_151,9b889b73-c108-4b38-b6eb-3377841e0c83,,,,false,false -bbbadfd4-c5cc-4fa4-9769-616c033747d9,false,false,regulate_transformers_152,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,false,false -2575ae3f-f91f-469e-a98c-3674f8e78f72,false,false,regulate_transformers_153,36cda100-86ae-4a20-ac71-20af603ac0cf,,,,false,false -cb457762-d0ba-4114-9708-d6c8ae4f881c,false,false,regulate_transformers_154,fc7821d2-ac64-483e-b520-38d9971f4db0,,,,false,false -4fc2d6f9-9823-4e0a-8161-6158f5533f4d,false,false,regulate_transformers_155,b22c9299-5fb4-46a7-b566-fc17e0d51d60,,,,false,false -3cedc328-b1ad-4d0e-8ca7-296cfd0e5e37,false,false,regulate_transformers_156,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,false,false -1c832b85-43f1-4452-b78a-243a99da121d,false,false,regulate_transformers_157,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,false,false -e03f6067-12c1-4b07-aa8a-1203bd9dc743,false,false,regulate_transformers_158,867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,false,false -2cc3b9e9-3f7d-4a08-8f06-0e2ddcb65b46,false,false,regulate_transformers_159,b5548457-5923-4d52-b3c9-fdb75a1df98e,,,,false,false -dfe60951-b826-4ac5-8ddd-9e5a1ef34ad9,false,false,regulate_transformers_160,8b3e3802-5213-46d0-a498-15eb6e5852b5,,,,false,false -143793c8-01eb-4936-88a5-a2a1b3b2c7b6,false,false,regulate_transformers_161,5af425fa-6ed7-43e1-8898-7af1315128c5,,,,false,false -c73760de-117a-436d-a700-578911806184,false,false,regulate_transformers_162,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,,,,false,false -e6826e1c-9ec6-49a2-ba16-ac1c35deafab,false,false,regulate_transformers_163,21359dd1-7a23-4932-b656-c196fbffe751,,,,false,false -0ac270da-16cf-48c9-b114-f2b6174e7c8f,false,false,regulate_transformers_164,de5ee252-ebb6-42b0-875c-77ae557ffbf6,,,,false,false -1f05b5e7-9dc0-41b5-a4b5-2c90709f561f,false,false,regulate_transformers_165,6a4547a8-630b-46e4-8144-9cd649e67c07,,,,false,false -eaadb678-2871-468c-8cce-5ab5ede78d24,false,false,regulate_transformers_166,bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,false,false -a0e99231-f252-4cdf-bda2-c53fbe4bdfda,false,false,regulate_transformers_167,366a70fb-8d7f-4201-9eca-0fcbc839239d,,,,false,false -77f8104c-d4ac-4ece-b697-63b6e9736a07,false,false,regulate_transformers_168,0c266541-6235-4d01-8258-e763c58af6c7,,,,false,false -cd2234fa-4aca-481a-a7ab-995a62740f05,false,false,regulate_transformers_169,bf7e7268-2fb6-4948-ace6-9037ae148fa3,,,,false,false -b8cf30b6-093e-4f23-a87d-531a03e6960f,false,false,regulate_transformers_170,f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,false,false -b74c75f6-4997-44d5-9c5a-80d6626ccd00,false,false,regulate_transformers_171,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,,,,false,false -2d228c9c-76e6-44c2-9ac4-e64f85e15a42,false,false,regulate_transformers_172,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,false,false -2948794c-e091-4d92-b6a6-71240befd1a8,false,false,regulate_transformers_173,bdf97a4d-622c-4251-8183-8b1a696f376e,,,,false,false -9ee8efa2-77c9-409a-8f3a-b15893c0702d,false,false,regulate_transformers_174,543f7e9f-b9be-486b-b365-2bae79010758,,,,false,false -7848c8d2-2866-4820-8faf-0740f7b3beab,false,false,regulate_transformers_175,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,,,,false,false -cd51000f-ae27-4110-969b-f4f56c629a19,false,false,regulate_transformers_176,55b3d03f-2204-4ab3-84cc-a28476868c9d,,,,false,false -1c7c1e89-47cf-4379-a0f7-a50693f08061,false,false,regulate_transformers_177,205fcee1-928c-4374-950c-34575f07fa49,,,,false,false -5cedd965-43a3-4331-89d9-cdc1f31ad6b7,false,false,regulate_transformers_178,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,,,,false,false -7a991c29-f459-4009-a17c-fa33219abea4,false,false,regulate_transformers_179,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,false,false -82c431f7-c49a-4c2d-bc22-13da70d84e52,false,false,regulate_transformers_180,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,false,false -cc2c069b-e2b6-421a-b5f7-57a8ecc4e502,false,false,regulate_transformers_181,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,false,false -ad8fe901-76db-4e7c-9bbb-73291439acf5,false,false,regulate_transformers_182,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,,,,false,false -909ed568-3c4c-4f89-b122-7132198eef53,false,false,regulate_transformers_183,df97c0d1-379b-417a-a473-8e7fe37da99d,,,,false,false -4f8eb822-a329-4ab9-a80b-934329ec22a0,false,false,regulate_transformers_184,09ac8949-2b79-41d7-b56f-a58f20036df2,,,,false,false -6ae70465-296b-4aad-b23a-2963a65b9ed7,false,false,regulate_transformers_185,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,,,,false,false -f87bef4c-fcdc-4fcf-84e5-1f851b257d79,false,false,regulate_transformers_186,c7e09266-c778-433b-b01a-5fb9e298ea8e,,,,false,false -fba158e0-29b5-4429-8d0f-8bb467bea5b1,false,false,regulate_transformers_187,f26b5511-3c50-42d5-97c2-be408330eb84,,,,false,false -d7001bc1-3bde-4bd4-bdda-36225b3793db,false,false,regulate_transformers_188,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,,,,false,false -fff27c18-a5e8-4950-b0ff-e4f445671845,false,true,regulate_transformers_189,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,,,,false,false -435f9ee7-09fe-478a-88e8-d5a1e28b5f39,false,false,regulate_transformers_190,92cb5065-2e57-4099-8e29-75cbc0c80370,,,,false,false -bfdd51e4-81a5-4d08-8037-ad54e62e7a5c,false,false,regulate_transformers_191,a4a44d93-48d6-4b87-8053-87fe0778e75c,,,,false,false -ab4ce2f7-0f2c-4233-876d-4f023d99d61c,false,false,regulate_transformers_192,22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,false,false -eb878b9a-41ed-4077-a39b-e8e8dad68528,false,false,regulate_transformers_193,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,,,,false,false -2b84f8fb-9693-45fd-90ba-a644061fbafc,false,false,regulate_transformers_194,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,false,false -2707e81a-6d6e-46eb-9555-d54691ea438c,false,false,regulate_transformers_195,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,false,false -43139d5b-1ced-48d6-af24-94df5ca57ebb,false,false,regulate_transformers_196,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,,,,false,false -e96678f2-1fc8-48e3-b711-f9c32fbe3d4f,false,false,regulate_transformers_197,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,false,false -1ebeee88-0fc1-458c-a76d-fbf7b8bde785,false,false,regulate_transformers_198,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,false,false -df9be774-fd48-49eb-8011-3f436d86451b,false,false,regulate_transformers_199,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,false,false -1391b933-d2d9-4196-ad5c-78d476b9d2fe,false,false,regulate_transformers_200,b37ea333-65e1-4211-8449-993b67e8e0e2,,,,false,false -b44fc798-84b4-4eff-a0a4-9c8bd6ba42dd,false,false,regulate_transformers_201,032768b4-2426-4abf-806b-83813ac5137a,,,,false,false -bba62ba4-4f15-4065-880f-4bc81be75854,false,false,regulate_transformers_202,49b511fa-8cff-45f4-9a59-54faaaf90abf,,,,false,false -def7fad7-c3a5-43d0-93b0-898e74192eff,false,false,regulate_transformers_203,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,,,,false,false -7aa80fd8-b9f2-446d-818c-3ff0e31e378f,false,true,regulate_transformers_204,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,false,false -22d7c8cf-cb1d-4059-a974-25119f8bde1d,false,false,regulate_transformers_205,3a2f199c-2966-4b9a-939b-3a6c9924341c,,,,false,false -e78fa130-e2a5-4dc9-9939-9a6f0d6b3fbf,false,false,regulate_transformers_206,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,,,,false,false -c46de7ea-b9b5-4734-a46b-39d3d3edde47,false,false,regulate_transformers_207,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,false,false -eeb314a0-ab9a-44a5-abc0-f571a6ca666a,false,false,regulate_transformers_208,6c24b464-790a-4aae-bb11-766718f07cd5,,,,false,false -cbd2e11e-24fc-4601-8657-ca5b403abe39,false,false,regulate_transformers_209,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,false,false -98695523-6258-452b-837d-648ab9f9b8c8,false,false,regulate_transformers_210,5071dd8c-bbc1-4c8d-a180-4492f80e183d,,,,false,false -4e19f276-13c1-4c7e-868b-9251917b8687,false,false,regulate_transformers_211,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,,,,false,false -4af7f165-7ccd-4131-abf9-de37315c2b97,false,true,regulate_transformers_212,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,false,false -d70d5348-b46a-4dbb-9b98-febed4795099,false,false,regulate_transformers_213,f717b05b-f4e7-43d9-af9e-638e2badee5a,,,,false,false -c1bea365-82ad-42fc-b0a0-a214ed3075c2,false,false,regulate_transformers_214,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,,,,false,false -19e52c75-8dd5-457e-901e-69bb128b4a6e,false,false,regulate_transformers_215,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,false,false -c4a2e8d2-fe14-4f45-a72e-3e1293ae6a90,false,false,regulate_transformers_216,535843a3-cf93-412f-b4d7-585337791ba8,,,,false,false -bdcf677d-0077-4cbf-b164-bf4e080e2c1c,false,false,regulate_transformers_217,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,false,false -52075952-9625-4fc4-a452-37592fa69884,false,false,regulate_transformers_218,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,false,false -55d6627a-69e9-4f87-981a-335a6810a3ff,false,false,regulate_transformers_219,fd3b7bb8-3976-4441-9211-745243afd80f,,,,false,false -4acb33fe-2960-4974-8448-c40f98606f35,false,false,regulate_transformers_220,1ee9de9a-0095-4b58-beeb-e56fb908844a,,,,false,false -eafef299-2cd3-4d63-815a-cee11beaf21d,false,false,regulate_transformers_221,50164699-2018-4b17-b3f1-74b082f27403,,,,false,false -41c336b5-a58b-4b67-ac56-380e59b6be5b,false,false,regulate_transformers_222,00d4a837-f09c-41df-bed1-dfdb78387116,,,,false,false -58795c71-6a49-42b3-a35d-9bed906fa7a3,false,false,regulate_transformers_223,636dec7c-4242-46e8-b7ae-db7e5a28c39c,,,,false,false -386f225c-b8ef-46e6-980c-6d7228442808,false,false,regulate_transformers_224,3802b603-d08d-4031-b7d7-e29734bcc122,,,,false,false -c6d58ece-f39c-4b53-b827-28b3ebb62e52,false,false,regulate_transformers_225,14ae9865-cb9b-4518-9f2a-c0fda3455a42,,,,false,false -06ad2cb3-4264-4eb6-84c1-330c3ef9f438,false,false,regulate_transformers_226,e3c3c6a3-c383-4dbb-9b3f-a14125615386,,,,false,false -1d7dc2a9-8e66-4a7b-8f97-9a5ba374b08b,false,false,regulate_transformers_227,e80aa2db-f32c-410d-96a1-a32e03222568,,,,false,false -85e58734-028e-4ab2-adb7-26809bfaf1ed,false,false,regulate_transformers_228,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,false,false -e574317c-ab47-4c57-a49f-a51f0710f2ff,false,false,regulate_transformers_229,eb95ff15-56db-4463-bb54-0ee131167812,,,,false,false -c687695d-a2e1-4556-867f-d8ea1749ed0e,false,false,regulate_transformers_230,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,false,false -813d0736-8c1a-4693-893e-2b095573aa0e,false,false,regulate_transformers_231,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,,,,false,false -79d76ba1-7704-474d-839f-d89e9c9fd2dd,false,false,regulate_transformers_232,fa6d5184-b205-4b1b-839f-7b21ac956c29,,,,false,false -aa85ca17-6ced-4b2b-9b89-384392b2f640,false,false,regulate_transformers_233,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,,,,false,false -f2a5230f-6bf0-4378-9436-f398fa540c35,false,false,regulate_transformers_234,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,,,,false,false -80c61f4a-d979-45c2-a61a-99fe4bd5269d,false,false,regulate_transformers_235,270c7266-45dc-4e45-829f-c04f6b631cad,,,,false,false -8a7d07dd-41b8-4ddc-b476-642e5b210d76,false,false,regulate_transformers_236,9f7599de-c488-46c5-b053-1279a511f7b9,,,,false,false -0b3d6a9f-7ddf-4dc1-96a3-5265c66e9401,false,false,regulate_transformers_237,5862f526-783a-4218-a463-3cbf5de8dade,,,,false,false -6fec7147-dfe5-406b-8c1c-9c86df3ce5f8,false,false,regulate_transformers_238,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,,,,false,false -0ea53d4d-370c-4e33-b568-5131c0c5fcf9,false,false,regulate_transformers_239,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,,,,false,false -28ba14c0-973a-4915-9b27-b91c8cba88ce,false,false,regulate_transformers_240,9f95c733-71e2-4bf0-a27a-70144518ea2c,,,,false,false -32782a5b-afcd-4736-a4a1-a8ef569f7424,false,false,regulate_transformers_241,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,,,,false,false -6a4c7638-ed70-47f7-a0a4-4b4f71d10365,false,false,regulate_transformers_242,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,,,,false,false -471d0d48-3387-4f82-b21f-a2519a6ae7db,false,true,regulate_transformers_243,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,false,false -08aeb5c3-966e-47fc-b14e-52774e69fcb8,false,false,regulate_transformers_244,857c264a-7072-4bb7-af56-2f01539b2a2e,,,,false,false -63013b94-1300-4a19-b55d-df71ddd61665,false,false,regulate_transformers_245,dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,false,false -bf394381-79da-4b9f-ac19-7afab4595c5d,false,false,regulate_transformers_246,32507a10-1eed-4a3f-820c-bc187f3b052e,,,,false,false -085b84bc-3132-4c6c-a2d8-7969f7e5d1fe,false,false,regulate_transformers_247,86af5351-87ef-49c6-bd17-673dceecee5b,,,,false,false -96ddb0c2-a2a8-4691-ae52-1aa1d23438e6,false,false,regulate_transformers_248,c5af5a34-211a-4105-a8e1-f447140073c6,,,,false,false -e8f21255-094b-402d-a0a9-ba3a004f0157,false,false,regulate_transformers_249,922a6375-b97c-412e-a6c9-b0ea55a23f76,,,,false,false -ce8939f6-b3db-4279-8f72-3ea030419c36,false,false,regulate_transformers_250,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,,,,false,false -89f5a537-e496-4c62-9d45-1feeb1ef957e,false,false,regulate_transformers_251,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,,,,false,false -61a2adbd-17ff-4268-85d1-51785b682df5,false,false,regulate_transformers_252,9d02ea80-98d8-4cd0-a635-9104a14a56dd,,,,false,false -7a256896-72c4-42b0-b6dc-bcf792662085,false,false,regulate_transformers_253,177a20fe-83b1-46df-94a3-4faa54348d10,,,,false,false -559ed9dd-3637-4f6d-b6f7-1af7af696784,false,false,regulate_transformers_254,d82fae59-844a-4c85-997e-326dd876137c,,,,false,false -2f2560da-198d-4945-b310-4a48d0fccc12,false,false,regulate_transformers_255,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,,,,false,false -e43fd0c7-b475-418e-a4c2-1f28b942953c,false,false,regulate_transformers_256,69efeb2d-9845-49ac-8500-5e017a7a64ef,,,,false,false -1ce30e16-517c-463f-9587-3489ebdeda96,false,false,regulate_transformers_257,1f040625-ad1d-409f-bd7e-944c4d805e46,,,,false,false -0dd7a4fb-fc31-441c-be6e-71cf3907348b,false,false,regulate_transformers_258,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,,,,false,false -6d87e69c-c914-4611-82a3-ae1ae3c11cd4,false,false,regulate_transformers_259,e018b95e-fca5-40f7-8550-b05a619169dc,,,,false,false -76abc81c-c5fc-4376-b57a-6e42f33c1df5,false,false,regulate_transformers_260,2c520ab6-507e-4dcf-ab05-8f238e9b9385,,,,false,false -4f4f439f-7508-4a06-97fc-f396a740b2a4,false,false,regulate_transformers_261,4f28e734-5148-4caf-ac64-270231740cbf,,,,false,false -44f8915c-8c14-4900-b468-b7a77a6485f9,false,false,regulate_transformers_262,fd534474-cd65-47aa-8005-dc50d17d6920,,,,false,false -c74609bf-c070-4e5a-98bd-0c0acdc2e4fe,false,false,regulate_transformers_263,285a4caa-2da8-4bd2-8a60-7d04f168f378,,,,false,false -25fb109f-55b5-4d72-acc7-29023f51e695,false,false,regulate_transformers_264,6dcdc87b-a719-416f-9da1-21a701048f3a,,,,false,false -d7f1a826-c63d-43fc-9665-b7b35f4cfc60,false,true,regulate_transformers_265,3da4fd3d-ac5e-409d-91fa-36516673cf57,,,,false,false -09c64d71-b499-42c5-bcf5-8fdc0d8125a1,false,false,regulate_transformers_266,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,false,false -999a25c8-c7c5-4974-9878-87e21a26509f,false,false,regulate_transformers_267,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,false,false -58c4e7bb-0755-434a-bdbf-9062fae8ddee,false,false,regulate_transformers_268,450426ac-a560-4d17-b1fc-9e169530a655,,,,false,false -651681d9-b509-4be9-873e-c926d3d26863,false,false,regulate_transformers_269,d40a1a85-40f2-4ad3-ba58-720d5ba02268,,,,false,false -9d3c53bc-890b-44ca-bdbc-42274d6da588,false,false,regulate_transformers_270,154e9a99-467b-4f65-9928-8ebb14149baa,,,,false,false -34e491cc-2bad-4c91-ac1b-3a35e9d96720,false,false,regulate_transformers_271,39dbc5ed-d874-48a8-9128-e970436a94b4,,,,false,false -89f53805-810d-4c3b-9697-5bf56f3997f9,false,false,regulate_transformers_272,a7ebd30b-b843-405f-9fae-ca6b489601f9,,,,false,false -44ffe2cf-b23b-417c-b3db-9b62020e9e0c,false,false,regulate_transformers_273,75f2dfb9-75a0-496d-9c44-79e7df54c1df,,,,false,false -5dbd05be-90f0-4b9e-b919-a6aefe03e17b,false,false,regulate_transformers_274,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,false,false -90dbeebf-da14-4086-9b55-e0c06b985c4f,false,false,regulate_transformers_275,04f29760-9e52-4943-8563-62e1fbd5ed52,,,,false,false -f66bda67-ecd3-4380-b631-d9673de623c5,false,false,regulate_transformers_276,9ce9d92c-5583-4b16-bec6-9f67834663cb,,,,false,false -31d320ef-0ed4-488d-81c4-c590d03f0dff,false,false,regulate_transformers_277,c317a6cd-428b-4c36-8233-91d0c4e2717a,,,,false,false -a160c82e-c2a6-45fd-9c93-34cff9f26d8a,false,false,regulate_transformers_278,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,,,,false,false -468eed00-b560-460d-bb98-078355afd3f1,false,false,regulate_transformers_279,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,false,false -b0da0363-e6d7-47b6-b968-2b5119346f36,false,false,regulate_transformers_280,eb21d716-1b54-4dba-bdc2-d1f6752aef85,,,,false,false -6fce766f-5bb4-4d5f-8b2b-8b451c7e04d2,false,false,regulate_transformers_281,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,,,,false,false -de0c0cc7-4de4-42e8-91b3-fe990134c6e7,false,false,regulate_transformers_282,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,false,false -abf7ee46-a259-4df9-851e-cc519026d38a,false,false,regulate_transformers_283,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,false,false -329c0f76-00f4-48dc-9f3b-9c4b2d11cd8f,false,true,regulate_transformers_284,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,false,false -867993b3-4106-4ebd-bb63-96e7b1e2b4ce,false,false,regulate_transformers_285,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,,,,false,false -2b306214-3b46-46bf-b523-c0c9bc6fc4fd,false,false,regulate_transformers_286,b46d4395-6724-4830-ba55-357e81fc2814,,,,false,false -7bad376d-44fd-40e0-92fd-e2bc1be63384,false,false,regulate_transformers_287,369cffa5-bcee-4489-8193-1d9b10230eca,,,,false,false -376e15ac-fa1c-40d6-ba7c-9378dc6998f3,false,false,regulate_transformers_288,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,false,false -b4b30c31-25a7-4676-9422-e536ab638ce0,false,false,regulate_transformers_289,012c9eee-86c2-494c-adcc-bbfc481e4a46,,,,false,false -bb2c7640-f0f1-477c-bf95-881402db5d15,false,false,regulate_transformers_290,daed3552-e382-4153-95be-97f17e2c53e5,,,,false,false -16a71cd9-5620-4f17-9385-d7ecc986fead,false,false,regulate_transformers_291,5981fe65-3c92-4a78-af92-1461904046d0,,,,false,false -e1956e5e-cbab-4203-b760-bda0449a9d51,false,false,regulate_transformers_292,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,false,false -a83bdabc-bf82-4f68-9d96-b876218cc407,false,false,regulate_transformers_293,890f2162-b4cb-49e7-a16f-4b552c5e245c,,,,false,false -ddb09433-1cf8-4294-bdf2-a3fd74c3d7e0,false,false,regulate_transformers_294,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,,,,false,false -ef252d44-269d-450d-b950-1a9583f707f8,false,false,regulate_transformers_295,40537c84-c812-4231-bd23-0ba81922e937,,,,false,false -21923b6b-2ef3-4422-8b6a-7ed3a3868467,false,false,regulate_transformers_296,f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,false,false -70605687-5655-44df-accb-7e070fc94958,false,false,regulate_transformers_297,9b509c7d-4647-40fd-b03e-7ab919215cc6,,,,false,false -9ad91355-cee8-4bfb-921a-b7d069e75fd8,false,false,regulate_transformers_298,99e26ef8-75e2-46f3-aafc-6287bf5e3905,,,,false,false -f252836a-4cbe-464d-8943-e5709e4fb32f,false,false,regulate_transformers_299,7125de08-1d28-409a-8b23-023a0294def5,,,,false,false +uuid,v_ang,v_mag,id,node,operates_from,operates_until,operator,p,q +4af7f165-7ccd-4131-abf9-de37315c2b97,false,true,regulate_transformers_1,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,false,false +79d76ba1-7704-474d-839f-d89e9c9fd2dd,false,true,regulate_transformers_2,fa6d5184-b205-4b1b-839f-7b21ac956c29,,,,false,false +aa85ca17-6ced-4b2b-9b89-384392b2f640,false,true,regulate_transformers_3,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,,,,false,false +61a2adbd-17ff-4268-85d1-51785b682df5,false,true,regulate_transformers_4,9d02ea80-98d8-4cd0-a635-9104a14a56dd,,,,false,false +9a15a6d0-dc24-4066-b0b4-81ffdc05f6d7,false,true,regulate_transformers_5,0b2a3b46-5e43-4879-973e-d8fb96429d8a,,,,false,false +813d0736-8c1a-4693-893e-2b095573aa0e,false,true,regulate_transformers_6,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,,,,false,false +d539a4ff-bcb3-41e3-a93b-ad939d183697,false,true,regulate_transformers_7,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,,,,false,false +b306276b-e7e0-4712-9577-198e7fcd8d26,false,true,regulate_transformers_8,898d8295-bf35-4079-9374-99b059c2c956,,,,false,false +085776f7-ad53-4574-a871-acfa6192c3a1,false,true,regulate_transformers_9,1396cb4c-cee7-4116-97c9-290f98785719,,,,false,false +ecdd4498-6f9c-4768-81f6-8b00c098a386,false,true,regulate_transformers_10,f29859be-c6e7-4cf9-84d7-239eb98a9e65,,,,false,false +e0e5894f-f02c-4874-8e9a-4f91301a5360,false,true,regulate_transformers_11,6570535c-0d2e-4846-9951-21559902f67a,,,,false,false +7686b818-a0ba-465c-8e4e-f7d3c4e171fc,false,true,regulate_transformers_12,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,false,false +41a4c501-2af5-495c-9cea-f0ccb0b900b8,false,true,regulate_transformers_13,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,false,false +114be860-a848-48a1-af7e-5265653d1f0c,false,true,regulate_transformers_14,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,,,,false,false +dfe60951-b826-4ac5-8ddd-9e5a1ef34ad9,false,true,regulate_transformers_15,8b3e3802-5213-46d0-a498-15eb6e5852b5,,,,false,false +1b3db287-eefa-4585-8575-e031b5705aa7,false,true,regulate_transformers_16,da79c960-d35a-4193-9b06-2d4d57051706,,,,false,false +ca3091f3-db57-472e-8e29-94053c9570aa,false,true,regulate_transformers_17,f5839ade-5968-4879-a824-90b5fb3552cd,,,,false,false +16a71cd9-5620-4f17-9385-d7ecc986fead,false,true,regulate_transformers_18,5981fe65-3c92-4a78-af92-1461904046d0,,,,false,false +9ad91355-cee8-4bfb-921a-b7d069e75fd8,false,true,regulate_transformers_19,99e26ef8-75e2-46f3-aafc-6287bf5e3905,,,,false,false +140cd6d1-b980-41b4-a22d-2cc289453a43,false,true,regulate_transformers_20,b7baa286-cbe2-4143-a08f-4e025af47529,,,,false,false +5ef3ee7c-67eb-4951-93df-0a3679b41528,false,true,regulate_transformers_21,41414318-73e3-4bdc-8147-570a96b28d37,,,,false,false +e6ca6877-53da-4fde-893f-566526699c47,false,true,regulate_transformers_22,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,,,,false,false +c705a830-53a4-40b3-9c30-59cf1ce36a56,false,true,regulate_transformers_23,4db634e5-3eb8-4c17-bc44-eb224667580c,,,,false,false +65fc15a0-ee49-443f-a9c1-1368de89db3e,false,true,regulate_transformers_24,de756ddb-793d-4b2d-959c-59d938a8f61f,,,,false,false +d642d999-be25-414e-9bf6-200ceeb013b4,false,true,regulate_transformers_25,bd288184-99d8-4233-bb3d-484f3922200a,,,,false,false +4560a99d-93e2-4a7d-8bd1-9fa77bad422f,false,true,regulate_transformers_26,732f83b0-b9c5-4b8e-86fe-753c26f40e78,,,,false,false +7c2af318-272b-4c39-8713-9d2a34f3a15b,false,true,regulate_transformers_27,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,,,,false,false +f7d0ea65-7168-4146-a42d-30b50b1d4089,false,true,regulate_transformers_28,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,,,,false,false +89f5a537-e496-4c62-9d45-1feeb1ef957e,false,true,regulate_transformers_29,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,,,,false,false +1d6b2628-3579-4ec9-8a6a-50187575504c,false,true,regulate_transformers_30,1bf26b4d-03cc-4490-8c33-d3db8597d807,,,,false,false +8a7d07dd-41b8-4ddc-b476-642e5b210d76,false,true,regulate_transformers_31,9f7599de-c488-46c5-b053-1279a511f7b9,,,,false,false +1391b933-d2d9-4196-ad5c-78d476b9d2fe,false,true,regulate_transformers_32,b37ea333-65e1-4211-8449-993b67e8e0e2,,,,false,false +7cfe9ccc-8a1c-4c1b-a2da-5e7d5e08a8b6,false,true,regulate_transformers_33,f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,false,false +d70d5348-b46a-4dbb-9b98-febed4795099,false,true,regulate_transformers_34,f717b05b-f4e7-43d9-af9e-638e2badee5a,,,,false,false +739fc1a2-0c22-4fcb-81e0-1f3941cbb285,false,true,regulate_transformers_35,a286f73a-20ee-4056-8129-c7963b34ecd9,,,,false,false +bb6b8889-39b0-4785-9695-4703e776d870,false,true,regulate_transformers_36,a5c73608-5a85-495d-bea0-df77b6ce66ea,,,,false,false +e78fa130-e2a5-4dc9-9939-9a6f0d6b3fbf,false,true,regulate_transformers_37,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,,,,false,false +329c0f76-00f4-48dc-9f3b-9c4b2d11cd8f,false,true,regulate_transformers_38,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,false,false +0dd7a4fb-fc31-441c-be6e-71cf3907348b,false,true,regulate_transformers_39,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,,,,false,false +a2ef290c-08df-4f25-902f-41b603d95d8f,false,true,regulate_transformers_40,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,,,,false,false +471d0d48-3387-4f82-b21f-a2519a6ae7db,false,true,regulate_transformers_41,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,false,false +750c1809-a8d3-4a64-a6d6-3f7b92ab6482,false,true,regulate_transformers_42,32bd37df-255b-4eb2-9d16-5b711132eee6,,,,false,false +be4041de-b1c4-405d-a3a6-aa83b26387a2,false,true,regulate_transformers_43,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,,,,false,false +e574317c-ab47-4c57-a49f-a51f0710f2ff,false,true,regulate_transformers_44,eb95ff15-56db-4463-bb54-0ee131167812,,,,false,false +eafef299-2cd3-4d63-815a-cee11beaf21d,false,true,regulate_transformers_45,50164699-2018-4b17-b3f1-74b082f27403,,,,false,false +e7fa841e-7284-4e1f-906e-a000bdaba14c,false,true,regulate_transformers_46,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,,,,false,false +def7fad7-c3a5-43d0-93b0-898e74192eff,false,true,regulate_transformers_47,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,,,,false,false +32782a5b-afcd-4736-a4a1-a8ef569f7424,false,true,regulate_transformers_48,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,,,,false,false +16f15999-3cd5-4181-af2d-f9bc45a8bed5,false,true,regulate_transformers_49,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,,,,false,false +9072f447-1357-4452-8c5b-f14f1d94a6ab,false,true,regulate_transformers_50,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,false,false +a464a83d-c2bc-45e7-bad8-e12d6cbf3d83,false,true,regulate_transformers_51,32b3bb19-c52a-4a19-890a-94a8918d38a9,,,,false,false +6a4c7638-ed70-47f7-a0a4-4b4f71d10365,false,true,regulate_transformers_52,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,,,,false,false +e95dd056-e40f-48db-8554-baa369945467,false,true,regulate_transformers_53,06b7f21a-d6d7-4ec0-94c6-141845f14986,,,,false,false +6342ea88-5679-4459-891c-fe7a1f755208,false,true,regulate_transformers_54,c72a08bc-4685-49b1-b8ef-803aebc8c388,,,,false,false +ea45c1fa-f734-4907-8239-4129050e5bc0,false,true,regulate_transformers_55,36dccefc-f04c-493f-bb88-11343583bf9f,,,,false,false +05bebe8d-34ab-4bf6-ba9c-d6056a583075,false,true,regulate_transformers_56,926d6113-933f-49e3-9529-a3035acdc9b2,,,,false,false +2f2560da-198d-4945-b310-4a48d0fccc12,false,true,regulate_transformers_57,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,,,,false,false +64347128-defb-4643-83dc-40158b42fd7f,false,true,regulate_transformers_58,5dfd45b8-48e7-42fd-ac53-cc57455486b5,,,,false,false +bfdd51e4-81a5-4d08-8037-ad54e62e7a5c,false,true,regulate_transformers_59,a4a44d93-48d6-4b87-8053-87fe0778e75c,,,,false,false +52075952-9625-4fc4-a452-37592fa69884,false,true,regulate_transformers_60,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,false,false +5ac1dfa5-693c-4ee4-9b2e-235dc8ccf7df,false,true,regulate_transformers_61,95ced3b5-69fd-4171-9c34-f18802064e22,,,,false,false +b74c75f6-4997-44d5-9c5a-80d6626ccd00,false,true,regulate_transformers_62,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,,,,false,false +6ae70465-296b-4aad-b23a-2963a65b9ed7,false,true,regulate_transformers_63,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,,,,false,false +504b1cf1-0690-4cdb-b659-13bd451467d0,false,true,regulate_transformers_64,f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,false,false +2d34f617-a32c-4a6f-9182-f7872cbc0677,false,true,regulate_transformers_65,519ace7e-fd3f-4797-b14b-36c1694b00cd,,,,false,false +e29a056b-ea0e-4e31-96b9-9c3fdadb7b65,false,true,regulate_transformers_66,80d8252b-045f-471a-9638-416ed3f86120,,,,false,false +6549c764-44de-4f94-8927-f9655f091564,false,true,regulate_transformers_67,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,,,,false,false +2490fc85-e702-4e33-80b7-6db5e9c44388,false,true,regulate_transformers_68,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,,,,false,false +88d8ff12-1db1-4c9e-a815-467e34d2207f,false,true,regulate_transformers_69,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,,,,false,false +99b75455-54b3-40a0-a1af-83a79ac6ffd1,false,true,regulate_transformers_70,e2267696-669b-48e8-b43a-37d0db95011d,,,,false,false +b9037158-f27b-44da-811f-a6cc8fd3bbf5,false,true,regulate_transformers_71,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,false,false +3cedc328-b1ad-4d0e-8ca7-296cfd0e5e37,false,true,regulate_transformers_72,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,false,false +aad24aed-07b8-49e4-abe3-ece2f8c315fb,false,true,regulate_transformers_73,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,,,,false,false +e6826e1c-9ec6-49a2-ba16-ac1c35deafab,false,true,regulate_transformers_74,21359dd1-7a23-4932-b656-c196fbffe751,,,,false,false +9ee8efa2-77c9-409a-8f3a-b15893c0702d,false,true,regulate_transformers_75,543f7e9f-b9be-486b-b365-2bae79010758,,,,false,false +90267614-2f35-426e-90a2-1bb576c2ebcd,false,true,regulate_transformers_76,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,,,,false,false +22d7c8cf-cb1d-4059-a974-25119f8bde1d,false,true,regulate_transformers_77,3a2f199c-2966-4b9a-939b-3a6c9924341c,,,,false,false +f038ad3f-a8cd-48bb-b0dd-3b4a2a7b8442,false,true,regulate_transformers_78,6678c226-c5d2-4ce3-9728-dc1163be799f,,,,false,false +8459745b-4616-4c44-96dd-9e6b1d3623a9,false,true,regulate_transformers_79,60173008-809d-4d8f-b06a-3c4a838dd989,,,,false,false +48a65e25-d6d1-4fcc-9c5e-c545baa126d3,false,true,regulate_transformers_80,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,,,,false,false +78d7be08-3dda-4a2a-be9f-57fbe2430d78,false,true,regulate_transformers_81,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,,,,false,false +cb457762-d0ba-4114-9708-d6c8ae4f881c,false,true,regulate_transformers_82,fc7821d2-ac64-483e-b520-38d9971f4db0,,,,false,false +5232cd6e-3e1f-4d7d-8a20-fb668b7c537f,false,true,regulate_transformers_83,033d0230-4aee-47cf-91f9-81f5f40e60b0,,,,false,false +1988d9ba-10b6-46bd-831d-3a965ecc51d2,false,true,regulate_transformers_84,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,,,,false,false +c6499258-3280-4c71-8410-1a4c7d47db9c,false,true,regulate_transformers_85,eb125953-31d3-4207-adf7-aba3a3790d6f,,,,false,false +e1966855-f343-4aa3-ab44-cfccaad40e7e,false,true,regulate_transformers_86,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,,,,false,false +7cf9544b-1df8-4287-95e1-222d0a8d7ca4,false,true,regulate_transformers_87,0170837a-1876-45f9-a613-666f9991964d,,,,false,false +b400da1c-8f46-463a-92aa-28ec48391a7b,false,true,regulate_transformers_88,15345698-c319-461f-b969-37d50fb84220,,,,false,false +85e58734-028e-4ab2-adb7-26809bfaf1ed,false,true,regulate_transformers_89,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,false,false +1ebeee88-0fc1-458c-a76d-fbf7b8bde785,false,true,regulate_transformers_90,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,,,,false,false +453af838-a5c7-4fd0-8b5c-a1d4466e25a0,false,true,regulate_transformers_91,e25387d0-ab9a-406d-bcb4-555414b88b1b,,,,false,false +24c529c9-09b5-4fd3-ba12-53b3634c78c4,false,true,regulate_transformers_92,dc022eec-16b0-4a64-a2f5-498d81aca71e,,,,false,false +826220a5-49bc-4f97-96c6-6c6885741c11,false,true,regulate_transformers_93,ed4697fd-016c-40c2-a66b-e793878dadea,,,,false,false +b29b43b6-71a7-4481-b57f-ce9f0355a67d,false,true,regulate_transformers_94,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,,,,false,false +eeb314a0-ab9a-44a5-abc0-f571a6ca666a,false,true,regulate_transformers_95,6c24b464-790a-4aae-bb11-766718f07cd5,,,,false,false +8d45dfe7-5498-432c-b4c6-ab059b4c7180,false,true,regulate_transformers_96,3e21f3a1-2c9c-4138-bcc9-466b004609ed,,,,false,false +1f05b5e7-9dc0-41b5-a4b5-2c90709f561f,false,true,regulate_transformers_97,6a4547a8-630b-46e4-8144-9cd649e67c07,,,,false,false +dcce4378-c53c-49d5-85c2-25cd9fbddbac,false,true,regulate_transformers_98,0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,false,false +9972b6e7-9a85-497e-99b5-9fff8acd62a9,false,true,regulate_transformers_99,576840db-7d3c-417b-b587-28b222e740e1,,,,false,false +367d9faf-f7d9-4d58-8f0d-f2c16cdaa02d,false,true,regulate_transformers_100,d69efff2-ba8b-4aa6-a4a1-27267964147a,,,,false,false +f87bef4c-fcdc-4fcf-84e5-1f851b257d79,false,true,regulate_transformers_101,c7e09266-c778-433b-b01a-5fb9e298ea8e,,,,false,false +f52d2875-0a0a-4644-8d00-1680d1f97dc7,false,true,regulate_transformers_102,97ae0aa4-bf05-4b88-8020-83cbda415d22,,,,false,false +ccaa2df4-c38e-43f7-b3e5-84905a62e365,false,true,regulate_transformers_103,5f1c776c-6935-40f7-ba9e-60646e08992b,,,,false,false +84dd04cd-abea-4743-8498-0abdbedebd03,false,true,regulate_transformers_104,fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,false,false +25ac3974-2646-4d0a-ba6b-c4ac1f28ce1a,false,true,regulate_transformers_105,4f2402e8-664a-40f2-970a-abc098a2a0d1,,,,false,false +6e87b079-c050-46ef-85ca-0b96300dc0ff,false,true,regulate_transformers_106,d7023c15-adb7-4d56-9f86-b182611a47ef,,,,false,false +a31a4f91-5be5-49bb-aa19-5035efd641ea,false,true,regulate_transformers_107,55caf2ec-a21b-4afd-8830-1e4009cce396,,,,false,false +2383eaed-0113-4a6d-af2f-ca749ef41841,false,true,regulate_transformers_108,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,,,,false,false +42be54c7-6162-43fd-be82-d3afbea31078,false,true,regulate_transformers_109,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,,,,false,false +d2697fa8-923f-4607-ad1a-8eb03b1a896c,false,true,regulate_transformers_110,b608d71e-3ede-4156-a015-3f6e1d22242a,,,,false,false +7a991c29-f459-4009-a17c-fa33219abea4,false,true,regulate_transformers_111,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,false,false +eaadb678-2871-468c-8cce-5ab5ede78d24,false,true,regulate_transformers_112,bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,false,false +909ed568-3c4c-4f89-b122-7132198eef53,false,true,regulate_transformers_113,df97c0d1-379b-417a-a473-8e7fe37da99d,,,,false,false +0d968f46-fad9-4884-af21-aad2e07f04b2,false,true,regulate_transformers_114,e3a40690-d085-4796-9fcb-48d776e58594,,,,false,false +50c060f1-14c1-4b02-8e7c-5a2d5e42c985,false,true,regulate_transformers_115,d5489e1b-0e7e-4ca9-a362-09c23576a622,,,,false,false +9c578af4-11a8-4c11-8074-f75031a6f41a,false,true,regulate_transformers_116,1dcddd06-f41a-405b-9686-7f7942852196,,,,false,false +50a1e8d3-7e46-4ece-b664-5d07e09ab13f,false,true,regulate_transformers_117,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,false,false +3a4e7915-e547-4939-8a7c-889792f687d0,false,true,regulate_transformers_118,119d270a-ff22-4fdb-8214-cb5b336790bf,,,,false,false +adff9795-8842-4f67-827c-c59ded8ca641,false,true,regulate_transformers_119,c6c177b0-5004-4db0-8cde-6293330a4757,,,,false,false +d6c9ccec-fa8b-401f-808c-5cb33f31203d,false,true,regulate_transformers_120,b3a7431d-89b0-41cb-87a9-5853890796cd,,,,false,false +abdbf7ea-07f0-49e6-bc36-b5081ebaa430,false,true,regulate_transformers_121,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,false,false +935783c6-e8f3-4903-924f-23b8a6c67d65,false,true,regulate_transformers_122,ca3391eb-ca94-4945-ac72-e116f396f82c,,,,false,false +bbbadfd4-c5cc-4fa4-9769-616c033747d9,false,true,regulate_transformers_123,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,false,false +2948794c-e091-4d92-b6a6-71240befd1a8,false,true,regulate_transformers_124,bdf97a4d-622c-4251-8183-8b1a696f376e,,,,false,false +1c832b85-43f1-4452-b78a-243a99da121d,false,true,regulate_transformers_125,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,false,false +85a60c00-6d25-40a5-89e2-5de8edc56a3d,false,true,regulate_transformers_126,0d94a5ea-3a13-48ba-a27f-b2903841c334,,,,false,false +58080973-140e-473d-bb71-25fffa6617d1,false,true,regulate_transformers_127,2645e336-b0df-4d1e-a0ea-375444488f06,,,,false,false +3c64b45f-876c-4782-b7d9-2e8e02a427a3,false,true,regulate_transformers_128,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,false,false +e03f6067-12c1-4b07-aa8a-1203bd9dc743,false,true,regulate_transformers_129,867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,false,false +850a09fb-034f-4015-9ede-b1d696acbf93,false,true,regulate_transformers_130,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,,,,false,false +f773caf3-3315-4fc7-a5e2-ab39761681cf,false,true,regulate_transformers_131,ce71377d-63ea-462a-9290-67e51946a098,,,,false,false +4f5ff4aa-c4de-4e0a-9ee5-1b617e5c6ef4,false,true,regulate_transformers_132,34cd8ee0-e607-4c47-89a7-121c3e32768a,,,,false,false +1576be48-baa2-43e3-87dc-fa105ef2f2d4,false,true,regulate_transformers_133,01bdd8b2-145f-42b3-80e3-a2366dea1044,,,,false,false +7f732953-6d4d-42f5-95a8-852f72a1483b,false,true,regulate_transformers_134,8254d91b-e5da-4402-bb8f-301eafa09d28,,,,false,false +2575ae3f-f91f-469e-a98c-3674f8e78f72,false,true,regulate_transformers_135,36cda100-86ae-4a20-ac71-20af603ac0cf,,,,false,false +c459a1f1-ba9a-4234-8659-50295f90b468,false,true,regulate_transformers_136,6232b760-b2e0-485e-9c61-f9721a366a81,,,,false,false +82c431f7-c49a-4c2d-bc22-13da70d84e52,false,true,regulate_transformers_137,2a816043-d1d2-44a6-8a9b-f61a4933997b,,,,false,false +2410a3aa-1e38-44e7-bf39-1ccf5dd11993,false,true,regulate_transformers_138,0f3ba59d-a9ce-4669-aa12-bebec42238b7,,,,false,false +5f164f6e-5744-4466-abd7-c7f0f17f399b,false,true,regulate_transformers_139,9b889b73-c108-4b38-b6eb-3377841e0c83,,,,false,false +c46de7ea-b9b5-4734-a46b-39d3d3edde47,false,true,regulate_transformers_140,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,false,false +cbd2e11e-24fc-4601-8657-ca5b403abe39,false,true,regulate_transformers_141,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,false,false +7a256896-72c4-42b0-b6dc-bcf792662085,false,true,regulate_transformers_142,177a20fe-83b1-46df-94a3-4faa54348d10,,,,false,false +b4b30c31-25a7-4676-9422-e536ab638ce0,false,true,regulate_transformers_143,012c9eee-86c2-494c-adcc-bbfc481e4a46,,,,false,false +7aa80fd8-b9f2-446d-818c-3ff0e31e378f,false,true,regulate_transformers_144,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,false,false +63013b94-1300-4a19-b55d-df71ddd61665,false,true,regulate_transformers_145,dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,false,false +f2a5230f-6bf0-4378-9436-f398fa540c35,false,true,regulate_transformers_146,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,,,,false,false +a1e95346-4482-4987-8794-b808c5c0ca40,false,true,regulate_transformers_147,3d81adf5-73d1-4708-b03b-3afc7db017f4,,,,false,false +1d7dc2a9-8e66-4a7b-8f97-9a5ba374b08b,false,true,regulate_transformers_148,e80aa2db-f32c-410d-96a1-a32e03222568,,,,false,false +c1bea365-82ad-42fc-b0a0-a214ed3075c2,false,true,regulate_transformers_149,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,,,,false,false +ce8939f6-b3db-4279-8f72-3ea030419c36,false,true,regulate_transformers_150,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,,,,false,false +4f4f439f-7508-4a06-97fc-f396a740b2a4,false,true,regulate_transformers_151,4f28e734-5148-4caf-ac64-270231740cbf,,,,false,false +61eb12a7-b5c6-49f8-bb0c-710267d7de31,false,true,regulate_transformers_152,625bdd2c-a75f-46ef-850c-ca4704d56e55,,,,false,false +28ba14c0-973a-4915-9b27-b91c8cba88ce,false,true,regulate_transformers_153,9f95c733-71e2-4bf0-a27a-70144518ea2c,,,,false,false +21e66d24-07be-4bd1-9650-f34a7e246934,false,true,regulate_transformers_154,52e15712-2572-442a-b22c-add48af95115,,,,false,false +168605df-08b7-46f6-9535-57042b317a7f,false,true,regulate_transformers_155,4258f215-5b22-446f-a260-e8cdaa7c95d1,,,,false,false +b44fc798-84b4-4eff-a0a4-9c8bd6ba42dd,false,true,regulate_transformers_156,032768b4-2426-4abf-806b-83813ac5137a,,,,false,false +61958d64-1c6a-4393-baef-d8f780221a06,false,true,regulate_transformers_157,0db6e581-37e9-4254-aed8-d5cdf66819f9,,,,false,false +4407b9fd-dcb2-4029-897d-098096913e53,false,true,regulate_transformers_158,7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,false,false +2cc3b9e9-3f7d-4a08-8f06-0e2ddcb65b46,false,true,regulate_transformers_159,b5548457-5923-4d52-b3c9-fdb75a1df98e,,,,false,false +76f8692d-38fc-45c3-906b-c63cb35a8b64,false,true,regulate_transformers_160,df8df8d2-3494-4da9-8d1b-f913d15f520f,,,,false,false +ab4ce2f7-0f2c-4233-876d-4f023d99d61c,false,true,regulate_transformers_161,22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,false,false +143793c8-01eb-4936-88a5-a2a1b3b2c7b6,false,true,regulate_transformers_162,5af425fa-6ed7-43e1-8898-7af1315128c5,,,,false,false +43139d5b-1ced-48d6-af24-94df5ca57ebb,false,true,regulate_transformers_163,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,,,,false,false +e8f21255-094b-402d-a0a9-ba3a004f0157,false,true,regulate_transformers_164,922a6375-b97c-412e-a6c9-b0ea55a23f76,,,,false,false +2caf5fdf-2b26-408c-a26a-a0f4b133d723,false,true,regulate_transformers_165,011e3794-3341-4376-839c-3f5a452e15ab,,,,false,false +03db556f-0996-4755-9c17-225bc193a2d0,false,true,regulate_transformers_166,666757e2-292e-473c-ac9c-04c0786574bc,,,,false,false +ad8fe901-76db-4e7c-9bbb-73291439acf5,false,true,regulate_transformers_167,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,,,,false,false +4d2dac3e-3fda-4fea-a52c-4e481042517e,false,true,regulate_transformers_168,39112046-8953-4e73-a5d9-6a8183a77436,,,,false,false +90dbeebf-da14-4086-9b55-e0c06b985c4f,false,true,regulate_transformers_169,04f29760-9e52-4943-8563-62e1fbd5ed52,,,,false,false +fff27c18-a5e8-4950-b0ff-e4f445671845,false,true,regulate_transformers_170,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,,,,false,false +2d228c9c-76e6-44c2-9ac4-e64f85e15a42,false,true,regulate_transformers_171,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,false,false +e43fd0c7-b475-418e-a4c2-1f28b942953c,false,true,regulate_transformers_172,69efeb2d-9845-49ac-8500-5e017a7a64ef,,,,false,false +4f8eb822-a329-4ab9-a80b-934329ec22a0,false,true,regulate_transformers_173,09ac8949-2b79-41d7-b56f-a58f20036df2,,,,false,false +98695523-6258-452b-837d-648ab9f9b8c8,false,true,regulate_transformers_174,5071dd8c-bbc1-4c8d-a180-4492f80e183d,,,,false,false +bba62ba4-4f15-4065-880f-4bc81be75854,false,true,regulate_transformers_175,49b511fa-8cff-45f4-9a59-54faaaf90abf,,,,false,false +538b55b8-721c-473a-9ff1-a0c5941af71c,false,true,regulate_transformers_176,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,,,,false,false +d7819a9a-118e-43fe-8f1e-6aaa1feca139,false,true,regulate_transformers_177,f1e55c8b-357f-45a7-9d57-e299f9b207f3,,,,false,false +41c336b5-a58b-4b67-ac56-380e59b6be5b,false,true,regulate_transformers_178,00d4a837-f09c-41df-bed1-dfdb78387116,,,,false,false +bf394381-79da-4b9f-ac19-7afab4595c5d,false,true,regulate_transformers_179,32507a10-1eed-4a3f-820c-bc187f3b052e,,,,false,false +b0da0363-e6d7-47b6-b968-2b5119346f36,false,true,regulate_transformers_180,eb21d716-1b54-4dba-bdc2-d1f6752aef85,,,,false,false +19e52c75-8dd5-457e-901e-69bb128b4a6e,false,true,regulate_transformers_181,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,false,false +87eadfed-e098-4559-9c00-3190832b6374,false,true,regulate_transformers_182,773aebe4-fc03-46be-8209-0213e2760a8e,,,,false,false +fba158e0-29b5-4429-8d0f-8bb467bea5b1,false,true,regulate_transformers_183,f26b5511-3c50-42d5-97c2-be408330eb84,,,,false,false +c74609bf-c070-4e5a-98bd-0c0acdc2e4fe,false,true,regulate_transformers_184,285a4caa-2da8-4bd2-8a60-7d04f168f378,,,,false,false +adc1aad7-84ad-4770-8db2-70c63ef5dbf3,false,true,regulate_transformers_185,c5457e35-ad81-4427-9d3a-99e4c44ccae8,,,,false,false +e44759a5-8da8-48f0-bec7-1236403307b9,false,true,regulate_transformers_186,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,,,,false,false +1b475922-4d80-45dc-bde5-b47a481c78bc,false,true,regulate_transformers_187,8f80e777-ccbd-4630-b10e-238e824113fd,,,,false,false +7848c8d2-2866-4820-8faf-0740f7b3beab,false,true,regulate_transformers_188,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,,,,false,false +96ddb0c2-a2a8-4691-ae52-1aa1d23438e6,false,true,regulate_transformers_189,c5af5a34-211a-4105-a8e1-f447140073c6,,,,false,false +abf7ee46-a259-4df9-851e-cc519026d38a,false,true,regulate_transformers_190,cbcfc3b6-ac90-4215-975c-a033f5cf9912,,,,false,false +de0c0cc7-4de4-42e8-91b3-fe990134c6e7,false,true,regulate_transformers_191,3bc8235b-03b5-489b-81a2-58d520fbe28e,,,,false,false +a83bdabc-bf82-4f68-9d96-b876218cc407,false,true,regulate_transformers_192,890f2162-b4cb-49e7-a16f-4b552c5e245c,,,,false,false +31d320ef-0ed4-488d-81c4-c590d03f0dff,false,true,regulate_transformers_193,c317a6cd-428b-4c36-8233-91d0c4e2717a,,,,false,false +a0e99231-f252-4cdf-bda2-c53fbe4bdfda,false,true,regulate_transformers_194,366a70fb-8d7f-4201-9eca-0fcbc839239d,,,,false,false +67c7dd24-1e9a-4d25-a4e6-96548a50f53b,false,true,regulate_transformers_195,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,,,,false,false +2f64a8c2-57f3-4156-ad0d-19c8492a0050,false,true,regulate_transformers_196,792b505c-87ab-4665-a31d-b6035c5ece70,,,,false,false +64daf3dc-4714-4aa4-bb67-55cfb1b5ca73,false,true,regulate_transformers_197,33f29587-f63e-45b7-960b-037bda37a3cb,,,,false,false +386f225c-b8ef-46e6-980c-6d7228442808,false,true,regulate_transformers_198,3802b603-d08d-4031-b7d7-e29734bcc122,,,,false,false +4fc2d6f9-9823-4e0a-8161-6158f5533f4d,false,true,regulate_transformers_199,b22c9299-5fb4-46a7-b566-fc17e0d51d60,,,,false,false +6d2fe65b-95b7-4767-8264-3fa25cc139f6,false,true,regulate_transformers_200,b179c38b-5af0-4304-84b1-1dc03314fd80,,,,false,false +e96678f2-1fc8-48e3-b711-f9c32fbe3d4f,false,true,regulate_transformers_201,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,false,false +74fa5103-0fef-4ad7-9ba6-d6ec255b8662,false,true,regulate_transformers_202,904c7476-5f16-4ec2-9138-7d5e32d38a3b,,,,false,false +2b84f8fb-9693-45fd-90ba-a644061fbafc,false,true,regulate_transformers_203,416fa5eb-2f72-46c3-978f-6a0ebb714a40,,,,false,false +25fb109f-55b5-4d72-acc7-29023f51e695,false,true,regulate_transformers_204,6dcdc87b-a719-416f-9da1-21a701048f3a,,,,false,false +08aeb5c3-966e-47fc-b14e-52774e69fcb8,false,true,regulate_transformers_205,857c264a-7072-4bb7-af56-2f01539b2a2e,,,,false,false +559ed9dd-3637-4f6d-b6f7-1af7af696784,false,true,regulate_transformers_206,d82fae59-844a-4c85-997e-326dd876137c,,,,false,false +34e491cc-2bad-4c91-ac1b-3a35e9d96720,false,true,regulate_transformers_207,39dbc5ed-d874-48a8-9128-e970436a94b4,,,,false,false +9802753d-062a-4b6e-8de7-e5fe7b123870,false,true,regulate_transformers_208,9d10a92f-576d-4777-99ff-59d145924fea,,,,false,false +e0ac0b90-c970-41fc-bbee-3f2934314373,false,true,regulate_transformers_209,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,,,,false,false +55d6627a-69e9-4f87-981a-335a6810a3ff,false,true,regulate_transformers_210,fd3b7bb8-3976-4441-9211-745243afd80f,,,,false,false +ae9dc47d-d3e3-404a-a128-15fd69200357,false,true,regulate_transformers_211,67c1746c-3af8-403f-983e-1c7c047383df,,,,false,false +101440d9-44ec-4f54-87c2-01739d1819c0,false,true,regulate_transformers_212,ead38a50-b8f7-4bbb-b65d-f54350825e8e,,,,false,false +6a1829f2-f9ee-43b1-a9a3-d61d20976dbe,false,true,regulate_transformers_213,ff947647-b551-41ae-bcfd-6af228250c96,,,,false,false +d6686041-182c-460f-bffd-7471523732e2,false,true,regulate_transformers_214,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,,,,false,false +70605687-5655-44df-accb-7e070fc94958,false,true,regulate_transformers_215,9b509c7d-4647-40fd-b03e-7ab919215cc6,,,,false,false +c4a2e8d2-fe14-4f45-a72e-3e1293ae6a90,false,true,regulate_transformers_216,535843a3-cf93-412f-b4d7-585337791ba8,,,,false,false +7bad376d-44fd-40e0-92fd-e2bc1be63384,false,true,regulate_transformers_217,369cffa5-bcee-4489-8193-1d9b10230eca,,,,false,false +d7001bc1-3bde-4bd4-bdda-36225b3793db,false,true,regulate_transformers_218,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,,,,false,false +6b7055bc-6daa-4c57-b74d-6beb5cb2f08f,false,true,regulate_transformers_219,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,,,,false,false +7873c2ea-9478-468e-9ff3-0244983f9a5d,false,true,regulate_transformers_220,b425b28e-48a8-4ec4-a15a-387fcfb79895,,,,false,false +d30f0801-baf4-4266-b248-f922e141bf23,false,true,regulate_transformers_221,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,false,false +9eebac95-db38-4e2e-9976-2d00fefd9f6f,false,true,regulate_transformers_222,67af7db0-0fd8-4657-bb4f-43a2141b9f73,,,,false,false +77f8104c-d4ac-4ece-b697-63b6e9736a07,false,true,regulate_transformers_223,0c266541-6235-4d01-8258-e763c58af6c7,,,,false,false +2707e81a-6d6e-46eb-9555-d54691ea438c,false,true,regulate_transformers_224,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,false,false +651681d9-b509-4be9-873e-c926d3d26863,false,true,regulate_transformers_225,d40a1a85-40f2-4ad3-ba58-720d5ba02268,,,,false,false +58c4e7bb-0755-434a-bdbf-9062fae8ddee,false,true,regulate_transformers_226,450426ac-a560-4d17-b1fc-9e169530a655,,,,false,false +4ebd7b4e-072d-4f0f-a70a-84e415256e77,false,true,regulate_transformers_227,5e213f42-d93e-45c5-a295-adbe09105746,,,,false,false +1c7c1e89-47cf-4379-a0f7-a50693f08061,false,true,regulate_transformers_228,205fcee1-928c-4374-950c-34575f07fa49,,,,false,false +bdcf677d-0077-4cbf-b164-bf4e080e2c1c,false,true,regulate_transformers_229,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,false,false +923f2d69-3093-4198-86e4-13d2d1c220f8,false,true,regulate_transformers_230,31a2b9bf-e785-4475-aa44-1c34646e8c79,,,,false,false +5dbd05be-90f0-4b9e-b919-a6aefe03e17b,false,true,regulate_transformers_231,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,false,false +dec72781-e950-40e4-ad1a-500dd529a888,false,true,regulate_transformers_232,535b3fa4-ed67-4ab1-9a68-e7db83e05967,,,,false,false +3836660f-f198-436d-a746-1fcf7438e22d,false,true,regulate_transformers_233,00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,false,false +1eca3f1a-3cca-4486-89c5-879ccbff465a,false,true,regulate_transformers_234,2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,false,false +435f9ee7-09fe-478a-88e8-d5a1e28b5f39,false,true,regulate_transformers_235,92cb5065-2e57-4099-8e29-75cbc0c80370,,,,false,false +f01c279b-e1c9-44dd-a1ca-39561765f360,false,true,regulate_transformers_236,174fb4b2-4f9e-415c-bfee-d850ef751307,,,,false,false +adb1c67d-56e6-4860-9e39-b427af5ae617,false,true,regulate_transformers_237,41c0087f-ce27-4da3-97d2-92d711b639b4,,,,false,false +d7f1a826-c63d-43fc-9665-b7b35f4cfc60,false,true,regulate_transformers_238,3da4fd3d-ac5e-409d-91fa-36516673cf57,,,,false,false +ef252d44-269d-450d-b950-1a9583f707f8,false,true,regulate_transformers_239,40537c84-c812-4231-bd23-0ba81922e937,,,,false,false +016fb667-9ad7-490a-b338-032ab4b1b61f,false,true,regulate_transformers_240,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,false,false +76abc81c-c5fc-4376-b57a-6e42f33c1df5,false,true,regulate_transformers_241,2c520ab6-507e-4dcf-ab05-8f238e9b9385,,,,false,false +e194e458-39f2-4c2d-ad50-017817b2ec90,false,true,regulate_transformers_242,2f64bf67-cee9-44bb-8c13-ff96878932af,,,,false,false +29415047-fba9-400a-b110-a8e256de127f,false,true,regulate_transformers_243,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,false,false +376e15ac-fa1c-40d6-ba7c-9378dc6998f3,false,true,regulate_transformers_244,4a6f6058-e654-464d-9367-2dca7185c6d7,,,,false,false +9e549506-320c-46d7-913d-57e915b7a030,false,true,regulate_transformers_245,ae234bc5-b751-41f2-95ee-b78de124c583,,,,false,false +56dea707-5a90-45d1-89c0-928e63d804da,false,true,regulate_transformers_246,3b879239-20c8-4adf-bd51-92924327ee71,,,,false,false +c73760de-117a-436d-a700-578911806184,false,true,regulate_transformers_247,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,,,,false,false +999a25c8-c7c5-4974-9878-87e21a26509f,false,true,regulate_transformers_248,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,false,false +58795c71-6a49-42b3-a35d-9bed906fa7a3,false,true,regulate_transformers_249,636dec7c-4242-46e8-b7ae-db7e5a28c39c,,,,false,false +958afd26-72a1-4015-a4d4-d3da376a3ce2,false,true,regulate_transformers_250,970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,false,false +107416b3-3708-43fc-bdc4-dfa1e508d6b8,false,true,regulate_transformers_251,1dee13af-e638-4858-9c69-0069190cd577,,,,false,false +0ac270da-16cf-48c9-b114-f2b6174e7c8f,false,true,regulate_transformers_252,de5ee252-ebb6-42b0-875c-77ae557ffbf6,,,,false,false +df9be774-fd48-49eb-8011-3f436d86451b,false,true,regulate_transformers_253,e05c68b1-11cd-43fd-a4b2-31e4db380c78,,,,false,false +4acb33fe-2960-4974-8448-c40f98606f35,false,true,regulate_transformers_254,1ee9de9a-0095-4b58-beeb-e56fb908844a,,,,false,false +f66bda67-ecd3-4380-b631-d9673de623c5,false,true,regulate_transformers_255,9ce9d92c-5583-4b16-bec6-9f67834663cb,,,,false,false +ddb09433-1cf8-4294-bdf2-a3fd74c3d7e0,false,true,regulate_transformers_256,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,,,,false,false +89f53805-810d-4c3b-9697-5bf56f3997f9,false,true,regulate_transformers_257,a7ebd30b-b843-405f-9fae-ca6b489601f9,,,,false,false +eb878b9a-41ed-4077-a39b-e8e8dad68528,false,true,regulate_transformers_258,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,,,,false,false +fabad8e5-31b5-4595-8dd9-f682154c1308,false,true,regulate_transformers_259,f6a31362-8b0d-4926-b0d0-10bb61db20df,,,,false,false +f252836a-4cbe-464d-8943-e5709e4fb32f,false,true,regulate_transformers_260,7125de08-1d28-409a-8b23-023a0294def5,,,,false,false +6fec7147-dfe5-406b-8c1c-9c86df3ce5f8,false,true,regulate_transformers_261,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,,,,false,false +867993b3-4106-4ebd-bb63-96e7b1e2b4ce,false,true,regulate_transformers_262,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,,,,false,false +e5cf9e99-b2d3-4587-8846-fba4cf5d27b8,false,true,regulate_transformers_263,4303784e-7193-454a-9be4-3591400b4eeb,,,,false,false +44ffe2cf-b23b-417c-b3db-9b62020e9e0c,false,true,regulate_transformers_264,75f2dfb9-75a0-496d-9c44-79e7df54c1df,,,,false,false +80c61f4a-d979-45c2-a61a-99fe4bd5269d,false,true,regulate_transformers_265,270c7266-45dc-4e45-829f-c04f6b631cad,,,,false,false +07228d6d-2bed-43a1-9e63-f67e47fef0e9,false,true,regulate_transformers_266,ffcaf979-d707-4d25-8f46-f436f9792d7f,,,,false,false +a715c2af-7f78-4b29-a55e-d3de02221a3c,false,true,regulate_transformers_267,92301422-94ae-48ab-89c7-a69eea9450b2,,,,false,false +2fca54c5-687f-4f22-9fa5-0eb368c922c7,false,true,regulate_transformers_268,9d7038e9-5bcc-4676-bead-46c4f1291ba8,,,,false,false +44f8915c-8c14-4900-b468-b7a77a6485f9,false,true,regulate_transformers_269,fd534474-cd65-47aa-8005-dc50d17d6920,,,,false,false +1e8e57d3-ab9c-4498-8b33-edf2fbf1cc9b,false,true,regulate_transformers_270,d8c35123-b389-4199-84f9-d417d24bb78d,,,,false,false +6fce766f-5bb4-4d5f-8b2b-8b451c7e04d2,false,true,regulate_transformers_271,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,,,,false,false +085b84bc-3132-4c6c-a2d8-7969f7e5d1fe,false,true,regulate_transformers_272,86af5351-87ef-49c6-bd17-673dceecee5b,,,,false,false +cd51000f-ae27-4110-969b-f4f56c629a19,false,true,regulate_transformers_273,55b3d03f-2204-4ab3-84cc-a28476868c9d,,,,false,false +2b306214-3b46-46bf-b523-c0c9bc6fc4fd,false,true,regulate_transformers_274,b46d4395-6724-4830-ba55-357e81fc2814,,,,false,false +c687695d-a2e1-4556-867f-d8ea1749ed0e,false,true,regulate_transformers_275,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,,,,false,false +0b3d6a9f-7ddf-4dc1-96a3-5265c66e9401,false,true,regulate_transformers_276,5862f526-783a-4218-a463-3cbf5de8dade,,,,false,false +3f619f96-5b98-4787-8293-5f3880ff9bce,false,true,regulate_transformers_277,b8fa1f73-223c-4b08-a140-44f12484cce3,,,,false,false +5cedd965-43a3-4331-89d9-cdc1f31ad6b7,false,true,regulate_transformers_278,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,,,,false,false +6d87e69c-c914-4611-82a3-ae1ae3c11cd4,false,true,regulate_transformers_279,e018b95e-fca5-40f7-8550-b05a619169dc,,,,false,false +0ea53d4d-370c-4e33-b568-5131c0c5fcf9,false,true,regulate_transformers_280,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,,,,false,false +9a71fbdd-b20f-4a95-83fc-c0188de60f6c,false,true,regulate_transformers_281,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,,,,false,false +4e19f276-13c1-4c7e-868b-9251917b8687,false,true,regulate_transformers_282,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,,,,false,false +468eed00-b560-460d-bb98-078355afd3f1,false,true,regulate_transformers_283,81cd3f38-867b-4a71-ba22-cb33834e0e58,,,,false,false +06ad2cb3-4264-4eb6-84c1-330c3ef9f438,false,true,regulate_transformers_284,e3c3c6a3-c383-4dbb-9b3f-a14125615386,,,,false,false +b8cf30b6-093e-4f23-a87d-531a03e6960f,false,true,regulate_transformers_285,f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,false,false +1c2669ca-4dd5-4144-bb73-f3cef3452284,false,true,regulate_transformers_286,810bebb0-0d5c-4899-b213-3207be661248,,,,false,false +cd2234fa-4aca-481a-a7ab-995a62740f05,false,true,regulate_transformers_287,bf7e7268-2fb6-4948-ace6-9037ae148fa3,,,,false,false +a160c82e-c2a6-45fd-9c93-34cff9f26d8a,false,true,regulate_transformers_288,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,,,,false,false +e1956e5e-cbab-4203-b760-bda0449a9d51,false,true,regulate_transformers_289,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,false,false +9d3c53bc-890b-44ca-bdbc-42274d6da588,false,true,regulate_transformers_290,154e9a99-467b-4f65-9928-8ebb14149baa,,,,false,false +ed91e37f-98e5-4acd-9372-c369ea722a4a,false,true,regulate_transformers_291,bd8c7d3d-e830-4a46-bf78-0086ce24909f,,,,false,false +d2ca6aed-a966-4bec-a01d-5ea0b95dcf88,false,true,regulate_transformers_292,d2aff632-fc26-4595-931c-92e266247ac8,,,,false,false +1ce30e16-517c-463f-9587-3489ebdeda96,false,true,regulate_transformers_293,1f040625-ad1d-409f-bd7e-944c4d805e46,,,,false,false +cc2c069b-e2b6-421a-b5f7-57a8ecc4e502,false,true,regulate_transformers_294,8a50fb37-81cf-47c9-8850-a12b4391e2e7,,,,false,false +09c64d71-b499-42c5-bcf5-8fdc0d8125a1,false,true,regulate_transformers_295,d53ff076-dadd-44f8-85d4-68f48991f7d0,,,,false,false +bb2c7640-f0f1-477c-bf95-881402db5d15,false,true,regulate_transformers_296,daed3552-e382-4153-95be-97f17e2c53e5,,,,false,false +21923b6b-2ef3-4422-8b6a-7ed3a3868467,false,true,regulate_transformers_297,f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,false,false +c6d58ece-f39c-4b53-b827-28b3ebb62e52,false,true,regulate_transformers_298,14ae9865-cb9b-4518-9f2a-c0fda3455a42,,,,false,false +87d6d17a-5aa3-4746-8c52-478f6e21fa50,false,true,regulate_transformers_299,49e14db3-a4bc-464a-b606-653ac8a604dd,,,,false,false diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_graphic_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_graphic_input.csv index 48513cd59..9116c7587 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_graphic_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_graphic_input.csv @@ -1,300 +1,300 @@ -"uuid","graphic_layer","node","path","point" -342e3e77-6ff5-48ce-b02d-1f9bd4bb303c,Standard,d40a1a85-40f2-4ad3-ba58-720d5ba02268,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1b58f786-a0a1-436f-98ff-0a8005e4b1cb,Standard,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.14754098],[0.11299435,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bfa159f5-ab6b-4277-ab81-30ac92ec893f,Standard,34cd8ee0-e607-4c47-89a7-121c3e32768a,"{""type"":""LineString"",""coordinates"":[[0.05084746,0.18032787],[0.08474576,0.18032787]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -2a1e5940-c981-4e19-b8b3-c9816f9b0da1,Standard,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -89d08dbb-d2f4-4248-a846-7e13aa1926e6,Standard,e4502c52-b4d7-4082-a583-b5688d8244e0,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.14754098],[0.17514124,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6b88508e-ab70-4026-ac4a-8effa4b83d2d,Standard,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -2db9a259-6929-4f7e-b1b4-e0bdb86cd09d,Standard,fa6d5184-b205-4b1b-839f-7b21ac956c29,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.04098361],[0.23728814,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +uuid,graphic_layer,node,path,point +8bb36c81-659c-42b6-8772-dbf4cdd68baa,Standard,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93220339,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +94f85ca1-6313-4083-9f67-4f352b5fee15,Standard,4a6f6058-e654-464d-9367-2dca7185c6d7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +49bff912-4ea7-4274-bae4-95bc9c12219b,Standard,1dcddd06-f41a-405b-9686-7f7942852196,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.69491525,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +52d41e1a-4ad9-4f82-ae81-ce9a6a4d0a1b,Standard,e018b95e-fca5-40f7-8550-b05a619169dc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f17d8fce-ffcf-4214-af18-af2bb64985b0,Standard,39112046-8953-4e73-a5d9-6a8183a77436,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +8910eb73-d32f-471f-a7a5-92570070be29,Standard,6dcdc87b-a719-416f-9da1-21a701048f3a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0dde18db-3ec4-4941-b84c-231452a1f23b,Standard,e2267696-669b-48e8-b43a-37d0db95011d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +7e19bbb7-52c2-4f80-97c2-d5bea34b15d5,Standard,867c4b4d-0f38-4f28-82ce-135f2cc63808,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0720eaa7-85a2-48f0-a2dc-081c818d2ab3,Standard,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5b899ffc-48b1-4ffd-bb7c-dfe2d727bbb0,Standard,ee384ace-040e-4f21-8a8a-d702ab51af55,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.07377049],[0.23728814,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" ed4ad694-299d-4c79-bb31-3d7f9f6013db,Standard,9d7038e9-5bcc-4676-bead-46c4f1291ba8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0e676643-d3c8-46f8-836c-0ef21bda69ce,Standard,a286f73a-20ee-4056-8129-c7963b34ecd9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5a1daa68-a04c-4b27-b2a2-62a53da0b9ff,Standard,926d6113-933f-49e3-9529-a3035acdc9b2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ed32fd63-b9cd-4bdc-9301-51c7e83cf88a,Standard,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61581921,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -7bf5033d-efa1-4b45-b885-4c22ede1336d,Standard,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -80ee9fdd-b0c4-42e2-835d-abcb120e323d,Standard,9f95c733-71e2-4bf0-a27a-70144518ea2c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -28a9c06f-b6e3-4104-b904-aad99b88fcab,Standard,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71186441,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1f91737b-2808-4986-839c-4d8238dbbb35,Standard,60173008-809d-4d8f-b06a-3c4a838dd989,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.47540984],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -94684e7b-92e8-4976-8c16-4a4c80a0a027,Standard,1a8ba1a5-3cee-4791-b21b-f17b08526873,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.2295082],[0.11299435,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -bd82b2de-920f-4332-a93c-a7b0b4285910,Standard,bb59ca46-1f2e-41c9-9723-90b306f043cd,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.2295082],[0.17514124,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -9be737eb-c6f9-4b03-8dab-55e43dc6ecc6,Standard,a7ebd30b-b843-405f-9fae-ca6b489601f9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3df7db14-eec4-45ba-93df-fb179ede15ef,Standard,dd9d4153-c56f-4457-ad5e-46a48d4486b6,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +8e1c4db3-dfd2-4522-8478-7b760ddeb35d,Standard,b8fa1f73-223c-4b08-a140-44f12484cce3,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +00e6a38a-f4f0-4cd8-a182-3c3c2337571e,Standard,9f7599de-c488-46c5-b053-1279a511f7b9,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +682dc5b8-6d22-4127-a456-d750f8a1c10d,Standard,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ceb5394a-78c5-4f94-a4dc-ad051fedfa17,Standard,032768b4-2426-4abf-806b-83813ac5137a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +70e6914f-0cad-4319-9ae3-7cd5482152ea,Standard,e25387d0-ab9a-406d-bcb4-555414b88b1b,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +08d4e2ec-8532-4327-9d9d-aa51393d53e8,Standard,31a2b9bf-e785-4475-aa44-1c34646e8c79,"{""type"":""LineString"",""coordinates"":[[0.03389831,0.27868852],[0.06779661,0.27868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +56191c65-c5b3-474c-bed2-291c8104fdf7,Standard,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63841808,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +d135cd38-118a-4c91-8435-6e72518d444a,Standard,9b509c7d-4647-40fd-b03e-7ab919215cc6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71751412,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f3fec03e-9f9f-4446-8be2-83a9b518ae3b,Standard,52e15712-2572-442a-b22c-add48af95115,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0103c715-ad75-42c6-a64f-f17fe46280e2,Standard,1bf26b4d-03cc-4490-8c33-d3db8597d807,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.69491525,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 7eb3ff43-5237-4a87-8a83-05e6fab5f6e5,Standard,2aa2d409-8bb2-477d-ac7a-6439552e136a,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1e9fb4ca-4c4b-43d5-85c9-85eeb238315b,Standard,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -68480188-a299-4ad7-8451-54dd092ffdc9,Standard,df97c0d1-379b-417a-a473-8e7fe37da99d,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.04098361],[0.11299435,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -84387c6a-225a-44c5-be9c-bd19573fa19a,Standard,f6a31362-8b0d-4926-b0d0-10bb61db20df,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e6260eb6-1993-4b2f-9da4-6ac480f41954,Standard,792b505c-87ab-4665-a31d-b6035c5ece70,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b25beaf6-0637-43a3-b226-ed4c032009b4,Standard,285a4caa-2da8-4bd2-8a60-7d04f168f378,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.95480226,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6c94d627-6100-4aec-9a3e-6e04edf1d2fc,Standard,69efeb2d-9845-49ac-8500-5e017a7a64ef,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94915254,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +cd072bd5-77ed-4708-8b42-41123054a4a0,Standard,6a4547a8-630b-46e4-8144-9cd649e67c07,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +28a9c06f-b6e3-4104-b904-aad99b88fcab,Standard,ce513b50-b57a-41e2-b744-4c0fd2ae97d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71186441,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b73cff24-aa97-493e-9da3-8aa3ad414215,Standard,99e26ef8-75e2-46f3-aafc-6287bf5e3905,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +875f82ba-ccb5-4514-8046-658e6629091f,Standard,c6c177b0-5004-4db0-8cde-6293330a4757,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68926554,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6d79e6bf-0fd6-47cf-84e1-af8c355a09c8,Standard,773aebe4-fc03-46be-8209-0213e2760a8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70056497,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +166a98e8-88a8-4507-a473-5c27d334477d,Standard,5981fe65-3c92-4a78-af92-1461904046d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.95480226,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6e15708d-00b1-46c0-9e80-52ddcc89bc61,Standard,80d8252b-045f-471a-9638-416ed3f86120,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +189e6f29-116f-4087-8cdc-9303cbb41e89,Standard,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +95d6c85f-bb3b-4bac-84fc-1a821ac0256f,Standard,ff947647-b551-41ae-bcfd-6af228250c96,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +645190a6-cd64-4488-abb5-c6390445cbef,Standard,f1e55c8b-357f-45a7-9d57-e299f9b207f3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" d5ba0437-9666-4c88-a1cc-4a983e9d7d9d,Standard,49b511fa-8cff-45f4-9a59-54faaaf90abf,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5c590022-3662-4882-9a3d-e39d618b00ad,Standard,33f29587-f63e-45b7-960b-037bda37a3cb,"{""type"":""LineString"",""coordinates"":[[0.21468927,0.07377049],[0.24858757,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0720eaa7-85a2-48f0-a2dc-081c818d2ab3,Standard,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c67ff8a5-d296-47db-970a-4f6b2ab7c77a,Standard,d53ff076-dadd-44f8-85d4-68f48991f7d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -fcfe053f-d8ce-407e-99d5-b0b480a3abb1,Standard,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68361582,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dc081e8a-4fe0-4bf1-b215-67e1454eae93,Standard,543f7e9f-b9be-486b-b365-2bae79010758,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.98360656],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -821614b3-c5ea-41b3-87a6-6090c26d97ff,Standard,3bc8235b-03b5-489b-81a2-58d520fbe28e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4d9cd1b8-f525-48eb-b280-2271ed073d67,Standard,5f1c776c-6935-40f7-ba9e-60646e08992b,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.1147541],[0.11299435,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a485471a-ad4f-4ca8-b960-ebf1a5504fd4,Standard,b3a7431d-89b0-41cb-87a9-5853890796cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a158cd0e-50bd-40d1-9d23-17c0ff9bb08c,Standard,1dee13af-e638-4858-9c69-0069190cd577,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -69232745-5bf2-45c1-b3a3-8d7ebbe08558,Standard,1396cb4c-cee7-4116-97c9-290f98785719,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.1147541],[0.03954802,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fed5e0ee-a4ad-488a-beb2-b2a70465eb56,Standard,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,"{""type"":""LineString"",""coordinates"":[[0.03389831,0.78688525],[0.06779661,0.78688525]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +41c1aa80-2d8b-4993-a943-eeb328d67532,Standard,450426ac-a560-4d17-b1fc-9e169530a655,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +05a66108-a122-4dbf-bbd9-c57a3904df7e,Standard,e3c3c6a3-c383-4dbb-9b3f-a14125615386,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +abafb627-a899-43cc-bc4e-e6a574da9f1a,Standard,ae234bc5-b751-41f2-95ee-b78de124c583,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +96fb5883-b7dd-4646-8bf9-e6e6d730f5bb,Standard,1ee9de9a-0095-4b58-beeb-e56fb908844a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66666667,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +8a1d7137-26e1-478e-a16c-2b4df1c762c1,Standard,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9031d2ef-01e7-4e1c-a880-ea3ee9102493,Standard,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1b58f786-a0a1-436f-98ff-0a8005e4b1cb,Standard,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.14754098],[0.11299435,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +dc7ac151-f28c-4709-b760-01f0bfea1422,Standard,5e213f42-d93e-45c5-a295-adbe09105746,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +dc4124c6-ee52-40d9-81d6-c5832a5c1fba,Standard,f26b5511-3c50-42d5-97c2-be408330eb84,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +97e202d5-561b-418b-8b53-fa080e7cb931,Standard,21359dd1-7a23-4932-b656-c196fbffe751,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1730aedc-aec2-4f82-bc90-2c821b470e0c,Standard,f1e88392-3b2a-4ce8-a31f-c963f08f8043,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +fd99eb90-1a76-4b0b-a7b4-294f4bf6a4f7,Standard,519ace7e-fd3f-4797-b14b-36c1694b00cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +da7db7bf-0857-4f45-8abd-426f62aed003,Standard,b22c9299-5fb4-46a7-b566-fc17e0d51d60,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.04098361],[0.03954802,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +5ea15b76-2059-405d-a030-b8bf6b7d4f06,Standard,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96610169,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +cc657d07-3495-45b8-a90b-76769e14f2d8,Standard,8a50fb37-81cf-47c9-8850-a12b4391e2e7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +65acfa71-ccb9-4c73-8869-d24e740f3652,Standard,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f6580db8-09e2-48fa-b605-fe25866616b1,Standard,c72a08bc-4685-49b1-b8ef-803aebc8c388,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.65536723,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 74b3a575-3f22-4673-a89c-1199c06a2d0f,Standard,b37ea333-65e1-4211-8449-993b67e8e0e2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9ed48993-1a92-453a-ba31-11eb00021025,Standard,14a8dc4c-0906-402f-b073-6d6d4725d0cb,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.0],[0.11299435,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -69658801-7a8c-48b6-809d-3fd07892a5ec,Standard,119d270a-ff22-4fdb-8214-cb5b336790bf,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -2747953c-f646-407d-978c-1318659a63be,Standard,174fb4b2-4f9e-415c-bfee-d850ef751307,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.18852459],[0.23728814,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e80cc517-0a6c-47f2-a7a7-298f49dc353d,Standard,dc022eec-16b0-4a64-a2f5-498d81aca71e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68361582,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0dde18db-3ec4-4941-b84c-231452a1f23b,Standard,e2267696-669b-48e8-b43a-37d0db95011d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dbcab492-c97f-4a09-be52-5cf03bfd8490,Standard,eb95ff15-56db-4463-bb54-0ee131167812,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ed286ef7-6402-4264-9803-72e3ee03a9cf,Standard,4f2402e8-664a-40f2-970a-abc098a2a0d1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63841808,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f7e1e922-52d3-469f-98c6-5353a5d74641,Standard,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e7ce727f-dc6c-4c81-ab20-ef6d5b0c247c,Standard,fd534474-cd65-47aa-8005-dc50d17d6920,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -31c566a5-37ba-4520-aec3-add6044fbfa5,Standard,c5af5a34-211a-4105-a8e1-f447140073c6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c1b96bd6-563f-4f4d-b401-1955e29d7ced,Standard,857c264a-7072-4bb7-af56-2f01539b2a2e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cf142631-94bf-4d25-adaa-387714e975c8,Standard,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dfe18a4b-8980-40fc-9a77-69a6b5da930d,Standard,01bdd8b2-145f-42b3-80e3-a2366dea1044,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0c859327-e893-424f-bbb2-46d077b0c6f6,Standard,416fa5eb-2f72-46c3-978f-6a0ebb714a40,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9cc54a0e-640d-4d9b-a163-8dedb0bbd7f3,Standard,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e9266e59-ed7d-4719-abe6-455193c4f5f3,Standard,810bebb0-0d5c-4899-b213-3207be661248,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 865f965a-f8d1-49cc-a85e-92f59a4ecb01,Standard,40537c84-c812-4231-bd23-0ba81922e937,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -56271174-1da2-4402-9026-82e3111186a0,Standard,b7baa286-cbe2-4143-a08f-4e025af47529,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5a54c5de-9afe-4ea1-af36-2bca268deed2,Standard,00d03670-7833-47ee-ad52-04d18d1c64fd,"{""type"":""LineString"",""coordinates"":[[0.10734463,0.1557377],[0.14124294,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -d33bcbd4-0616-44f2-bf6f-9650acdd4193,Standard,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.64971751,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -96ce5cd6-78b0-41d6-878d-4c6e59f27ffe,Standard,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.1147541],[0.17514124,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +a485471a-ad4f-4ca8-b960-ebf1a5504fd4,Standard,b3a7431d-89b0-41cb-87a9-5853890796cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +dbe14dc1-88ac-4a06-8159-8ef2928e1f84,Standard,154e9a99-467b-4f65-9928-8ebb14149baa,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61016949,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 5eb4b7b9-ca34-49ec-a7ba-39e54df125c5,Standard,c81d6099-66b2-45d8-b8a4-c19ceb862f6e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84180791,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -7016009b-c704-4bdc-a331-19bc6ac99ae2,Standard,0ebf0088-f596-4cd1-9ae0-5da02dc40335,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ce92f503-5384-4c3b-b86e-4776d7b99159,Standard,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.67231638,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -35e6b00e-3441-4c99-a159-ab750d201ec8,Standard,de756ddb-793d-4b2d-959c-59d938a8f61f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -7e19bbb7-52c2-4f80-97c2-d5bea34b15d5,Standard,867c4b4d-0f38-4f28-82ce-135f2cc63808,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -86a5a43b-025c-4bb5-b9c3-bf88e610617c,Standard,0170837a-1876-45f9-a613-666f9991964d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cd072bd5-77ed-4708-8b42-41123054a4a0,Standard,6a4547a8-630b-46e4-8144-9cd649e67c07,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -6717f8a4-7670-42cd-bc5e-cdc86cba04ca,Standard,e80aa2db-f32c-410d-96a1-a32e03222568,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3179b868-7036-4f0e-abe8-8c97a7ec9e27,Standard,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -95d6c85f-bb3b-4bac-84fc-1a821ac0256f,Standard,ff947647-b551-41ae-bcfd-6af228250c96,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a6267f4c-d751-4f99-ade6-237d737fb745,Standard,86af5351-87ef-49c6-bd17-673dceecee5b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6779661,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5cb93639-bc3a-4e87-bd02-1d8e16680219,Standard,e05c68b1-11cd-43fd-a4b2-31e4db380c78,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b25beaf6-0637-43a3-b226-ed4c032009b4,Standard,285a4caa-2da8-4bd2-8a60-7d04f168f378,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.95480226,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -682dc5b8-6d22-4127-a456-d750f8a1c10d,Standard,bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -af28cad4-4552-4974-97f8-31396b30409e,Standard,85ea3976-1779-4d46-bd6f-dfd36427ebdf,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.14754098],[0.23728814,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bfa159f5-ab6b-4277-ab81-30ac92ec893f,Standard,34cd8ee0-e607-4c47-89a7-121c3e32768a,"{""type"":""LineString"",""coordinates"":[[0.05084746,0.18032787],[0.08474576,0.18032787]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +dbcab492-c97f-4a09-be52-5cf03bfd8490,Standard,eb95ff15-56db-4463-bb54-0ee131167812,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1c859190-f5ef-407e-b792-eabaa2472408,Standard,9ce9d92c-5583-4b16-bec6-9f67834663cb,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +30e110e8-da4d-4970-bc25-3f9d7300b6ac,Standard,270c7266-45dc-4e45-829f-c04f6b631cad,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a9b3d323-e2bd-4d53-9de9-82ac9185cdfe,Standard,8254d91b-e5da-4402-bb8f-301eafa09d28,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c19514ea-fa93-4979-bf9d-23fafe71eac2,Standard,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0f6ac439-e4c6-4df4-908f-4a8b02f713c8,Standard,00d4a837-f09c-41df-bed1-dfdb78387116,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +dc6febac-9d01-4142-a73a-dba92b98395a,Standard,a4a44d93-48d6-4b87-8053-87fe0778e75c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" ede4610a-e3c4-4bdd-bad4-b1fe0b84b847,Standard,49e14db3-a4bc-464a-b606-653ac8a604dd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.82485876,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e6260eb6-1993-4b2f-9da4-6ac480f41954,Standard,792b505c-87ab-4665-a31d-b6035c5ece70,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5a3624d9-a81a-4d94-80c8-f7594aad0ff6,Standard,cbcfc3b6-ac90-4215-975c-a033f5cf9912,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" b46007d2-6836-4a68-a3d7-9c1711248f90,Standard,636dec7c-4242-46e8-b7ae-db7e5a28c39c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -bb0d1bf5-f2bb-41f7-b7b4-7e5d83219315,Standard,7546df1d-8a62-4650-bf2e-d1e441b38d70,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.0],[0.03954802,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -69e69cb7-363b-4bb7-b77b-60b08a58f7fe,Standard,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.52459016],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -bda2cf93-a2a9-4620-b67b-4280991653b3,Standard,09ac8949-2b79-41d7-b56f-a58f20036df2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" a506609d-8884-4945-80c8-cae5b027fe1b,Standard,41c0087f-ce27-4da3-97d2-92d711b639b4,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f17d8fce-ffcf-4214-af18-af2bb64985b0,Standard,39112046-8953-4e73-a5d9-6a8183a77436,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -7d4efdca-c7e6-476d-9f28-56aa019c054b,Standard,2f64bf67-cee9-44bb-8c13-ff96878932af,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0a69cd3e-8a0d-40f9-b117-fd62a1e6bf7c,Standard,9d10a92f-576d-4777-99ff-59d145924fea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4e57b19d-d38c-449f-aac7-2f1c55507d88,Standard,b46d4395-6724-4830-ba55-357e81fc2814,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -6e2eb243-df51-4785-ae4f-478b0b6cd541,Standard,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ea7ae0ca-7ddb-4d6d-bf0a-4285fe70aee4,Standard,fd3b7bb8-3976-4441-9211-745243afd80f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61016949,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -94f85ca1-6313-4083-9f67-4f352b5fee15,Standard,4a6f6058-e654-464d-9367-2dca7185c6d7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -d2a008e3-e3b2-485f-8ea0-2878fe6729f1,Standard,922a6375-b97c-412e-a6c9-b0ea55a23f76,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -22a77b21-4c00-4c39-916e-0d442518c9aa,Standard,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dc7ac151-f28c-4709-b760-01f0bfea1422,Standard,5e213f42-d93e-45c5-a295-adbe09105746,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b7bdbce0-b7f0-46b7-95b7-24ca8fea2550,Standard,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8a1d7137-26e1-478e-a16c-2b4df1c762c1,Standard,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9351e508-9479-428c-bf86-67de77dc2b37,Standard,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -2ffc1daf-fd76-4180-8274-6c57ae461e14,Standard,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +26c688ba-b07c-4b84-8bcc-f5ede0b8f957,Standard,3802b603-d08d-4031-b7d7-e29734bcc122,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61581921,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +dd5aefc9-bf4f-4647-8a7f-9a618b912074,Standard,535b3fa4-ed67-4ab1-9a68-e7db83e05967,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0cefddfa-26b5-4dc2-ad52-87fa38c40e09,Standard,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.2295082],[0.23728814,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +7258b56d-8372-42f5-b75f-863b3f81e25a,Standard,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.65536723,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1dc63262-3e84-4ff5-a65c-2373cbd4b222,Standard,75f2dfb9-75a0-496d-9c44-79e7df54c1df,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" e30fc0e0-dddb-45f5-8f35-82e943889a1c,Standard,b5548457-5923-4d52-b3c9-fdb75a1df98e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92655367,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5145b6ec-0d37-480d-a7de-9b169d5ab62d,Standard,904c7476-5f16-4ec2-9138-7d5e32d38a3b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71186441,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5dc5e9c0-f62a-40f0-a52e-8dfe9d145291,Standard,d7023c15-adb7-4d56-9f86-b182611a47ef,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b7fb841b-586d-4500-a7c5-f20d40b20b61,Standard,2a816043-d1d2-44a6-8a9b-f61a4933997b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +91942a3f-4bd9-472c-9691-426a6cf5314d,Standard,576840db-7d3c-417b-b587-28b222e740e1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f1771535-fd74-46c5-a7f2-535f2ab593ae,Standard,daed3552-e382-4153-95be-97f17e2c53e5,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.67231638,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0c859327-e893-424f-bbb2-46d077b0c6f6,Standard,416fa5eb-2f72-46c3-978f-6a0ebb714a40,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +eb238e09-ce22-4dcc-86ed-20a584fb6b32,Standard,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" ea121065-66b3-4d29-ad6c-f4f3b34552a0,Standard,bdf97a4d-622c-4251-8183-8b1a696f376e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.82485876,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8cd97a28-625a-4d1b-8f3d-214986ed1ae3,Standard,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63276836,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -fe6926e8-d1bc-491c-8651-2eb0d9751ffa,Standard,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94350282,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -85ed704e-123f-410d-b2f7-8201f93870ea,Standard,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96610169,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9f1cfaf1-4a07-451e-a1d4-2113fe65e8b2,Standard,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -eed131cc-2b83-48b9-a185-4155c09ea4e1,Standard,5862f526-783a-4218-a463-3cbf5de8dade,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ea770fbd-21e1-4e8e-a06b-52e94884d41f,Standard,14ae9865-cb9b-4518-9f2a-c0fda3455a42,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68361582,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -331a5334-f99e-486b-a8f2-11891bd1dcef,Standard,ed4697fd-016c-40c2-a66b-e793878dadea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -fed5e0ee-a4ad-488a-beb2-b2a70465eb56,Standard,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,"{""type"":""LineString"",""coordinates"":[[0.03389831,0.78688525],[0.06779661,0.78688525]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -e0e8f17d-95ad-4f26-afaf-e6cff0b2c1c0,Standard,0b2a3b46-5e43-4879-973e-d8fb96429d8a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94915254,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4a68e00f-3517-47be-85a3-7250bdc7d17a,Standard,22e58399-428f-4633-9ee4-e5fa0db68d6d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96045198,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e9774353-a9b8-4e3d-a17a-0748c2c26e92,Standard,00bbc353-d47e-4865-a696-fe5d29b9e6a2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f3fec03e-9f9f-4446-8be2-83a9b518ae3b,Standard,52e15712-2572-442a-b22c-add48af95115,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ed80eeb6-2d18-4d23-a1ae-7a1bc43a8599,Standard,f29859be-c6e7-4cf9-84d7-239eb98a9e65,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -408bf65e-27a9-4053-a8be-563707915f99,Standard,da79c960-d35a-4193-9b06-2d4d57051706,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -166a98e8-88a8-4507-a473-5c27d334477d,Standard,5981fe65-3c92-4a78-af92-1461904046d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.95480226,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -50d3de73-c426-423c-84ef-1504296396bd,Standard,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.07377049],[0.11299435,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -7258b56d-8372-42f5-b75f-863b3f81e25a,Standard,ca438ab9-3abc-4416-91d1-df01d1c5fa5a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.65536723,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -700827d6-217d-44a4-a931-eec6420f85a7,Standard,ead38a50-b8f7-4bbb-b65d-f54350825e8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96045198,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -10f32f05-63d3-4cb8-bd31-1c00f4c69eea,Standard,ca3391eb-ca94-4945-ac72-e116f396f82c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -645190a6-cd64-4488-abb5-c6390445cbef,Standard,f1e55c8b-357f-45a7-9d57-e299f9b207f3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ea154576-db6d-44de-b853-685c2049936e,Standard,36cda100-86ae-4a20-ac71-20af603ac0cf,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70621469,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -30526653-5558-4ad9-b2d4-826aca8af99d,Standard,0f3ba59d-a9ce-4669-aa12-bebec42238b7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f56308ac-a9a1-4d69-a5e2-70ba302520de,Standard,4303784e-7193-454a-9be4-3591400b4eeb,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93220339,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dbe14dc1-88ac-4a06-8159-8ef2928e1f84,Standard,154e9a99-467b-4f65-9928-8ebb14149baa,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61016949,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -875f82ba-ccb5-4514-8046-658e6629091f,Standard,c6c177b0-5004-4db0-8cde-6293330a4757,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68926554,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -d684e588-01fe-4b87-adea-a193f9584846,Standard,c5457e35-ad81-4427-9d3a-99e4c44ccae8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e814d3d2-57e4-48f3-86f2-17fddf0c091d,Standard,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.07377049],[0.03954802,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -ec4d8aea-3ea4-4365-8703-2628cfd42fa6,Standard,b425b28e-48a8-4ec4-a15a-387fcfb79895,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -04318b5b-af7a-4883-a671-bf72584d647c,Standard,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71751412,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -50374589-78cb-4189-9eb2-a8ec907ca696,Standard,bd292f64-65e8-42ec-9b78-b9b9f013750e,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -77604c41-ad4e-4786-8ba5-a0da0af7241a,Standard,012c9eee-86c2-494c-adcc-bbfc481e4a46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.82485876,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f6580db8-09e2-48fa-b605-fe25866616b1,Standard,c72a08bc-4685-49b1-b8ef-803aebc8c388,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.65536723,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9cc54a0e-640d-4d9b-a163-8dedb0bbd7f3,Standard,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +fd046e8b-2547-4a89-a298-9539b65a2f27,Standard,0d94a5ea-3a13-48ba-a27f-b2903841c334,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a4b9788d-431a-414a-b3ac-809fca527237,Standard,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e1b94071-73d2-4f2a-b5e6-3899a7689e54,Standard,d8c35123-b389-4199-84f9-d417d24bb78d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +89d08dbb-d2f4-4248-a846-7e13aa1926e6,Standard,e4502c52-b4d7-4082-a583-b5688d8244e0,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.14754098],[0.17514124,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +f5cbde9f-522f-4b81-9093-d648274afcee,Standard,bd288184-99d8-4233-bb3d-484f3922200a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6779661,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +342e3e77-6ff5-48ce-b02d-1f9bd4bb303c,Standard,d40a1a85-40f2-4ad3-ba58-720d5ba02268,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1306ee4a-e876-4ac6-b981-aab5e6e23406,Standard,535843a3-cf93-412f-b4d7-585337791ba8,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.18852459],[0.11299435,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +cc1b56ed-aabe-4d4d-8450-44e4412cda84,Standard,1f040625-ad1d-409f-bd7e-944c4d805e46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6a795129-21a1-4796-b945-4966ee0c9903,Standard,81cd3f38-867b-4a71-ba22-cb33834e0e58,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c945778f-a8e2-491a-acaf-7b594764f775,Standard,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a7344637-1266-45f3-af15-ca5dfe9d77c5,Standard,205fcee1-928c-4374-950c-34575f07fa49,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63276836,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +bda2cf93-a2a9-4620-b67b-4280991653b3,Standard,09ac8949-2b79-41d7-b56f-a58f20036df2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f39077f0-ac8c-4397-823d-37701d7982e8,Standard,898d8295-bf35-4079-9374-99b059c2c956,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.0],[0.23728814,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 1dab7f15-3824-44ca-9b64-2364d53192ab,Standard,462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5a3624d9-a81a-4d94-80c8-f7594aad0ff6,Standard,cbcfc3b6-ac90-4215-975c-a033f5cf9912,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1c859190-f5ef-407e-b792-eabaa2472408,Standard,9ce9d92c-5583-4b16-bec6-9f67834663cb,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -7c28ea5e-31b1-423f-a591-335f20836b1d,Standard,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71751412,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e80cc517-0a6c-47f2-a7a7-298f49dc353d,Standard,dc022eec-16b0-4a64-a2f5-498d81aca71e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68361582,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4b969595-3d78-432a-b244-9a6f984a3bd5,Standard,bd8c7d3d-e830-4a46-bf78-0086ce24909f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +7bf5033d-efa1-4b45-b885-4c22ede1336d,Standard,df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c8f7abaa-75e8-4899-8af7-fbd1ac8702d3,Standard,0db6e581-37e9-4254-aed8-d5cdf66819f9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +22a77b21-4c00-4c39-916e-0d442518c9aa,Standard,3dec12fd-3dc6-481d-be05-8df9df7f0c5d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +31c566a5-37ba-4520-aec3-add6044fbfa5,Standard,c5af5a34-211a-4105-a8e1-f447140073c6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e9266e59-ed7d-4719-abe6-455193c4f5f3,Standard,810bebb0-0d5c-4899-b213-3207be661248,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e815c65b-2b44-4afb-a73b-7da1a0df6a15,Standard,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4d9fc234-c097-4b0c-9f9d-0453bbc9a713,Standard,9b889b73-c108-4b38-b6eb-3377841e0c83,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +69658801-7a8c-48b6-809d-3fd07892a5ec,Standard,119d270a-ff22-4fdb-8214-cb5b336790bf,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +78ca2d9e-d805-4b55-b2eb-25634035b606,Standard,7d45f0ab-1e6b-452f-b665-c4846cf046f5,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70056497,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 80ae1356-eca3-4294-817c-5a738239d308,Standard,4f28e734-5148-4caf-ac64-270231740cbf,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92655367,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f1771535-fd74-46c5-a7f2-535f2ab593ae,Standard,daed3552-e382-4153-95be-97f17e2c53e5,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.67231638,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dc4124c6-ee52-40d9-81d6-c5832a5c1fba,Standard,f26b5511-3c50-42d5-97c2-be408330eb84,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -2b0f09af-6760-4fdc-8661-6688c100191f,Standard,2645e336-b0df-4d1e-a0ea-375444488f06,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -13804a71-8b05-4b92-962c-b229cc9540bf,Standard,787237ad-b3a8-4f2c-ab70-31c5113d82d7,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.14754098],[0.03954802,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -66600910-c787-475c-9892-98098f6afdac,Standard,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96610169,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +512bdb98-4b93-4691-b710-021fb746526a,Standard,df8df8d2-3494-4da9-8d1b-f913d15f520f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1f106b59-4fce-4be2-a05c-a6d96f188fde,Standard,f6eff0d1-af6b-46ce-b430-4d30976ec08f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a7bdd616-a136-4976-b595-1524c333aac5,Standard,f2d03b34-9595-4819-a00b-ff9ddd92eb07,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 10215742-8e24-46f8-993c-cd9a6220e733,Standard,2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cc1b56ed-aabe-4d4d-8450-44e4412cda84,Standard,1f040625-ad1d-409f-bd7e-944c4d805e46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4eff33f2-6d61-4d4e-a086-5d7ef49ce257,Standard,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +3dc0bb9a-0ef9-446e-b039-b4522a42e3d6,Standard,6570535c-0d2e-4846-9951-21559902f67a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 36508d00-e1b3-4df2-a168-e83c84196b35,Standard,5071dd8c-bbc1-4c8d-a180-4492f80e183d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ec4d8aea-3ea4-4365-8703-2628cfd42fa6,Standard,b425b28e-48a8-4ec4-a15a-387fcfb79895,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b7477d53-b5db-41d6-9e70-3628e24d5a3d,Standard,033d0230-4aee-47cf-91f9-81f5f40e60b0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +cf142631-94bf-4d25-adaa-387714e975c8,Standard,5fe9c522-37d0-48f8-b3b8-e91b956e39f6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +3767a331-5208-4bc1-a8cf-cb4b697fdf0f,Standard,32bd37df-255b-4eb2-9d16-5b711132eee6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +dc081e8a-4fe0-4bf1-b215-67e1454eae93,Standard,543f7e9f-b9be-486b-b365-2bae79010758,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.98360656],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ed286ef7-6402-4264-9803-72e3ee03a9cf,Standard,4f2402e8-664a-40f2-970a-abc098a2a0d1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63841808,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 59de95df-5cab-47b5-bfc2-223043a24e97,Standard,92cb5065-2e57-4099-8e29-75cbc0c80370,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6779661,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -37b0bed2-ead9-4541-bce0-3a8df610b7f8,Standard,eb125953-31d3-4207-adf7-aba3a3790d6f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84180791,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e49578f8-f571-481a-b229-1bdb3d6cbf18,Standard,177a20fe-83b1-46df-94a3-4faa54348d10,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c8f7abaa-75e8-4899-8af7-fbd1ac8702d3,Standard,0db6e581-37e9-4254-aed8-d5cdf66819f9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3f9c9aa0-0dbc-48d3-9cd3-b38b429227c0,Standard,c317a6cd-428b-4c36-8233-91d0c4e2717a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.67231638,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -de8ce40b-ba0d-4def-810c-bf2f5dfd2cec,Standard,4258f215-5b22-446f-a260-e8cdaa7c95d1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -022c03de-6b04-4fa8-b0bd-4a78f92a65aa,Standard,e3a40690-d085-4796-9fcb-48d776e58594,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b5045ec8-3bea-4959-be7c-2f96bbf89894,Standard,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62146893,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -08d4e2ec-8532-4327-9d9d-aa51393d53e8,Standard,31a2b9bf-e785-4475-aa44-1c34646e8c79,"{""type"":""LineString"",""coordinates"":[[0.03389831,0.27868852],[0.06779661,0.27868852]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6d79e6bf-0fd6-47cf-84e1-af8c355a09c8,Standard,773aebe4-fc03-46be-8209-0213e2760a8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70056497,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -416dd5b1-8b68-435b-88da-8ff638754355,Standard,36dccefc-f04c-493f-bb88-11343583bf9f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -512bdb98-4b93-4691-b710-021fb746526a,Standard,df8df8d2-3494-4da9-8d1b-f913d15f520f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ba6759b8-89a7-4b38-b5d6-eb17db1e212b,Standard,b179c38b-5af0-4304-84b1-1dc03314fd80,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66666667,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c3c05cb5-3e3d-45fe-b52d-879716aac345,Standard,369cffa5-bcee-4489-8193-1d9b10230eca,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92655367,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -7855bf17-05c0-4ed4-b1c0-b3dcd6fd24df,Standard,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -f5cbde9f-522f-4b81-9093-d648274afcee,Standard,bd288184-99d8-4233-bb3d-484f3922200a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6779661,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -91942a3f-4bd9-472c-9691-426a6cf5314d,Standard,576840db-7d3c-417b-b587-28b222e740e1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4a71a58f-2e89-4a01-a76d-41c57d65fd5a,Standard,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ffd94a18-e4f0-4088-893a-3d9dae11ddf5,Standard,d69efff2-ba8b-4aa6-a4a1-27267964147a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3dc0bb9a-0ef9-446e-b039-b4522a42e3d6,Standard,6570535c-0d2e-4846-9951-21559902f67a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1f106b59-4fce-4be2-a05c-a6d96f188fde,Standard,f6eff0d1-af6b-46ce-b430-4d30976ec08f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b0d59363-291f-4fb2-a555-0f24126e45f4,Standard,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8119e1cc-7122-4551-8cac-6724df1d786c,Standard,de5ee252-ebb6-42b0-875c-77ae557ffbf6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5be3829e-2848-4b72-9cb6-61aefec4e172,Standard,970cf93c-36c5-4938-a7e4-3f184a7035f0,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70056497,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -011c1cb7-a03a-448d-8ea0-40ebe2336949,Standard,732f83b0-b9c5-4b8e-86fe-753c26f40e78,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -abafb627-a899-43cc-bc4e-e6a574da9f1a,Standard,ae234bc5-b751-41f2-95ee-b78de124c583,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -eb238e09-ce22-4dcc-86ed-20a584fb6b32,Standard,9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4d9fc234-c097-4b0c-9f9d-0453bbc9a713,Standard,9b889b73-c108-4b38-b6eb-3377841e0c83,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -d90d97cd-e0a0-4433-90fc-3610bc3d35b3,Standard,f5839ade-5968-4879-a824-90b5fb3552cd,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.2295082],[0.03954802,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +32c5b241-ac2b-42b9-89e8-fd747a64ecd3,Standard,f717b05b-f4e7-43d9-af9e-638e2badee5a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +bd82b2de-920f-4332-a93c-a7b0b4285910,Standard,bb59ca46-1f2e-41c9-9723-90b306f043cd,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.2295082],[0.17514124,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 0348790a-ff1f-4f55-8b43-50aea5e5cb18,Standard,bf7e7268-2fb6-4948-ace6-9037ae148fa3,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93220339,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -30e110e8-da4d-4970-bc25-3f9d7300b6ac,Standard,270c7266-45dc-4e45-829f-c04f6b631cad,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -908b7283-2584-4cae-9017-26b8ea0fb79c,Standard,3d81adf5-73d1-4708-b03b-3afc7db017f4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b9dcea5f-f318-419f-a714-fd51caa60fe0,Standard,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66101695,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -03e41436-72f8-4b2e-9340-52ba4d8e094b,Standard,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a4ee0ad6-0813-4537-b795-edf17d4af91a,Standard,fc7821d2-ac64-483e-b520-38d9971f4db0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -d83e93ac-d76b-48ce-b1c2-511a116595ab,Standard,366a70fb-8d7f-4201-9eca-0fcbc839239d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -31c8d1f9-a00e-4392-ae33-da09323f0b4c,Standard,67af7db0-0fd8-4657-bb4f-43a2141b9f73,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62711864,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -97e202d5-561b-418b-8b53-fa080e7cb931,Standard,21359dd1-7a23-4932-b656-c196fbffe751,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9c1050be-a40a-42da-9f0b-b91aa206b0ce,Standard,06b7f21a-d6d7-4ec0-94c6-141845f14986,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.45901639],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dc25d9fe-d077-46de-b78a-ea5f01fa44bb,Standard,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66101695,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0103c715-ad75-42c6-a64f-f17fe46280e2,Standard,1bf26b4d-03cc-4490-8c33-d3db8597d807,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.69491525,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b392f548-3eb5-4d17-a320-fda6305fff89,Standard,67c1746c-3af8-403f-983e-1c7c047383df,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -189e6f29-116f-4087-8cdc-9303cbb41e89,Standard,f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -05a66108-a122-4dbf-bbd9-c57a3904df7e,Standard,e3c3c6a3-c383-4dbb-9b3f-a14125615386,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -78ca2d9e-d805-4b55-b2eb-25634035b606,Standard,7d45f0ab-1e6b-452f-b665-c4846cf046f5,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70056497,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -65acfa71-ccb9-4c73-8869-d24e740f3652,Standard,3ec2f2a0-36a3-4d11-88ee-cc4df001e876,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a7bdd616-a136-4976-b595-1524c333aac5,Standard,f2d03b34-9595-4819-a00b-ff9ddd92eb07,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -86237e52-5633-4047-9370-69d30e223fec,Standard,dfae9806-9b44-4995-ba27-d66d8e4a43e0,"{""type"":""LineString"",""coordinates"":[[0.0,0.06557377],[0.03389831,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b8697183-05ca-4701-a2e3-d0d25be61acd,Standard,41414318-73e3-4bdc-8147-570a96b28d37,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" c28b1895-0c06-4dcf-b37c-68793612f035,Standard,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"{""type"":""LineString"",""coordinates"":[[0.96610169,0.39344262],[1,0.39344262]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" fc20d94d-2857-4106-a9e7-3f1aac1173f6,Standard,625bdd2c-a75f-46ef-850c-ca4704d56e55,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70621469,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -52d41e1a-4ad9-4f82-ae81-ce9a6a4d0a1b,Standard,e018b95e-fca5-40f7-8550-b05a619169dc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -d135cd38-118a-4c91-8435-6e72518d444a,Standard,9b509c7d-4647-40fd-b03e-7ab919215cc6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71751412,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -25107814-9a22-49f5-ba01-00c7c3ad123a,Standard,6232b760-b2e0-485e-9c61-f9721a366a81,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c945778f-a8e2-491a-acaf-7b594764f775,Standard,98072ded-726f-4f0b-8bbc-4fb6d5086a7b,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -098f365b-4ec3-472c-b137-2525bfa4a7af,Standard,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62146893,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -32c5b241-ac2b-42b9-89e8-fd747a64ecd3,Standard,f717b05b-f4e7-43d9-af9e-638e2badee5a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8910eb73-d32f-471f-a7a5-92570070be29,Standard,6dcdc87b-a719-416f-9da1-21a701048f3a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ce92f503-5384-4c3b-b86e-4776d7b99159,Standard,d5b861a6-2a5b-4dec-a66e-adbfc6d62873,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.67231638,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a4ee0ad6-0813-4537-b795-edf17d4af91a,Standard,fc7821d2-ac64-483e-b520-38d9971f4db0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +56271174-1da2-4402-9026-82e3111186a0,Standard,b7baa286-cbe2-4143-a08f-4e025af47529,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +68480188-a299-4ad7-8451-54dd092ffdc9,Standard,df97c0d1-379b-417a-a473-8e7fe37da99d,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.04098361],[0.11299435,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +fb4d855c-83a0-435d-a08a-15c8716f2e7c,Standard,ffcaf979-d707-4d25-8f46-f436f9792d7f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5ddaac19-1138-4282-9ecf-3e2e8c89839c,Standard,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b7bdbce0-b7f0-46b7-95b7-24ca8fea2550,Standard,b73208dd-f4a8-4e90-bf2d-7ea67a89525a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +35e6b00e-3441-4c99-a159-ab750d201ec8,Standard,de756ddb-793d-4b2d-959c-59d938a8f61f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +dfe18a4b-8980-40fc-9a77-69a6b5da930d,Standard,01bdd8b2-145f-42b3-80e3-a2366dea1044,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +929a85d7-16c2-48a3-9b4c-0b856f935098,Standard,d2aff632-fc26-4595-931c-92e266247ac8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +cc25baf6-91ba-4c2f-a7f3-dff202d7cba5,Standard,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.65536723,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e328034d-d8f4-42ec-874e-3cb06d91bb3e,Standard,9d02ea80-98d8-4cd0-a635-9104a14a56dd,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84180791,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +416dd5b1-8b68-435b-88da-8ff638754355,Standard,36dccefc-f04c-493f-bb88-11343583bf9f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +063dc228-df79-40c7-ba28-3508df3841b6,Standard,39dbc5ed-d874-48a8-9128-e970436a94b4,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.04098361],[0.17514124,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +c38dd991-14c8-45fd-97f6-eb21df94630d,Standard,40b0f497-96a3-49d9-9503-8fa67a5b532a,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.0],[0.17514124,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 1502e4ed-7627-4a7f-b251-02da6c951643,Standard,69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94350282,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -26c688ba-b07c-4b84-8bcc-f5ede0b8f957,Standard,3802b603-d08d-4031-b7d7-e29734bcc122,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61581921,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -fd99eb90-1a76-4b0b-a7b4-294f4bf6a4f7,Standard,519ace7e-fd3f-4797-b14b-36c1694b00cd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -30a60292-f650-47fb-8281-cffda93a6529,Standard,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -68d4c4d0-246e-4cfb-95f7-f3b2aef8788f,Standard,3da4fd3d-ac5e-409d-91fa-36516673cf57,"{""type"":""LineString"",""coordinates"":[[0.96045198,0.91803279],[0.99435028,0.91803279]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -0286cd61-b997-4cd9-a139-88eeab79339b,Standard,55b3d03f-2204-4ab3-84cc-a28476868c9d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cc657d07-3495-45b8-a90b-76769e14f2d8,Standard,8a50fb37-81cf-47c9-8850-a12b4391e2e7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -2e738086-0b9c-4e39-b00d-99d27420cb1e,Standard,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66101695,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0cefddfa-26b5-4dc2-ad52-87fa38c40e09,Standard,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.2295082],[0.23728814,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +5a1daa68-a04c-4b27-b2a2-62a53da0b9ff,Standard,926d6113-933f-49e3-9529-a3035acdc9b2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +fcfe053f-d8ce-407e-99d5-b0b480a3abb1,Standard,5545d21b-bdc8-495f-bd28-d22ffcc0fafc,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68361582,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +bcc42757-dac4-41da-86e9-31202e91f56f,Standard,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.18852459],[0.17514124,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bb0d1bf5-f2bb-41f7-b7b4-7e5d83219315,Standard,7546df1d-8a62-4650-bf2e-d1e441b38d70,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.0],[0.03954802,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 0fafac48-b639-41d0-8c67-098ebb0b8abd,Standard,7125de08-1d28-409a-8b23-023a0294def5,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94350282,0.0],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -6aa9dcf5-cfca-47f7-ae51-1c251a7a6a4e,Standard,a5c73608-5a85-495d-bea0-df77b6ce66ea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -56191c65-c5b3-474c-bed2-291c8104fdf7,Standard,443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63841808,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cb82c2a6-ea8d-4f49-a6aa-9b615295945d,Standard,15345698-c319-461f-b969-37d50fb84220,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6440678,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1a9191b1-c559-404c-a61e-1da846c5efde,Standard,0c266541-6235-4d01-8258-e763c58af6c7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b4cc5801-2bf1-4448-be4d-05778e033eaa,Standard,95ced3b5-69fd-4171-9c34-f18802064e22,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8e1c4db3-dfd2-4522-8478-7b760ddeb35d,Standard,b8fa1f73-223c-4b08-a140-44f12484cce3,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3767a331-5208-4bc1-a8cf-cb4b697fdf0f,Standard,32bd37df-255b-4eb2-9d16-5b711132eee6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -63d56d37-d81e-4476-8916-83ae7ad4c7f2,Standard,4db634e5-3eb8-4c17-bc44-eb224667580c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c94b74dd-5f70-4203-a9ee-76452e5d8c28,Standard,32507a10-1eed-4a3f-820c-bc187f3b052e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ecd0e92a-9446-48ab-b6e2-43942575db1b,Standard,55caf2ec-a21b-4afd-8830-1e4009cce396,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66666667,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e0e8f17d-95ad-4f26-afaf-e6cff0b2c1c0,Standard,0b2a3b46-5e43-4879-973e-d8fb96429d8a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94915254,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5a54c5de-9afe-4ea1-af36-2bca268deed2,Standard,00d03670-7833-47ee-ad52-04d18d1c64fd,"{""type"":""LineString"",""coordinates"":[[0.10734463,0.1557377],[0.14124294,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +dc25d9fe-d077-46de-b78a-ea5f01fa44bb,Standard,94713e6c-c47e-422c-8ab3-2a2903b7dcd2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66101695,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +2db9a259-6929-4f7e-b1b4-e0bdb86cd09d,Standard,fa6d5184-b205-4b1b-839f-7b21ac956c29,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.04098361],[0.23728814,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +089192f0-e01c-4959-876f-b4f049da0941,Standard,50164699-2018-4b17-b3f1-74b082f27403,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +51422821-5966-4151-92c6-cc6150951f81,Standard,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ea770fbd-21e1-4e8e-a06b-52e94884d41f,Standard,14ae9865-cb9b-4518-9f2a-c0fda3455a42,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68361582,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +3ade7f68-6a98-469b-90ea-d6845ef884fb,Standard,3b879239-20c8-4adf-bd51-92924327ee71,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6e31f8dd-5039-4c80-ba78-868496f99427,Standard,8f80e777-ccbd-4630-b10e-238e824113fd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +908b7283-2584-4cae-9017-26b8ea0fb79c,Standard,3d81adf5-73d1-4708-b03b-3afc7db017f4,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9ed48993-1a92-453a-ba31-11eb00021025,Standard,14a8dc4c-0906-402f-b073-6d6d4725d0cb,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.0],[0.11299435,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +86a5a43b-025c-4bb5-b9c3-bf88e610617c,Standard,0170837a-1876-45f9-a613-666f9991964d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 7abdcec1-e147-4877-be06-6c56fd043509,Standard,1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93220339,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -96fb5883-b7dd-4646-8bf9-e6e6d730f5bb,Standard,1ee9de9a-0095-4b58-beeb-e56fb908844a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66666667,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3080afb0-0cdc-4641-ae10-71c05a48fa0f,Standard,92301422-94ae-48ab-89c7-a69eea9450b2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -bcc42757-dac4-41da-86e9-31202e91f56f,Standard,b6b1b9fc-e7d8-492d-8601-84c1e756bd83,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.18852459],[0.17514124,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -c19514ea-fa93-4979-bf9d-23fafe71eac2,Standard,0228ffcd-f6bc-47c8-b26c-fcc0abacd963,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +d90d97cd-e0a0-4433-90fc-3610bc3d35b3,Standard,f5839ade-5968-4879-a824-90b5fb3552cd,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.2295082],[0.03954802,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +68d4c4d0-246e-4cfb-95f7-f3b2aef8788f,Standard,3da4fd3d-ac5e-409d-91fa-36516673cf57,"{""type"":""LineString"",""coordinates"":[[0.96045198,0.91803279],[0.99435028,0.91803279]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b5045ec8-3bea-4959-be7c-2f96bbf89894,Standard,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62146893,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5b351429-1d9d-470f-b303-b2559b5882a4,Standard,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +d33bcbd4-0616-44f2-bf6f-9650acdd4193,Standard,f0f8f187-5dbf-46ab-8a43-d6169ab5042d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.64971751,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +de8ce40b-ba0d-4def-810c-bf2f5dfd2cec,Standard,4258f215-5b22-446f-a260-e8cdaa7c95d1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5c590022-3662-4882-9a3d-e39d618b00ad,Standard,33f29587-f63e-45b7-960b-037bda37a3cb,"{""type"":""LineString"",""coordinates"":[[0.21468927,0.07377049],[0.24858757,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +3f9c9aa0-0dbc-48d3-9cd3-b38b429227c0,Standard,c317a6cd-428b-4c36-8233-91d0c4e2717a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.67231638,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0bab2fbe-f6c5-4f9f-bc3c-683683374b11,Standard,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a158cd0e-50bd-40d1-9d23-17c0ff9bb08c,Standard,1dee13af-e638-4858-9c69-0069190cd577,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +09be2147-da4d-4f8c-ae3b-c241653d1fce,Standard,eb21d716-1b54-4dba-bdc2-d1f6752aef85,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +fe6926e8-d1bc-491c-8651-2eb0d9751ffa,Standard,8f422111-67d7-42f0-9f80-fbd0ec64c4fc,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94350282,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +96cdb8c3-a706-441d-834c-ed86988c29fc,Standard,04f29760-9e52-4943-8563-62e1fbd5ed52,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4a68e00f-3517-47be-85a3-7250bdc7d17a,Standard,22e58399-428f-4633-9ee4-e5fa0db68d6d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96045198,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +86550a99-c324-413d-aa27-2ebf243249e9,Standard,d5489e1b-0e7e-4ca9-a362-09c23576a622,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +85ed704e-123f-410d-b2f7-8201f93870ea,Standard,3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96610169,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +10f32f05-63d3-4cb8-bd31-1c00f4c69eea,Standard,ca3391eb-ca94-4945-ac72-e116f396f82c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 11fb04eb-12dd-4f9f-b781-fa27757154ab,Standard,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,"{""type"":""LineString"",""coordinates"":[[0.21468927,0.1557377],[0.24858757,0.1557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -fd046e8b-2547-4a89-a298-9539b65a2f27,Standard,0d94a5ea-3a13-48ba-a27f-b2903841c334,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0f6ac439-e4c6-4df4-908f-4a8b02f713c8,Standard,00d4a837-f09c-41df-bed1-dfdb78387116,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5ddaac19-1138-4282-9ecf-3e2e8c89839c,Standard,27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81920904,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1dc63262-3e84-4ff5-a65c-2373cbd4b222,Standard,75f2dfb9-75a0-496d-9c44-79e7df54c1df,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -6e15708d-00b1-46c0-9e80-52ddcc89bc61,Standard,80d8252b-045f-471a-9638-416ed3f86120,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -6e31f8dd-5039-4c80-ba78-868496f99427,Standard,8f80e777-ccbd-4630-b10e-238e824113fd,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75706215,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c3c05cb5-3e3d-45fe-b52d-879716aac345,Standard,369cffa5-bcee-4489-8193-1d9b10230eca,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92655367,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0434dc12-6149-4832-a288-6620ee0389f2,Standard,3e21f3a1-2c9c-4138-bcc9-466b004609ed,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +7c28ea5e-31b1-423f-a591-335f20836b1d,Standard,33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71751412,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5f72658c-b370-4424-b2b1-61c5368a6b9a,Standard,011e3794-3341-4376-839c-3f5a452e15ab,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68926554,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +86237e52-5633-4047-9370-69d30e223fec,Standard,dfae9806-9b44-4995-ba27-d66d8e4a43e0,"{""type"":""LineString"",""coordinates"":[[0.0,0.06557377],[0.03389831,0.06557377]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +13804a71-8b05-4b92-962c-b229cc9540bf,Standard,787237ad-b3a8-4f2c-ab70-31c5113d82d7,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.14754098],[0.03954802,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +eede57fa-6784-4894-8476-736f65984791,Standard,2c520ab6-507e-4dcf-ab05-8f238e9b9385,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96045198,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" dc2e34c5-31df-49b4-b6f3-ea3fc19ab0d7,Standard,5af425fa-6ed7-43e1-8898-7af1315128c5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -4b969595-3d78-432a-b244-9a6f984a3bd5,Standard,bd8c7d3d-e830-4a46-bf78-0086ce24909f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8566c6b6-ae20-42aa-b709-dfbbbf563208,Standard,86dfce49-05b2-4208-a6ae-877c3e98e6be,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.07377049],[0.17514124,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f39077f0-ac8c-4397-823d-37701d7982e8,Standard,898d8295-bf35-4079-9374-99b059c2c956,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.0],[0.23728814,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" a53441bb-a915-45e2-a9af-73517ddaf34a,Standard,8b3e3802-5213-46d0-a498-15eb6e5852b5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.82485876,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a17793fb-5615-4b2f-94f3-74d11ec8933c,Standard,97ae0aa4-bf05-4b88-8020-83cbda415d22,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70621469,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9031d2ef-01e7-4e1c-a880-ea3ee9102493,Standard,4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -96cdb8c3-a706-441d-834c-ed86988c29fc,Standard,04f29760-9e52-4943-8563-62e1fbd5ed52,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -eede57fa-6784-4894-8476-736f65984791,Standard,2c520ab6-507e-4dcf-ab05-8f238e9b9385,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96045198,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5ea15b76-2059-405d-a030-b8bf6b7d4f06,Standard,2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96610169,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -8bb36c81-659c-42b6-8772-dbf4cdd68baa,Standard,cdda8fa5-9a18-4f3e-951d-1ec0009191b4,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93220339,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cc25baf6-91ba-4c2f-a7f3-dff202d7cba5,Standard,1a1e63f7-6196-4856-9f4e-876a44bdf2f8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.65536723,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -929a85d7-16c2-48a3-9b4c-0b856f935098,Standard,d2aff632-fc26-4595-931c-92e266247ac8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -c38dd991-14c8-45fd-97f6-eb21df94630d,Standard,40b0f497-96a3-49d9-9503-8fa67a5b532a,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.0],[0.17514124,0.0]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -85393fb1-b60f-48ab-b0d5-56002cc2ebe2,Standard,550ebca7-1455-44eb-9431-ffbf08e58bd4,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -41c1aa80-2d8b-4993-a943-eeb328d67532,Standard,450426ac-a560-4d17-b1fc-9e169530a655,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0434dc12-6149-4832-a288-6620ee0389f2,Standard,3e21f3a1-2c9c-4138-bcc9-466b004609ed,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -cc135490-2330-43ff-8ac5-dff7ce96c433,Standard,32b3bb19-c52a-4a19-890a-94a8918d38a9,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.18852459],[0.03954802,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -063dc228-df79-40c7-ba28-3508df3841b6,Standard,39dbc5ed-d874-48a8-9128-e970436a94b4,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.04098361],[0.17514124,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -6a795129-21a1-4796-b945-4966ee0c9903,Standard,81cd3f38-867b-4a71-ba22-cb33834e0e58,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +69b740cc-a143-4e1b-bfa6-22f8baa163d1,Standard,b608d71e-3ede-4156-a015-3f6e1d22242a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b0d59363-291f-4fb2-a555-0f24126e45f4,Standard,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6b88508e-ab70-4026-ac4a-8effa4b83d2d,Standard,ab3645a7-af26-480d-b1bd-5b0fa00dc83f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f357848e-d0e0-44db-8228-b938eefe8d86,Standard,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +2e738086-0b9c-4e39-b00d-99d27420cb1e,Standard,e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66101695,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +25107814-9a22-49f5-ba01-00c7c3ad123a,Standard,6232b760-b2e0-485e-9c61-f9721a366a81,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +700827d6-217d-44a4-a931-eec6420f85a7,Standard,ead38a50-b8f7-4bbb-b65d-f54350825e8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96045198,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5cb93639-bc3a-4e87-bd02-1d8e16680219,Standard,e05c68b1-11cd-43fd-a4b2-31e4db380c78,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4e57b19d-d38c-449f-aac7-2f1c55507d88,Standard,b46d4395-6724-4830-ba55-357e81fc2814,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +54daf474-ca11-4e75-981a-c1844928d43f,Standard,c7e09266-c778-433b-b01a-5fb9e298ea8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94350282,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ffd94a18-e4f0-4088-893a-3d9dae11ddf5,Standard,d69efff2-ba8b-4aa6-a4a1-27267964147a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6717f8a4-7670-42cd-bc5e-cdc86cba04ca,Standard,e80aa2db-f32c-410d-96a1-a32e03222568,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +69232745-5bf2-45c1-b3a3-8d7ebbe08558,Standard,1396cb4c-cee7-4116-97c9-290f98785719,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.1147541],[0.03954802,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b7fb841b-586d-4500-a7c5-f20d40b20b61,Standard,2a816043-d1d2-44a6-8a9b-f61a4933997b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +408bf65e-27a9-4053-a8be-563707915f99,Standard,da79c960-d35a-4193-9b06-2d4d57051706,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +44cda5d8-348f-4204-99cb-0ec4baae9cff,Standard,6678c226-c5d2-4ce3-9728-dc1163be799f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6e2eb243-df51-4785-ae4f-478b0b6cd541,Standard,847fd5fc-b515-4a9d-8a6f-66df1e71ded2,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +d2a008e3-e3b2-485f-8ea0-2878fe6729f1,Standard,922a6375-b97c-412e-a6c9-b0ea55a23f76,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4eff33f2-6d61-4d4e-a086-5d7ef49ce257,Standard,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e814d3d2-57e4-48f3-86f2-17fddf0c091d,Standard,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.07377049],[0.03954802,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +2747953c-f646-407d-978c-1318659a63be,Standard,174fb4b2-4f9e-415c-bfee-d850ef751307,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.18852459],[0.23728814,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" b8a69ed7-b65a-40c9-84e6-37fb01f064fe,Standard,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1730aedc-aec2-4f82-bc90-2c821b470e0c,Standard,f1e88392-3b2a-4ce8-a31f-c963f08f8043,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -00e6a38a-f4f0-4cd8-a182-3c3c2337571e,Standard,9f7599de-c488-46c5-b053-1279a511f7b9,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +03e41436-72f8-4b2e-9340-52ba4d8e094b,Standard,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +6aa9dcf5-cfca-47f7-ae51-1c251a7a6a4e,Standard,a5c73608-5a85-495d-bea0-df77b6ce66ea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ea7ae0ca-7ddb-4d6d-bf0a-4285fe70aee4,Standard,fd3b7bb8-3976-4441-9211-745243afd80f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61016949,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +04318b5b-af7a-4883-a671-bf72584d647c,Standard,3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71751412,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +821614b3-c5ea-41b3-87a6-6090c26d97ff,Standard,3bc8235b-03b5-489b-81a2-58d520fbe28e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +50374589-78cb-4189-9eb2-a8ec907ca696,Standard,bd292f64-65e8-42ec-9b78-b9b9f013750e,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +cc135490-2330-43ff-8ac5-dff7ce96c433,Standard,32b3bb19-c52a-4a19-890a-94a8918d38a9,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.18852459],[0.03954802,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +85393fb1-b60f-48ab-b0d5-56002cc2ebe2,Standard,550ebca7-1455-44eb-9431-ffbf08e58bd4,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +e49578f8-f571-481a-b229-1bdb3d6cbf18,Standard,177a20fe-83b1-46df-94a3-4faa54348d10,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 00783c26-0fc0-4b48-b470-dc44e8599a28,Standard,6c24b464-790a-4aae-bb11-766718f07cd5,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.82485876,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -54daf474-ca11-4e75-981a-c1844928d43f,Standard,c7e09266-c778-433b-b01a-5fb9e298ea8e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94350282,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -3ade7f68-6a98-469b-90ea-d6845ef884fb,Standard,3b879239-20c8-4adf-bd51-92924327ee71,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +7016009b-c704-4bdc-a331-19bc6ac99ae2,Standard,0ebf0088-f596-4cd1-9ae0-5da02dc40335,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74576271,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +8cd97a28-625a-4d1b-8f3d-214986ed1ae3,Standard,7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63276836,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +96ce5cd6-78b0-41d6-878d-4c6e59f27ffe,Standard,4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.1147541],[0.17514124,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +b392f548-3eb5-4d17-a320-fda6305fff89,Standard,67c1746c-3af8-403f-983e-1c7c047383df,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +eed131cc-2b83-48b9-a185-4155c09ea4e1,Standard,5862f526-783a-4218-a463-3cbf5de8dade,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f56308ac-a9a1-4d69-a5e2-70ba302520de,Standard,4303784e-7193-454a-9be4-3591400b4eeb,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93220339,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ed32fd63-b9cd-4bdc-9301-51c7e83cf88a,Standard,7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.61581921,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +cb82c2a6-ea8d-4f49-a6aa-9b615295945d,Standard,15345698-c319-461f-b969-37d50fb84220,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6440678,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1a9191b1-c559-404c-a61e-1da846c5efde,Standard,0c266541-6235-4d01-8258-e763c58af6c7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ed80eeb6-2d18-4d23-a1ae-7a1bc43a8599,Standard,f29859be-c6e7-4cf9-84d7-239eb98a9e65,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +69e69cb7-363b-4bb7-b77b-60b08a58f7fe,Standard,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.93785311,0.52459016],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9f1cfaf1-4a07-451e-a1d4-2113fe65e8b2,Standard,f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9f2a5f75-9c3c-4f6f-9000-3f2b983afd72,Standard,3a2f199c-2966-4b9a-939b-3a6c9924341c,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62711864,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ee1d5114-5f69-4ff9-91e9-273d8437e2ae,Standard,f66df6fa-3dfa-4515-85d7-54d0f429fde7,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92655367,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +f7e1e922-52d3-469f-98c6-5353a5d74641,Standard,e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c67ff8a5-d296-47db-970a-4f6b2ab7c77a,Standard,d53ff076-dadd-44f8-85d4-68f48991f7d0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.1557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +30a60292-f650-47fb-8281-cffda93a6529,Standard,6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +022c03de-6b04-4fa8-b0bd-4a78f92a65aa,Standard,e3a40690-d085-4796-9fcb-48d776e58594,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c94b74dd-5f70-4203-a9ee-76452e5d8c28,Standard,32507a10-1eed-4a3f-820c-bc187f3b052e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72316384,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0e676643-d3c8-46f8-836c-0ef21bda69ce,Standard,a286f73a-20ee-4056-8129-c7963b34ecd9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +aa57fd6a-7f6d-45df-aa28-1dc626abe782,Standard,d82fae59-844a-4c85-997e-326dd876137c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5145b6ec-0d37-480d-a7de-9b169d5ab62d,Standard,904c7476-5f16-4ec2-9138-7d5e32d38a3b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71186441,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +83c21903-e94d-4b2a-a933-8cc984d28f24,Standard,ce71377d-63ea-462a-9290-67e51946a098,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +30526653-5558-4ad9-b2d4-826aca8af99d,Standard,0f3ba59d-a9ce-4669-aa12-bebec42238b7,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +c1b96bd6-563f-4f4d-b401-1955e29d7ced,Standard,857c264a-7072-4bb7-af56-2f01539b2a2e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +11f61a48-2d5c-4916-8180-def8544d16c6,Standard,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ea154576-db6d-44de-b853-685c2049936e,Standard,36cda100-86ae-4a20-ac71-20af603ac0cf,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70621469,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +63d56d37-d81e-4476-8916-83ae7ad4c7f2,Standard,4db634e5-3eb8-4c17-bc44-eb224667580c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0286cd61-b997-4cd9-a139-88eeab79339b,Standard,55b3d03f-2204-4ab3-84cc-a28476868c9d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +011c1cb7-a03a-448d-8ea0-40ebe2336949,Standard,732f83b0-b9c5-4b8e-86fe-753c26f40e78,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.75141243,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +2a1e5940-c981-4e19-b8b3-c9816f9b0da1,Standard,6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8700565,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" f53a49a2-00a5-45cf-8734-476821a46456,Standard,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 1f187c3f-498b-4c02-89ed-e7b03ad410fd,Standard,fd4f6232-c28d-4fc3-81dd-03b84aad695e,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,1],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +3179b868-7036-4f0e-abe8-8c97a7ec9e27,Standard,9502fd3e-c00f-48fa-8b56-c72d21f80f3c,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.7740113,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1f91737b-2808-4986-839c-4d8238dbbb35,Standard,60173008-809d-4d8f-b06a-3c4a838dd989,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.47540984],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +0a69cd3e-8a0d-40f9-b117-fd62a1e6bf7c,Standard,9d10a92f-576d-4777-99ff-59d145924fea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 4aaa58c6-e6b1-4cf2-81a6-aa6fa312bab1,Standard,4f78fe6d-3cb2-4d99-8c67-4f14cb626813,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -0bab2fbe-f6c5-4f9f-bc3c-683683374b11,Standard,17f7a477-d9c7-4f58-8ba0-1a2694dcc874,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76271186,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ceb5394a-78c5-4f94-a4dc-ad051fedfa17,Standard,032768b4-2426-4abf-806b-83813ac5137a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.14689266,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -86550a99-c324-413d-aa27-2ebf243249e9,Standard,d5489e1b-0e7e-4ca9-a362-09c23576a622,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dd5aefc9-bf4f-4647-8a7f-9a618b912074,Standard,535b3fa4-ed67-4ab1-9a68-e7db83e05967,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.09039548,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -aa57fd6a-7f6d-45df-aa28-1dc626abe782,Standard,d82fae59-844a-4c85-997e-326dd876137c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5b351429-1d9d-470f-b303-b2559b5882a4,Standard,9baae5ff-40e3-48cb-9ddf-de6d1c133e13,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +331a5334-f99e-486b-a8f2-11891bd1dcef,Standard,ed4697fd-016c-40c2-a66b-e793878dadea,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.25423729,0.75409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +af28cad4-4552-4974-97f8-31396b30409e,Standard,85ea3976-1779-4d46-bd6f-dfd36427ebdf,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.14754098],[0.23728814,0.14754098]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e9774353-a9b8-4e3d-a17a-0748c2c26e92,Standard,00bbc353-d47e-4865-a696-fe5d29b9e6a2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +2b0f09af-6760-4fdc-8661-6688c100191f,Standard,2645e336-b0df-4d1e-a0ea-375444488f06,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.8079096,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +37b0bed2-ead9-4541-bce0-3a8df610b7f8,Standard,eb125953-31d3-4207-adf7-aba3a3790d6f,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84180791,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a6267f4c-d751-4f99-ade6-237d737fb745,Standard,86af5351-87ef-49c6-bd17-673dceecee5b,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.6779661,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +3080afb0-0cdc-4641-ae10-71c05a48fa0f,Standard,92301422-94ae-48ab-89c7-a69eea9450b2,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.24590164],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +1e9fb4ca-4c4b-43d5-85c9-85eeb238315b,Standard,61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.72881356,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9351e508-9479-428c-bf86-67de77dc2b37,Standard,c8b1fd67-2f03-4153-8ed3-284e7a721ec5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4d9cd1b8-f525-48eb-b280-2271ed073d67,Standard,5f1c776c-6935-40f7-ba9e-60646e08992b,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.1147541],[0.11299435,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +80ee9fdd-b0c4-42e2-835d-abcb120e323d,Standard,9f95c733-71e2-4bf0-a27a-70144518ea2c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b4cc5801-2bf1-4448-be4d-05778e033eaa,Standard,95ced3b5-69fd-4171-9c34-f18802064e22,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +ba6759b8-89a7-4b38-b5d6-eb17db1e212b,Standard,b179c38b-5af0-4304-84b1-1dc03314fd80,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66666667,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +2ffc1daf-fd76-4180-8274-6c57ae461e14,Standard,b9a28095-68f7-44c1-9ccc-6efc5ea84c59,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.31073446,0.06557377],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +d83e93ac-d76b-48ce-b1c2-511a116595ab,Standard,366a70fb-8d7f-4201-9eca-0fcbc839239d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +8119e1cc-7122-4551-8cac-6724df1d786c,Standard,de5ee252-ebb6-42b0-875c-77ae557ffbf6,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.90960452,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9c1050be-a40a-42da-9f0b-b91aa206b0ce,Standard,06b7f21a-d6d7-4ec0-94c6-141845f14986,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.45901639],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +66600910-c787-475c-9892-98098f6afdac,Standard,196fe620-d4a7-45f9-93ad-0579e2bcbb9a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.96610169,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +d684e588-01fe-4b87-adea-a193f9584846,Standard,c5457e35-ad81-4427-9d3a-99e4c44ccae8,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.78531073,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +a17793fb-5615-4b2f-94f3-74d11ec8933c,Standard,97ae0aa4-bf05-4b88-8020-83cbda415d22,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70621469,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +b9dcea5f-f318-419f-a714-fd51caa60fe0,Standard,5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66101695,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +77604c41-ad4e-4786-8ba5-a0da0af7241a,Standard,012c9eee-86c2-494c-adcc-bbfc481e4a46,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.82485876,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +bdd060c8-0636-4042-bedf-0acbd1244bdf,Standard,890f2162-b4cb-49e7-a16f-4b552c5e245c,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.1147541],[0.23728814,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +e7ce727f-dc6c-4c81-ab20-ef6d5b0c247c,Standard,fd534474-cd65-47aa-8005-dc50d17d6920,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.20338983,0.66393443],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +8566c6b6-ae20-42aa-b709-dfbbbf563208,Standard,86dfce49-05b2-4208-a6ae-877c3e98e6be,"{""type"":""LineString"",""coordinates"":[[0.14124294,0.07377049],[0.17514124,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +bb372eec-e66c-4eed-b87d-15370feab1be,Standard,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71186441,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +3df7db14-eec4-45ba-93df-fb179ede15ef,Standard,dd9d4153-c56f-4457-ad5e-46a48d4486b6,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89265537,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" 33b5bbcc-1274-4bf2-8b03-e46eba03f7d1,Standard,5dfd45b8-48e7-42fd-ac53-cc57455486b5,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84180791,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -49bff912-4ea7-4274-bae4-95bc9c12219b,Standard,1dcddd06-f41a-405b-9686-7f7942852196,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.69491525,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +4a71a58f-2e89-4a01-a76d-41c57d65fd5a,Standard,b32c5f5e-b6b8-41ed-a192-078e1aed05ac,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +098f365b-4ec3-472c-b137-2525bfa4a7af,Standard,b7a5be0d-2662-41b2-99c6-3b8121a75e9e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62146893,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5dc5e9c0-f62a-40f0-a52e-8dfe9d145291,Standard,d7023c15-adb7-4d56-9f86-b182611a47ef,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +5be3829e-2848-4b72-9cb6-61aefec4e172,Standard,970cf93c-36c5-4938-a7e4-3f184a7035f0,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.70056497,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +7855bf17-05c0-4ed4-b1c0-b3dcd6fd24df,Standard,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88135593,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +7d4efdca-c7e6-476d-9f28-56aa019c054b,Standard,2f64bf67-cee9-44bb-8c13-ff96878932af,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +9be737eb-c6f9-4b03-8dab-55e43dc6ecc6,Standard,a7ebd30b-b843-405f-9fae-ca6b489601f9,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +31c8d1f9-a00e-4392-ae33-da09323f0b4c,Standard,67af7db0-0fd8-4657-bb4f-43a2141b9f73,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62711864,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +50d3de73-c426-423c-84ef-1504296396bd,Standard,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.07377049],[0.11299435,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" +84387c6a-225a-44c5-be9c-bd19573fa19a,Standard,f6a31362-8b0d-4926-b0d0-10bb61db20df,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83050847,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" +94684e7b-92e8-4976-8c16-4a4c80a0a027,Standard,1a8ba1a5-3cee-4791-b21b-f17b08526873,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.2295082],[0.11299435,0.2295082]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" 4a7746dc-01ce-4dd4-94b3-0778d9ded0b9,Standard,666757e2-292e-473c-ac9c-04c0786574bc,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.81355932,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ecd0e92a-9446-48ab-b6e2-43942575db1b,Standard,55caf2ec-a21b-4afd-8830-1e4009cce396,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.66666667,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e328034d-d8f4-42ec-874e-3cb06d91bb3e,Standard,9d02ea80-98d8-4cd0-a635-9104a14a56dd,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84180791,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a7344637-1266-45f3-af15-ca5dfe9d77c5,Standard,205fcee1-928c-4374-950c-34575f07fa49,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.63276836,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e1b94071-73d2-4f2a-b5e6-3899a7689e54,Standard,d8c35123-b389-4199-84f9-d417d24bb78d,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79661017,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -089192f0-e01c-4959-876f-b4f049da0941,Standard,50164699-2018-4b17-b3f1-74b082f27403,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.89830508,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5f72658c-b370-4424-b2b1-61c5368a6b9a,Standard,011e3794-3341-4376-839c-3f5a452e15ab,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.68926554,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -dc6febac-9d01-4142-a73a-dba92b98395a,Standard,a4a44d93-48d6-4b87-8053-87fe0778e75c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.73446328,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -ee1d5114-5f69-4ff9-91e9-273d8437e2ae,Standard,f66df6fa-3dfa-4515-85d7-54d0f429fde7,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92655367,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -1306ee4a-e876-4ac6-b981-aab5e6e23406,Standard,535843a3-cf93-412f-b4d7-585337791ba8,"{""type"":""LineString"",""coordinates"":[[0.07909605,0.18852459],[0.11299435,0.18852459]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -b7477d53-b5db-41d6-9e70-3628e24d5a3d,Standard,033d0230-4aee-47cf-91f9-81f5f40e60b0,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.77966102,0.96721311],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -51422821-5966-4151-92c6-cc6150951f81,Standard,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.76836158,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -6c94d627-6100-4aec-9a3e-6e04edf1d2fc,Standard,69efeb2d-9845-49ac-8500-5e017a7a64ef,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.94915254,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -9f2a5f75-9c3c-4f6f-9000-3f2b983afd72,Standard,3a2f199c-2966-4b9a-939b-3a6c9924341c,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.62711864,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -da7db7bf-0857-4f45-8abd-426f62aed003,Standard,b22c9299-5fb4-46a7-b566-fc17e0d51d60,"{""type"":""LineString"",""coordinates"":[[0.00564972,0.04098361],[0.03954802,0.04098361]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -f357848e-d0e0-44db-8228-b938eefe8d86,Standard,a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.92090395,0.04918033],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -bb372eec-e66c-4eed-b87d-15370feab1be,Standard,ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.71186441,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b8697183-05ca-4701-a2e3-d0d25be61acd,Standard,41414318-73e3-4bdc-8147-570a96b28d37,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85875706,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -44cda5d8-348f-4204-99cb-0ec4baae9cff,Standard,6678c226-c5d2-4ce3-9728-dc1163be799f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.85310734,0.25409836],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -69b740cc-a143-4e1b-bfa6-22f8baa163d1,Standard,b608d71e-3ede-4156-a015-3f6e1d22242a,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.80225989,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -b73cff24-aa97-493e-9da3-8aa3ad414215,Standard,99e26ef8-75e2-46f3-aafc-6287bf5e3905,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.87570621,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -a4b9788d-431a-414a-b3ac-809fca527237,Standard,b237dd88-bcba-4a7c-aee6-c0c3e151e14e,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.9039548,0.89344262],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -e815c65b-2b44-4afb-a73b-7da1a0df6a15,Standard,8f2ba96f-a47a-46d3-b5a1-d19de0a32419,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.79096045,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -09be2147-da4d-4f8c-ae3b-c241653d1fce,Standard,eb21d716-1b54-4dba-bdc2-d1f6752aef85,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.88700565,0.36885246],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -5b899ffc-48b1-4ffd-bb7c-dfe2d727bbb0,Standard,ee384ace-040e-4f21-8a8a-d702ab51af55,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.07377049],[0.23728814,0.07377049]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -a9b3d323-e2bd-4d53-9de9-82ac9185cdfe,Standard,8254d91b-e5da-4402-bb8f-301eafa09d28,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.83615819,0.77868852],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -11f61a48-2d5c-4916-8180-def8544d16c6,Standard,c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.74011299,0.44262295],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -fb4d855c-83a0-435d-a08a-15c8716f2e7c,Standard,ffcaf979-d707-4d25-8f46-f436f9792d7f,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.84745763,0.57377049],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -bdd060c8-0636-4042-bedf-0acbd1244bdf,Standard,890f2162-b4cb-49e7-a16f-4b552c5e245c,"{""type"":""LineString"",""coordinates"":[[0.20338983,0.1147541],[0.23728814,0.1147541]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}" -70e6914f-0cad-4319-9ae3-7cd5482152ea,Standard,e25387d0-ab9a-406d-bcb4-555414b88b1b,"{""type"":""LineString"",""coordinates"":[[12.8273,52.2895],[12.8273,52.2895]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.86440678,0.14754098],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" -83c21903-e94d-4b2a-a933-8cc984d28f24,Standard,ce71377d-63ea-462a-9290-67e51946a098,"{""type"":""LineString"",""coordinates"":[[7.4116482,51.4843281],[7.4116482,51.4843281]],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}","{""type"":""Point"",""coordinates"":[0.91525424,0.67213115],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}" diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_input.csv index ea7730d07..ed5f60217 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/node_input.csv @@ -1,300 +1,300 @@ uuid,geo_position,id,operates_from,operates_until,operator,slack,subnet,v_rated,v_target,volt_lvl -6a4547a8-630b-46e4-8144-9cd649e67c07,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(12),,,,false,126,0.4,1.0,Niederspannung -b7a5be0d-2662-41b2-99c6-3b8121a75e9e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(31),,,,false,146,0.4,1.0,Niederspannung -1396cb4c-cee7-4116-97c9-290f98785719,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS1_04,,,,false,11,20.0,1.0,Mittelspannung -1dcddd06-f41a-405b-9686-7f7942852196,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(25),,,,false,126,0.4,1.0,Niederspannung -e80aa2db-f32c-410d-96a1-a32e03222568,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(18),,,,false,126,0.4,1.0,Niederspannung +4303784e-7193-454a-9be4-3591400b4eeb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(1),,,,false,126,0.4,1.0,Niederspannung +f5839ade-5968-4879-a824-90b5fb3552cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_01,,,,false,11,20.0,1.0,Mittelspannung +177a20fe-83b1-46df-94a3-4faa54348d10,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(22),,,,false,126,0.4,1.0,Niederspannung +e2267696-669b-48e8-b43a-37d0db95011d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(11),,,,false,146,0.4,1.0,Niederspannung +39112046-8953-4e73-a5d9-6a8183a77436,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_1,,,,false,116,0.4,1.0,Niederspannung +1a1e63f7-6196-4856-9f4e-876a44bdf2f8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(23),,,,false,146,0.4,1.0,Niederspannung +7125de08-1d28-409a-8b23-023a0294def5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(17),,,,false,126,0.4,1.0,Niederspannung +922a6375-b97c-412e-a6c9-b0ea55a23f76,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(19),,,,false,126,0.4,1.0,Niederspannung +3d81adf5-73d1-4708-b03b-3afc7db017f4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(10),,,,false,126,0.4,1.0,Niederspannung e3c3c6a3-c383-4dbb-9b3f-a14125615386,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(6),,,,false,146,0.4,1.0,Niederspannung -ead38a50-b8f7-4bbb-b65d-f54350825e8e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(1),,,,false,146,0.4,1.0,Niederspannung -df97c0d1-379b-417a-a473-8e7fe37da99d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS2_06,,,,false,12,20.0,1.0,Mittelspannung -366a70fb-8d7f-4201-9eca-0fcbc839239d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(8),,,,false,126,0.4,1.0,Niederspannung -196fe620-d4a7-45f9-93ad-0579e2bcbb9a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(1),,,,false,126,0.4,1.0,Niederspannung +2a816043-d1d2-44a6-8a9b-f61a4933997b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S3_4,,,,false,136,0.4,1.0,Niederspannung 1ee9de9a-0095-4b58-beeb-e56fb908844a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(22),,,,false,146,0.4,1.0,Niederspannung -904c7476-5f16-4ec2-9138-7d5e32d38a3b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(39),,,,false,146,0.4,1.0,Niederspannung -c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_05,,,,false,11,20.0,1.0,Mittelspannung +450426ac-a560-4d17-b1fc-9e169530a655,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(37),,,,false,146,0.4,1.0,Niederspannung +32b3bb19-c52a-4a19-890a-94a8918d38a9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS1_02,,,,false,11,20.0,1.0,Mittelspannung +1dcddd06-f41a-405b-9686-7f7942852196,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(25),,,,false,126,0.4,1.0,Niederspannung +857c264a-7072-4bb7-af56-2f01539b2a2e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(10),,,,false,126,0.4,1.0,Niederspannung bb59ca46-1f2e-41c9-9723-90b306f043cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS3_01,,,,false,13,20.0,1.0,Mittelspannung -890f2162-b4cb-49e7-a16f-4b552c5e245c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS4_04,,,,false,14,20.0,1.0,Mittelspannung +32507a10-1eed-4a3f-820c-bc187f3b052e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(38),,,,false,146,0.4,1.0,Niederspannung +b22c9299-5fb4-46a7-b566-fc17e0d51d60,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS1_06,,,,false,11,20.0,1.0,Mittelspannung +e80aa2db-f32c-410d-96a1-a32e03222568,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(18),,,,false,126,0.4,1.0,Niederspannung ee384ace-040e-4f21-8a8a-d702ab51af55,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_05,,,,false,14,20.0,1.0,Mittelspannung -174fb4b2-4f9e-415c-bfee-d850ef751307,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS4_02,,,,false,14,20.0,1.0,Mittelspannung -5071dd8c-bbc1-4c8d-a180-4492f80e183d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(6),,,,false,146,0.4,1.0,Niederspannung -39112046-8953-4e73-a5d9-6a8183a77436,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_1,,,,false,116,0.4,1.0,Niederspannung -1a1e63f7-6196-4856-9f4e-876a44bdf2f8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(23),,,,false,146,0.4,1.0,Niederspannung -9d7038e9-5bcc-4676-bead-46c4f1291ba8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(6),,,,false,126,0.4,1.0,Niederspannung -99e26ef8-75e2-46f3-aafc-6287bf5e3905,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(6),,,,false,126,0.4,1.0,Niederspannung +d5489e1b-0e7e-4ca9-a362-09c23576a622,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(8),,,,false,146,0.4,1.0,Niederspannung +67c1746c-3af8-403f-983e-1c7c047383df,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(7),,,,false,146,0.4,1.0,Niederspannung +270c7266-45dc-4e45-829f-c04f6b631cad,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(11),,,,false,126,0.4,1.0,Niederspannung +4db634e5-3eb8-4c17-bc44-eb224667580c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(7),,,,false,126,0.4,1.0,Niederspannung +5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(28),,,,false,126,0.4,1.0,Niederspannung +1bf26b4d-03cc-4490-8c33-d3db8597d807,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(25),,,,false,126,0.4,1.0,Niederspannung +c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_05,,,,false,11,20.0,1.0,Mittelspannung +636dec7c-4242-46e8-b7ae-db7e5a28c39c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(19),,,,false,146,0.4,1.0,Niederspannung +6232b760-b2e0-485e-9c61-f9721a366a81,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(16),,,,false,126,0.4,1.0,Niederspannung +97ae0aa4-bf05-4b88-8020-83cbda415d22,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(24),,,,false,126,0.4,1.0,Niederspannung +06b7f21a-d6d7-4ec0-94c6-141845f14986,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(38),,,,false,126,0.4,1.0,Niederspannung +ce513b50-b57a-41e2-b744-4c0fd2ae97d0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(23),,,,false,146,0.4,1.0,Niederspannung +ff947647-b551-41ae-bcfd-6af228250c96,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(4),,,,false,126,0.4,1.0,Niederspannung b73208dd-f4a8-4e90-bf2d-7ea67a89525a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(14),,,,false,146,0.4,1.0,Niederspannung -fa6d5184-b205-4b1b-839f-7b21ac956c29,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS4_06,,,,false,14,20.0,1.0,Mittelspannung -c5457e35-ad81-4427-9d3a-99e4c44ccae8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(17),,,,false,126,0.4,1.0,Niederspannung -4a6f6058-e654-464d-9367-2dca7185c6d7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_1,,,,false,116,0.4,1.0,Niederspannung -de756ddb-793d-4b2d-959c-59d938a8f61f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(20),,,,false,126,0.4,1.0,Niederspannung -df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_3,,,,false,116,0.4,1.0,Niederspannung -ca3391eb-ca94-4945-ac72-e116f396f82c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(36),,,,false,126,0.4,1.0,Niederspannung -666757e2-292e-473c-ac9c-04c0786574bc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(11),,,,false,146,0.4,1.0,Niederspannung -22e58399-428f-4633-9ee4-e5fa0db68d6d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(1),,,,false,146,0.4,1.0,Niederspannung -17f7a477-d9c7-4f58-8ba0-1a2694dcc874,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(34),,,,false,126,0.4,1.0,Niederspannung -2287c2a8-c2d0-4c63-80b5-6b66a1288df8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(25),,,,false,146,0.4,1.0,Niederspannung -6678c226-c5d2-4ce3-9728-dc1163be799f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(11),,,,false,126,0.4,1.0,Niederspannung -40537c84-c812-4231-bd23-0ba81922e937,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(17),,,,false,146,0.4,1.0,Niederspannung -2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(1),,,,false,126,0.4,1.0,Niederspannung -e05c68b1-11cd-43fd-a4b2-31e4db380c78,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_4,,,,false,116,0.4,1.0,Niederspannung -f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(7),,,,false,146,0.4,1.0,Niederspannung -792b505c-87ab-4665-a31d-b6035c5ece70,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(8),,,,false,146,0.4,1.0,Niederspannung +fd534474-cd65-47aa-8005-dc50d17d6920,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_3,,,,false,136,0.4,1.0,Niederspannung +00bbc353-d47e-4865-a696-fe5d29b9e6a2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(15),,,,false,146,0.4,1.0,Niederspannung +625bdd2c-a75f-46ef-850c-ca4704d56e55,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(24),,,,false,126,0.4,1.0,Niederspannung +b7baa286-cbe2-4143-a08f-4e025af47529,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(14),,,,false,126,0.4,1.0,Niederspannung +4632291f-80d7-4e4a-9dc9-5c0fd0c56312,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(10),,,,false,146,0.4,1.0,Niederspannung +33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(23),,,,false,126,0.4,1.0,Niederspannung 86dfce49-05b2-4208-a6ae-877c3e98e6be,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS3_05,,,,false,13,20.0,1.0,Mittelspannung -d5b861a6-2a5b-4dec-a66e-adbfc6d62873,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(27),,,,false,126,0.4,1.0,Niederspannung +55b3d03f-2204-4ab3-84cc-a28476868c9d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(15),,,,false,126,0.4,1.0,Niederspannung 67af7db0-0fd8-4657-bb4f-43a2141b9f73,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(31),,,,false,126,0.4,1.0,Niederspannung -27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(29),,,,false,126,0.4,1.0,Niederspannung +9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(14),,,,false,146,0.4,1.0,Niederspannung +b3a7431d-89b0-41cb-87a9-5853890796cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_4,,,,false,116,0.4,1.0,Niederspannung +155bb2dc-0121-413e-ab42-67c2ed5ce6ea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(17),,,,false,146,0.4,1.0,Niederspannung +c5af5a34-211a-4105-a8e1-f447140073c6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_5,,,,false,136,0.4,1.0,Niederspannung +49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(6),,,,false,146,0.4,1.0,Niederspannung +e05c68b1-11cd-43fd-a4b2-31e4db380c78,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_4,,,,false,116,0.4,1.0,Niederspannung +b7a5be0d-2662-41b2-99c6-3b8121a75e9e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(31),,,,false,146,0.4,1.0,Niederspannung +eb95ff15-56db-4463-bb54-0ee131167812,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_3,,,,false,136,0.4,1.0,Niederspannung +eb125953-31d3-4207-adf7-aba3a3790d6f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(12),,,,false,126,0.4,1.0,Niederspannung +00d03670-7833-47ee-ad52-04d18d1c64fd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",HS_NET1_Station_1,,,,false,1,110.0,1.0,Hochspannung +f2d03b34-9595-4819-a00b-ff9ddd92eb07,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(14),,,,false,146,0.4,1.0,Niederspannung +462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(17),,,,false,126,0.4,1.0,Niederspannung +535843a3-cf93-412f-b4d7-585337791ba8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS2_02,,,,false,12,20.0,1.0,Mittelspannung +5dfd45b8-48e7-42fd-ac53-cc57455486b5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(9),,,,false,126,0.4,1.0,Niederspannung +61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(22),,,,false,126,0.4,1.0,Niederspannung +85ea3976-1779-4d46-bd6f-dfd36427ebdf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_03,,,,false,14,20.0,1.0,Mittelspannung +31a2b9bf-e785-4475-aa44-1c34646e8c79,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_ONS,,,,false,116,0.4,1.0,Niederspannung +6678c226-c5d2-4ce3-9728-dc1163be799f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(11),,,,false,126,0.4,1.0,Niederspannung +17f7a477-d9c7-4f58-8ba0-1a2694dcc874,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(34),,,,false,126,0.4,1.0,Niederspannung +a5c73608-5a85-495d-bea0-df77b6ce66ea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(9),,,,false,146,0.4,1.0,Niederspannung +c5457e35-ad81-4427-9d3a-99e4c44ccae8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(17),,,,false,126,0.4,1.0,Niederspannung +36cda100-86ae-4a20-ac71-20af603ac0cf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(20),,,,false,126,0.4,1.0,Niederspannung +6570535c-0d2e-4846-9951-21559902f67a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(9),,,,false,146,0.4,1.0,Niederspannung +dc022eec-16b0-4a64-a2f5-498d81aca71e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(26),,,,false,126,0.4,1.0,Niederspannung +50164699-2018-4b17-b3f1-74b082f27403,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(7),,,,false,126,0.4,1.0,Niederspannung +40537c84-c812-4231-bd23-0ba81922e937,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(17),,,,false,146,0.4,1.0,Niederspannung +7d45f0ab-1e6b-452f-b665-c4846cf046f5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(20),,,,false,146,0.4,1.0,Niederspannung 119d270a-ff22-4fdb-8214-cb5b336790bf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(9),,,,false,126,0.4,1.0,Niederspannung -9502fd3e-c00f-48fa-8b56-c72d21f80f3c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(18),,,,false,126,0.4,1.0,Niederspannung -a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(4),,,,false,126,0.4,1.0,Niederspannung +6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(8),,,,false,146,0.4,1.0,Niederspannung +c81d6099-66b2-45d8-b8a4-c19ceb862f6e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(27),,,,false,126,0.4,1.0,Niederspannung +f1e55c8b-357f-45a7-9d57-e299f9b207f3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(13),,,,false,146,0.4,1.0,Niederspannung +fd4f6232-c28d-4fc3-81dd-03b84aad695e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(34),,,,false,146,0.4,1.0,Niederspannung +ae234bc5-b751-41f2-95ee-b78de124c583,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(15),,,,false,126,0.4,1.0,Niederspannung c317a6cd-428b-4c36-8233-91d0c4e2717a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(22),,,,false,126,0.4,1.0,Niederspannung -0d94a5ea-3a13-48ba-a27f-b2903841c334,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(17),,,,false,146,0.4,1.0,Niederspannung -b6b1b9fc-e7d8-492d-8601-84c1e756bd83,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS3_02,,,,false,13,20.0,1.0,Mittelspannung -922a6375-b97c-412e-a6c9-b0ea55a23f76,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(19),,,,false,126,0.4,1.0,Niederspannung -41414318-73e3-4bdc-8147-570a96b28d37,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(10),,,,false,146,0.4,1.0,Niederspannung -e018b95e-fca5-40f7-8550-b05a619169dc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(6),,,,false,126,0.4,1.0,Niederspannung -e2267696-669b-48e8-b43a-37d0db95011d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(11),,,,false,146,0.4,1.0,Niederspannung -dd9d4153-c56f-4457-ad5e-46a48d4486b6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(4),,,,false,146,0.4,1.0,Niederspannung -f5839ade-5968-4879-a824-90b5fb3552cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_01,,,,false,11,20.0,1.0,Mittelspannung -f717b05b-f4e7-43d9-af9e-638e2badee5a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(8),,,,false,126,0.4,1.0,Niederspannung -1dee13af-e638-4858-9c69-0069190cd577,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(21),,,,false,126,0.4,1.0,Niederspannung -97ae0aa4-bf05-4b88-8020-83cbda415d22,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(24),,,,false,126,0.4,1.0,Niederspannung -b37ea333-65e1-4211-8449-993b67e8e0e2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(2),,,,false,146,0.4,1.0,Niederspannung -85ea3976-1779-4d46-bd6f-dfd36427ebdf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_03,,,,false,14,20.0,1.0,Mittelspannung -bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(7),,,,false,146,0.4,1.0,Niederspannung -67c1746c-3af8-403f-983e-1c7c047383df,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(7),,,,false,146,0.4,1.0,Niederspannung -5981fe65-3c92-4a78-af92-1461904046d0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(2),,,,false,126,0.4,1.0,Niederspannung -bf7e7268-2fb6-4948-ace6-9037ae148fa3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(4),,,,false,126,0.4,1.0,Niederspannung -39dbc5ed-d874-48a8-9128-e970436a94b4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS3_06,,,,false,13,20.0,1.0,Mittelspannung -94713e6c-c47e-422c-8ab3-2a2903b7dcd2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(23),,,,false,126,0.4,1.0,Niederspannung -32507a10-1eed-4a3f-820c-bc187f3b052e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(38),,,,false,146,0.4,1.0,Niederspannung -9d10a92f-576d-4777-99ff-59d145924fea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(12),,,,false,126,0.4,1.0,Niederspannung -857c264a-7072-4bb7-af56-2f01539b2a2e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(10),,,,false,126,0.4,1.0,Niederspannung -d2aff632-fc26-4595-931c-92e266247ac8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(19),,,,false,126,0.4,1.0,Niederspannung -d5489e1b-0e7e-4ca9-a362-09c23576a622,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(8),,,,false,146,0.4,1.0,Niederspannung -0f3ba59d-a9ce-4669-aa12-bebec42238b7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(17),,,,false,146,0.4,1.0,Niederspannung -bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(9),,,,false,126,0.4,1.0,Niederspannung -926d6113-933f-49e3-9529-a3035acdc9b2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET136_S1_5,,,,false,136,0.4,1.0,Niederspannung -da79c960-d35a-4193-9b06-2d4d57051706,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(13),,,,false,126,0.4,1.0,Niederspannung -f6a31362-8b0d-4926-b0d0-10bb61db20df,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(10),,,,false,126,0.4,1.0,Niederspannung -3da4fd3d-ac5e-409d-91fa-36516673cf57,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_ONS,,,,false,146,0.4,1.0,Niederspannung -ff947647-b551-41ae-bcfd-6af228250c96,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(4),,,,false,126,0.4,1.0,Niederspannung -75f2dfb9-75a0-496d-9c44-79e7df54c1df,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(8),,,,false,126,0.4,1.0,Niederspannung -92301422-94ae-48ab-89c7-a69eea9450b2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET116_S1_5,,,,false,116,0.4,1.0,Niederspannung -cbcfc3b6-ac90-4215-975c-a033f5cf9912,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_2,,,,false,136,0.4,1.0,Niederspannung -0ebf0088-f596-4cd1-9ae0-5da02dc40335,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(20),,,,false,146,0.4,1.0,Niederspannung -155bb2dc-0121-413e-ab42-67c2ed5ce6ea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(17),,,,false,146,0.4,1.0,Niederspannung -c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(35),,,,false,126,0.4,1.0,Niederspannung -bdf97a4d-622c-4251-8183-8b1a696f376e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(13),,,,false,146,0.4,1.0,Niederspannung -2c520ab6-507e-4dcf-ab05-8f238e9b9385,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(1),,,,false,146,0.4,1.0,Niederspannung -2f64bf67-cee9-44bb-8c13-ff96878932af,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(18),,,,false,126,0.4,1.0,Niederspannung -d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_ONS,,,,false,136,0.4,1.0,Niederspannung -8f80e777-ccbd-4630-b10e-238e824113fd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(36),,,,false,146,0.4,1.0,Niederspannung -625bdd2c-a75f-46ef-850c-ca4704d56e55,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(24),,,,false,126,0.4,1.0,Niederspannung -01bdd8b2-145f-42b3-80e3-a2366dea1044,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(6),,,,false,146,0.4,1.0,Niederspannung -c7e09266-c778-433b-b01a-5fb9e298ea8e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(2),,,,false,126,0.4,1.0,Niederspannung -a7ebd30b-b843-405f-9fae-ca6b489601f9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(2),,,,false,126,0.4,1.0,Niederspannung -0228ffcd-f6bc-47c8-b26c-fcc0abacd963,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(5),,,,false,146,0.4,1.0,Niederspannung -8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(3),,,,false,146,0.4,1.0,Niederspannung +d8c35123-b389-4199-84f9-d417d24bb78d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(16),,,,false,126,0.4,1.0,Niederspannung 2c5d4eda-6b33-4ad5-a135-7037baa7d6eb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S3_3,,,,false,136,0.4,1.0,Niederspannung -732f83b0-b9c5-4b8e-86fe-753c26f40e78,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(20),,,,false,126,0.4,1.0,Niederspannung -c81d6099-66b2-45d8-b8a4-c19ceb862f6e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(27),,,,false,126,0.4,1.0,Niederspannung -7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(30),,,,false,146,0.4,1.0,Niederspannung -401f37f8-6f2c-4564-bc78-6736cb9cbf8d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",HS_NET1_Station_4,,,,false,1,110.0,1.0,Hochspannung -85ec9277-c5fd-4e5b-8a34-9627d9599ad7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(18),,,,false,146,0.4,1.0,Niederspannung -14ae9865-cb9b-4518-9f2a-c0fda3455a42,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(21),,,,false,126,0.4,1.0,Niederspannung -69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_03,,,,false,12,20.0,1.0,Mittelspannung -b5548457-5923-4d52-b3c9-fdb75a1df98e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(3),,,,false,146,0.4,1.0,Niederspannung -e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_3,,,,false,116,0.4,1.0,Niederspannung -49e14db3-a4bc-464a-b606-653ac8a604dd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(13),,,,false,146,0.4,1.0,Niederspannung -f66df6fa-3dfa-4515-85d7-54d0f429fde7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(4),,,,false,146,0.4,1.0,Niederspannung -012c9eee-86c2-494c-adcc-bbfc481e4a46,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(28),,,,false,146,0.4,1.0,Niederspannung -b179c38b-5af0-4304-84b1-1dc03314fd80,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(27),,,,false,146,0.4,1.0,Niederspannung -6570535c-0d2e-4846-9951-21559902f67a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(9),,,,false,146,0.4,1.0,Niederspannung -31a2b9bf-e785-4475-aa44-1c34646e8c79,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_ONS,,,,false,116,0.4,1.0,Niederspannung -69efeb2d-9845-49ac-8500-5e017a7a64ef,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(2),,,,false,146,0.4,1.0,Niederspannung +bf7e7268-2fb6-4948-ace6-9037ae148fa3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(4),,,,false,126,0.4,1.0,Niederspannung f6eff0d1-af6b-46ce-b430-4d30976ec08f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(12),,,,false,146,0.4,1.0,Niederspannung -4258f215-5b22-446f-a260-e8cdaa7c95d1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(11),,,,false,126,0.4,1.0,Niederspannung -867c4b4d-0f38-4f28-82ce-135f2cc63808,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(29),,,,false,146,0.4,1.0,Niederspannung -d69efff2-ba8b-4aa6-a4a1-27267964147a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_3,,,,false,116,0.4,1.0,Niederspannung -a286f73a-20ee-4056-8129-c7963b34ecd9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(9),,,,false,126,0.4,1.0,Niederspannung -7125de08-1d28-409a-8b23-023a0294def5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(17),,,,false,126,0.4,1.0,Niederspannung -ae234bc5-b751-41f2-95ee-b78de124c583,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(15),,,,false,126,0.4,1.0,Niederspannung -5e213f42-d93e-45c5-a295-adbe09105746,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(31),,,,false,146,0.4,1.0,Niederspannung -52e15712-2572-442a-b22c-add48af95115,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(19),,,,false,126,0.4,1.0,Niederspannung -49b511fa-8cff-45f4-9a59-54faaaf90abf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(32),,,,false,126,0.4,1.0,Niederspannung -ce71377d-63ea-462a-9290-67e51946a098,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(5),,,,false,146,0.4,1.0,Niederspannung -c5af5a34-211a-4105-a8e1-f447140073c6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_5,,,,false,136,0.4,1.0,Niederspannung -4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_1,,,,false,136,0.4,1.0,Niederspannung -2a816043-d1d2-44a6-8a9b-f61a4933997b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S3_4,,,,false,136,0.4,1.0,Niederspannung -ffcaf979-d707-4d25-8f46-f436f9792d7f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(10),,,,false,146,0.4,1.0,Niederspannung -e4502c52-b4d7-4082-a583-b5688d8244e0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS3_03,,,,false,13,20.0,1.0,Mittelspannung -4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS3_04,,,,false,13,20.0,1.0,Mittelspannung -cdda8fa5-9a18-4f3e-951d-1ec0009191b4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(4),,,,false,126,0.4,1.0,Niederspannung +e4c8b492-965c-4b5a-8d14-e8ff2c027ce9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_3,,,,false,116,0.4,1.0,Niederspannung +f717b05b-f4e7-43d9-af9e-638e2badee5a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(8),,,,false,126,0.4,1.0,Niederspannung 616da4e5-e837-44ec-bbbc-0cd12b5da8f7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(22),,,,false,146,0.4,1.0,Niederspannung -6232b760-b2e0-485e-9c61-f9721a366a81,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(16),,,,false,126,0.4,1.0,Niederspannung -0170837a-1876-45f9-a613-666f9991964d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(3),,,,false,146,0.4,1.0,Niederspannung -2645e336-b0df-4d1e-a0ea-375444488f06,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(15),,,,false,126,0.4,1.0,Niederspannung -1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(3),,,,false,126,0.4,1.0,Niederspannung -205fcee1-928c-4374-950c-34575f07fa49,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(24),,,,false,146,0.4,1.0,Niederspannung -3802b603-d08d-4031-b7d7-e29734bcc122,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(26),,,,false,126,0.4,1.0,Niederspannung -7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(32),,,,false,126,0.4,1.0,Niederspannung -177a20fe-83b1-46df-94a3-4faa54348d10,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(22),,,,false,126,0.4,1.0,Niederspannung -3d81adf5-73d1-4708-b03b-3afc7db017f4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(10),,,,false,126,0.4,1.0,Niederspannung +5fe9c522-37d0-48f8-b3b8-e91b956e39f6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(17),,,,false,126,0.4,1.0,Niederspannung +9b889b73-c108-4b38-b6eb-3377841e0c83,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(9),,,,false,146,0.4,1.0,Niederspannung +85ec9277-c5fd-4e5b-8a34-9627d9599ad7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(18),,,,false,146,0.4,1.0,Niederspannung +8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(3),,,,false,146,0.4,1.0,Niederspannung 6c24b464-790a-4aae-bb11-766718f07cd5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(10),,,,false,146,0.4,1.0,Niederspannung -b22c9299-5fb4-46a7-b566-fc17e0d51d60,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS1_06,,,,false,11,20.0,1.0,Mittelspannung -32bd37df-255b-4eb2-9d16-5b711132eee6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_5,,,,false,116,0.4,1.0,Niederspannung -00d4a837-f09c-41df-bed1-dfdb78387116,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(4),,,,false,146,0.4,1.0,Niederspannung +3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(1),,,,false,126,0.4,1.0,Niederspannung +0f3ba59d-a9ce-4669-aa12-bebec42238b7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(17),,,,false,146,0.4,1.0,Niederspannung +3ec2f2a0-36a3-4d11-88ee-cc4df001e876,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(16),,,,false,146,0.4,1.0,Niederspannung +0b2a3b46-5e43-4879-973e-d8fb96429d8a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(2),,,,false,146,0.4,1.0,Niederspannung +df8df8d2-3494-4da9-8d1b-f913d15f520f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(14),,,,false,126,0.4,1.0,Niederspannung +b179c38b-5af0-4304-84b1-1dc03314fd80,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(27),,,,false,146,0.4,1.0,Niederspannung +c5f7ffbc-2e23-46d4-9e0c-356008e5ff56,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(35),,,,false,126,0.4,1.0,Niederspannung +5981fe65-3c92-4a78-af92-1461904046d0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(2),,,,false,126,0.4,1.0,Niederspannung +3b879239-20c8-4adf-bd51-92924327ee71,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(12),,,,false,146,0.4,1.0,Niederspannung +011e3794-3341-4376-839c-3f5a452e15ab,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(25),,,,false,146,0.4,1.0,Niederspannung +cdda8fa5-9a18-4f3e-951d-1ec0009191b4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(4),,,,false,126,0.4,1.0,Niederspannung +69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(3),,,,false,126,0.4,1.0,Niederspannung +f6a31362-8b0d-4926-b0d0-10bb61db20df,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(10),,,,false,126,0.4,1.0,Niederspannung +9d02ea80-98d8-4cd0-a635-9104a14a56dd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(12),,,,false,126,0.4,1.0,Niederspannung +94713e6c-c47e-422c-8ab3-2a2903b7dcd2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(23),,,,false,126,0.4,1.0,Niederspannung +b46d4395-6724-4830-ba55-357e81fc2814,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET136_S3_2,,,,false,136,0.4,1.0,Niederspannung +b9a28095-68f7-44c1-9ccc-6efc5ea84c59,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_5,,,,false,116,0.4,1.0,Niederspannung +0ebf0088-f596-4cd1-9ae0-5da02dc40335,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(20),,,,false,146,0.4,1.0,Niederspannung +6dcdc87b-a719-416f-9da1-21a701048f3a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(8),,,,false,126,0.4,1.0,Niederspannung +92301422-94ae-48ab-89c7-a69eea9450b2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET116_S1_5,,,,false,116,0.4,1.0,Niederspannung daed3552-e382-4153-95be-97f17e2c53e5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(27),,,,false,126,0.4,1.0,Niederspannung -9b889b73-c108-4b38-b6eb-3377841e0c83,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(9),,,,false,146,0.4,1.0,Niederspannung -d82fae59-844a-4c85-997e-326dd876137c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(15),,,,false,146,0.4,1.0,Niederspannung -55caf2ec-a21b-4afd-8830-1e4009cce396,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(27),,,,false,146,0.4,1.0,Niederspannung -1bf26b4d-03cc-4490-8c33-d3db8597d807,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(25),,,,false,126,0.4,1.0,Niederspannung +09ac8949-2b79-41d7-b56f-a58f20036df2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(16),,,,false,146,0.4,1.0,Niederspannung +810bebb0-0d5c-4899-b213-3207be661248,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(19),,,,false,146,0.4,1.0,Niederspannung +8f2ba96f-a47a-46d3-b5a1-d19de0a32419,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(16),,,,false,146,0.4,1.0,Niederspannung +e018b95e-fca5-40f7-8550-b05a619169dc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(6),,,,false,126,0.4,1.0,Niederspannung +576840db-7d3c-417b-b587-28b222e740e1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(15),,,,false,146,0.4,1.0,Niederspannung +b37ea333-65e1-4211-8449-993b67e8e0e2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(2),,,,false,146,0.4,1.0,Niederspannung +14a8dc4c-0906-402f-b073-6d6d4725d0cb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_07,,,,false,12,20.0,1.0,Mittelspannung +5862f526-783a-4218-a463-3cbf5de8dade,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(22),,,,false,146,0.4,1.0,Niederspannung +99e26ef8-75e2-46f3-aafc-6287bf5e3905,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(6),,,,false,126,0.4,1.0,Niederspannung d07dc1b0-e29a-452a-84c5-7df7b0bb3141,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(15),,,,false,146,0.4,1.0,Niederspannung -f0f8f187-5dbf-46ab-8a43-d6169ab5042d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(29),,,,false,126,0.4,1.0,Niederspannung -de5ee252-ebb6-42b0-875c-77ae557ffbf6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(5),,,,false,126,0.4,1.0,Niederspannung -b608d71e-3ede-4156-a015-3f6e1d22242a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(13),,,,false,146,0.4,1.0,Niederspannung -21359dd1-7a23-4932-b656-c196fbffe751,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(18),,,,false,146,0.4,1.0,Niederspannung -f5ae3279-fe21-4bb7-849a-eaacb0546b0e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(35),,,,false,146,0.4,1.0,Niederspannung -fd3b7bb8-3976-4441-9211-745243afd80f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(32),,,,false,146,0.4,1.0,Niederspannung -a4a44d93-48d6-4b87-8053-87fe0778e75c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(21),,,,false,146,0.4,1.0,Niederspannung -32b3bb19-c52a-4a19-890a-94a8918d38a9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS1_02,,,,false,11,20.0,1.0,Mittelspannung +4a6f6058-e654-464d-9367-2dca7185c6d7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_1,,,,false,116,0.4,1.0,Niederspannung +55caf2ec-a21b-4afd-8830-1e4009cce396,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(27),,,,false,146,0.4,1.0,Niederspannung +b237dd88-bcba-4a7c-aee6-c0c3e151e14e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(3),,,,false,146,0.4,1.0,Niederspannung 95ced3b5-69fd-4171-9c34-f18802064e22,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(11),,,,false,126,0.4,1.0,Niederspannung -9b509c7d-4647-40fd-b03e-7ab919215cc6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(23),,,,false,126,0.4,1.0,Niederspannung -7546df1d-8a62-4650-bf2e-d1e441b38d70,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_07,,,,false,11,20.0,1.0,Mittelspannung -6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(8),,,,false,146,0.4,1.0,Niederspannung -ca438ab9-3abc-4416-91d1-df01d1c5fa5a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(28),,,,false,146,0.4,1.0,Niederspannung -33f29587-f63e-45b7-960b-037bda37a3cb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",HS_NET1_Station_3,,,,false,1,110.0,1.0,Hochspannung -576840db-7d3c-417b-b587-28b222e740e1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(15),,,,false,146,0.4,1.0,Niederspannung -847fd5fc-b515-4a9d-8a6f-66df1e71ded2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(13),,,,false,126,0.4,1.0,Niederspannung -09ac8949-2b79-41d7-b56f-a58f20036df2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(16),,,,false,146,0.4,1.0,Niederspannung -4632291f-80d7-4e4a-9dc9-5c0fd0c56312,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(10),,,,false,146,0.4,1.0,Niederspannung -450426ac-a560-4d17-b1fc-9e169530a655,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(37),,,,false,146,0.4,1.0,Niederspannung +0170837a-1876-45f9-a613-666f9991964d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(3),,,,false,146,0.4,1.0,Niederspannung +032768b4-2426-4abf-806b-83813ac5137a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_2,,,,false,136,0.4,1.0,Niederspannung +a12b9ded-0c19-48c2-ac19-7a3a9b7e26da,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(4),,,,false,126,0.4,1.0,Niederspannung +15345698-c319-461f-b969-37d50fb84220,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(29),,,,false,146,0.4,1.0,Niederspannung +86af5351-87ef-49c6-bd17-673dceecee5b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(26),,,,false,146,0.4,1.0,Niederspannung +f66df6fa-3dfa-4515-85d7-54d0f429fde7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(4),,,,false,146,0.4,1.0,Niederspannung +904c7476-5f16-4ec2-9138-7d5e32d38a3b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(39),,,,false,146,0.4,1.0,Niederspannung +1a8ba1a5-3cee-4791-b21b-f17b08526873,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_01,,,,false,12,20.0,1.0,Mittelspannung +a4a44d93-48d6-4b87-8053-87fe0778e75c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(21),,,,false,146,0.4,1.0,Niederspannung +926d6113-933f-49e3-9529-a3035acdc9b2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET136_S1_5,,,,false,136,0.4,1.0,Niederspannung +898d8295-bf35-4079-9374-99b059c2c956,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_07,,,,false,14,20.0,1.0,Mittelspannung +9f95c733-71e2-4bf0-a27a-70144518ea2c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(30),,,,false,146,0.4,1.0,Niederspannung +04f29760-9e52-4943-8563-62e1fbd5ed52,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(3),,,,false,126,0.4,1.0,Niederspannung +14ae9865-cb9b-4518-9f2a-c0fda3455a42,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(21),,,,false,126,0.4,1.0,Niederspannung +285a4caa-2da8-4bd2-8a60-7d04f168f378,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(2),,,,false,126,0.4,1.0,Niederspannung +732f83b0-b9c5-4b8e-86fe-753c26f40e78,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(20),,,,false,126,0.4,1.0,Niederspannung +ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(23),,,,false,146,0.4,1.0,Niederspannung +b32c5f5e-b6b8-41ed-a192-078e1aed05ac,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(13),,,,false,126,0.4,1.0,Niederspannung +ead38a50-b8f7-4bbb-b65d-f54350825e8e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(1),,,,false,146,0.4,1.0,Niederspannung +7d44fe44-8c85-4b61-9d5c-0c4304e47ba8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(32),,,,false,126,0.4,1.0,Niederspannung +3802b603-d08d-4031-b7d7-e29734bcc122,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(26),,,,false,126,0.4,1.0,Niederspannung +f26b5511-3c50-42d5-97c2-be408330eb84,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(11),,,,false,146,0.4,1.0,Niederspannung +22e58399-428f-4633-9ee4-e5fa0db68d6d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(1),,,,false,146,0.4,1.0,Niederspannung +666757e2-292e-473c-ac9c-04c0786574bc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(11),,,,false,146,0.4,1.0,Niederspannung +369cffa5-bcee-4489-8193-1d9b10230eca,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(4),,,,false,146,0.4,1.0,Niederspannung +eb21d716-1b54-4dba-bdc2-d1f6752aef85,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(5),,,,false,126,0.4,1.0,Niederspannung 543f7e9f-b9be-486b-b365-2bae79010758,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(33),,,,false,146,0.4,1.0,Niederspannung -582ed42c-fd18-49ae-bdf5-6aa59353c7e3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_05,,,,false,12,20.0,1.0,Mittelspannung -535b3fa4-ed67-4ab1-9a68-e7db83e05967,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_1,,,,false,136,0.4,1.0,Niederspannung -b8fa1f73-223c-4b08-a140-44f12484cce3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(16),,,,false,126,0.4,1.0,Niederspannung -416fa5eb-2f72-46c3-978f-6a0ebb714a40,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S3_1,,,,false,136,0.4,1.0,Niederspannung -f1e88392-3b2a-4ce8-a31f-c963f08f8043,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(7),,,,false,146,0.4,1.0,Niederspannung +5af425fa-6ed7-43e1-8898-7af1315128c5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(21),,,,false,126,0.4,1.0,Niederspannung +d5b861a6-2a5b-4dec-a66e-adbfc6d62873,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(27),,,,false,126,0.4,1.0,Niederspannung +36dccefc-f04c-493f-bb88-11343583bf9f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_4,,,,false,116,0.4,1.0,Niederspannung +792b505c-87ab-4665-a31d-b6035c5ece70,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(8),,,,false,146,0.4,1.0,Niederspannung +c6c177b0-5004-4db0-8cde-6293330a4757,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(25),,,,false,146,0.4,1.0,Niederspannung +f29859be-c6e7-4cf9-84d7-239eb98a9e65,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(13),,,,false,126,0.4,1.0,Niederspannung 8b3e3802-5213-46d0-a498-15eb6e5852b5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(11),,,,false,146,0.4,1.0,Niederspannung -2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_ONS,,,,false,126,0.4,1.0,Niederspannung -519ace7e-fd3f-4797-b14b-36c1694b00cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(30),,,,false,126,0.4,1.0,Niederspannung -9ce9d92c-5583-4b16-bec6-9f67834663cb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(14),,,,false,126,0.4,1.0,Niederspannung -8f422111-67d7-42f0-9f80-fbd0ec64c4fc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(3),,,,false,126,0.4,1.0,Niederspannung -81cd3f38-867b-4a71-ba22-cb33834e0e58,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_4,,,,false,136,0.4,1.0,Niederspannung -77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_01,,,,false,14,20.0,1.0,Mittelspannung -36cda100-86ae-4a20-ac71-20af603ac0cf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(20),,,,false,126,0.4,1.0,Niederspannung -b46d4395-6724-4830-ba55-357e81fc2814,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET136_S3_2,,,,false,136,0.4,1.0,Niederspannung -787237ad-b3a8-4f2c-ab70-31c5113d82d7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_03,,,,false,11,20.0,1.0,Mittelspannung -3ec2f2a0-36a3-4d11-88ee-cc4df001e876,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(16),,,,false,146,0.4,1.0,Niederspannung -40b0f497-96a3-49d9-9503-8fa67a5b532a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS3_07,,,,false,13,20.0,1.0,Mittelspannung -3e21f3a1-2c9c-4138-bcc9-466b004609ed,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_2,,,,false,116,0.4,1.0,Niederspannung -0db6e581-37e9-4254-aed8-d5cdf66819f9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(9),,,,false,146,0.4,1.0,Niederspannung -270c7266-45dc-4e45-829f-c04f6b631cad,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(11),,,,false,126,0.4,1.0,Niederspannung +2fe5100e-d4e8-4bc4-9c7c-bcc0fc56f518,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(1),,,,false,126,0.4,1.0,Niederspannung bd8c7d3d-e830-4a46-bf78-0086ce24909f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(5),,,,false,146,0.4,1.0,Niederspannung -9d02ea80-98d8-4cd0-a635-9104a14a56dd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(12),,,,false,126,0.4,1.0,Niederspannung -ba0b3e4b-85e1-4b45-8863-fbfe11c9b69c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(23),,,,false,146,0.4,1.0,Niederspannung -eb125953-31d3-4207-adf7-aba3a3790d6f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(12),,,,false,126,0.4,1.0,Niederspannung -032768b4-2426-4abf-806b-83813ac5137a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_2,,,,false,136,0.4,1.0,Niederspannung -7d45f0ab-1e6b-452f-b665-c4846cf046f5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(20),,,,false,146,0.4,1.0,Niederspannung -550ebca7-1455-44eb-9431-ffbf08e58bd4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET116_S3_2,,,,false,116,0.4,1.0,Niederspannung -69aeb4a6-1c4b-4953-bad9-54fc0c7e495b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(3),,,,false,126,0.4,1.0,Niederspannung -fd4f6232-c28d-4fc3-81dd-03b84aad695e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(34),,,,false,146,0.4,1.0,Niederspannung -d53ff076-dadd-44f8-85d4-68f48991f7d0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_2,,,,false,116,0.4,1.0,Niederspannung -8f2ba96f-a47a-46d3-b5a1-d19de0a32419,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(16),,,,false,146,0.4,1.0,Niederspannung -4303784e-7193-454a-9be4-3591400b4eeb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(1),,,,false,126,0.4,1.0,Niederspannung -eb21d716-1b54-4dba-bdc2-d1f6752aef85,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(5),,,,false,126,0.4,1.0,Niederspannung -61ee5ff6-eb38-4b27-a3f6-cb574d1f8b41,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(22),,,,false,126,0.4,1.0,Niederspannung -50164699-2018-4b17-b3f1-74b082f27403,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(7),,,,false,126,0.4,1.0,Niederspannung -5862f526-783a-4218-a463-3cbf5de8dade,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(22),,,,false,146,0.4,1.0,Niederspannung -34cd8ee0-e607-4c47-89a7-121c3e32768a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",HS_NET1_Station_1_380,,,,true,1000,380.0,1.0,Höchstspannung +847fd5fc-b515-4a9d-8a6f-66df1e71ded2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(13),,,,false,126,0.4,1.0,Niederspannung +4dd439ed-7cc3-45b4-a2ca-ae615b97a23c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS3_04,,,,false,13,20.0,1.0,Mittelspannung +9b509c7d-4647-40fd-b03e-7ab919215cc6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(23),,,,false,126,0.4,1.0,Niederspannung +2aa2d409-8bb2-477d-ac7a-6439552e136a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(20),,,,false,146,0.4,1.0,Niederspannung 8a50fb37-81cf-47c9-8850-a12b4391e2e7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_1,,,,false,116,0.4,1.0,Niederspannung -773aebe4-fc03-46be-8209-0213e2760a8e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(24),,,,false,146,0.4,1.0,Niederspannung -f29859be-c6e7-4cf9-84d7-239eb98a9e65,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(13),,,,false,126,0.4,1.0,Niederspannung -f2d03b34-9595-4819-a00b-ff9ddd92eb07,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(14),,,,false,146,0.4,1.0,Niederspannung -033d0230-4aee-47cf-91f9-81f5f40e60b0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(32),,,,false,146,0.4,1.0,Niederspannung +d53ff076-dadd-44f8-85d4-68f48991f7d0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_2,,,,false,116,0.4,1.0,Niederspannung +867c4b4d-0f38-4f28-82ce-135f2cc63808,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(29),,,,false,146,0.4,1.0,Niederspannung +6dd72a1e-2a79-4cde-b2fc-92bc9a83032a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(8),,,,false,146,0.4,1.0,Niederspannung +e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(28),,,,false,126,0.4,1.0,Niederspannung +0db6e581-37e9-4254-aed8-d5cdf66819f9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(9),,,,false,146,0.4,1.0,Niederspannung +2287c2a8-c2d0-4c63-80b5-6b66a1288df8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(25),,,,false,146,0.4,1.0,Niederspannung +de5ee252-ebb6-42b0-875c-77ae557ffbf6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(5),,,,false,126,0.4,1.0,Niederspannung +fc7821d2-ac64-483e-b520-38d9971f4db0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(7),,,,false,126,0.4,1.0,Niederspannung +f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(5),,,,false,126,0.4,1.0,Niederspannung +b6b1b9fc-e7d8-492d-8601-84c1e756bd83,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS3_02,,,,false,13,20.0,1.0,Mittelspannung +0c266541-6235-4d01-8258-e763c58af6c7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(28),,,,false,126,0.4,1.0,Niederspannung c8b1fd67-2f03-4153-8ed3-284e7a721ec5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(5),,,,false,126,0.4,1.0,Niederspannung -c72a08bc-4685-49b1-b8ef-803aebc8c388,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(28),,,,false,146,0.4,1.0,Niederspannung +ed4697fd-016c-40c2-a66b-e793878dadea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_4,,,,false,136,0.4,1.0,Niederspannung +e4502c52-b4d7-4082-a583-b5688d8244e0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS3_03,,,,false,13,20.0,1.0,Mittelspannung +3e21f3a1-2c9c-4138-bcc9-466b004609ed,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_2,,,,false,116,0.4,1.0,Niederspannung +5545d21b-bdc8-495f-bd28-d22ffcc0fafc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(26),,,,false,126,0.4,1.0,Niederspannung +582ed42c-fd18-49ae-bdf5-6aa59353c7e3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_05,,,,false,12,20.0,1.0,Mittelspannung 4f2402e8-664a-40f2-970a-abc098a2a0d1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(24),,,,false,126,0.4,1.0,Niederspannung -c6c177b0-5004-4db0-8cde-6293330a4757,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(25),,,,false,146,0.4,1.0,Niederspannung +00d4a837-f09c-41df-bed1-dfdb78387116,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(4),,,,false,146,0.4,1.0,Niederspannung +787237ad-b3a8-4f2c-ab70-31c5113d82d7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_03,,,,false,11,20.0,1.0,Mittelspannung +1396cb4c-cee7-4116-97c9-290f98785719,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS1_04,,,,false,11,20.0,1.0,Mittelspannung +dfae9806-9b44-4995-ba27-d66d8e4a43e0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",HS_NET1_Station_2,,,,false,1,110.0,1.0,Hochspannung 4f78fe6d-3cb2-4d99-8c67-4f14cb626813,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(16),,,,false,126,0.4,1.0,Niederspannung -285a4caa-2da8-4bd2-8a60-7d04f168f378,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(2),,,,false,126,0.4,1.0,Niederspannung -0b2a3b46-5e43-4879-973e-d8fb96429d8a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(2),,,,false,146,0.4,1.0,Niederspannung -970cf93c-36c5-4938-a7e4-3f184a7035f0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(24),,,,false,146,0.4,1.0,Niederspannung -86af5351-87ef-49c6-bd17-673dceecee5b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(26),,,,false,146,0.4,1.0,Niederspannung -49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(6),,,,false,146,0.4,1.0,Niederspannung -898d8295-bf35-4079-9374-99b059c2c956,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_07,,,,false,14,20.0,1.0,Mittelspannung -3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(37),,,,false,126,0.4,1.0,Niederspannung -60173008-809d-4d8f-b06a-3c4a838dd989,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(39),,,,false,126,0.4,1.0,Niederspannung -98072ded-726f-4f0b-8bbc-4fb6d5086a7b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(7),,,,false,126,0.4,1.0,Niederspannung -bd292f64-65e8-42ec-9b78-b9b9f013750e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(21),,,,false,146,0.4,1.0,Niederspannung -462ca5a4-7ac1-4dbe-a1cf-0bb6b9b9b717,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(17),,,,false,126,0.4,1.0,Niederspannung -bd288184-99d8-4233-bb3d-484f3922200a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(26),,,,false,146,0.4,1.0,Niederspannung -b7baa286-cbe2-4143-a08f-4e025af47529,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(14),,,,false,126,0.4,1.0,Niederspannung -33f346bd-7dc5-4140-8ed0-7d7db4cc0f6f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(23),,,,false,126,0.4,1.0,Niederspannung -535843a3-cf93-412f-b4d7-585337791ba8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS2_02,,,,false,12,20.0,1.0,Mittelspannung -b3a7431d-89b0-41cb-87a9-5853890796cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S1_4,,,,false,116,0.4,1.0,Niederspannung -9aaf57c4-cc5c-4a01-8c2c-72bc7e231cc9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(14),,,,false,146,0.4,1.0,Niederspannung -4f28e734-5148-4caf-ac64-270231740cbf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(1),,,,false,146,0.4,1.0,Niederspannung +6a4547a8-630b-46e4-8144-9cd649e67c07,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(12),,,,false,126,0.4,1.0,Niederspannung +033d0230-4aee-47cf-91f9-81f5f40e60b0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(32),,,,false,146,0.4,1.0,Niederspannung +de756ddb-793d-4b2d-959c-59d938a8f61f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(20),,,,false,126,0.4,1.0,Niederspannung +39dbc5ed-d874-48a8-9128-e970436a94b4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS3_06,,,,false,13,20.0,1.0,Mittelspannung +535b3fa4-ed67-4ab1-9a68-e7db83e05967,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_1,,,,false,136,0.4,1.0,Niederspannung d7023c15-adb7-4d56-9f86-b182611a47ef,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(5),,,,false,146,0.4,1.0,Niederspannung -04f29760-9e52-4943-8563-62e1fbd5ed52,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(3),,,,false,126,0.4,1.0,Niederspannung -3dec12fd-3dc6-481d-be05-8df9df7f0c5d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(14),,,,false,146,0.4,1.0,Niederspannung -15345698-c319-461f-b969-37d50fb84220,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(29),,,,false,146,0.4,1.0,Niederspannung -6dcdc87b-a719-416f-9da1-21a701048f3a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(8),,,,false,126,0.4,1.0,Niederspannung +2f64bf67-cee9-44bb-8c13-ff96878932af,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(18),,,,false,126,0.4,1.0,Niederspannung +8f80e777-ccbd-4630-b10e-238e824113fd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(36),,,,false,146,0.4,1.0,Niederspannung +34cd8ee0-e607-4c47-89a7-121c3e32768a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",HS_NET1_Station_1_380,,,,true,1000,380.0,1.0,Höchstspannung +f8dd541b-4a4d-417e-89ff-a9650ee3aac2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(12),,,,false,146,0.4,1.0,Niederspannung 80d8252b-045f-471a-9638-416ed3f86120,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(31),,,,false,126,0.4,1.0,Niederspannung -d8c35123-b389-4199-84f9-d417d24bb78d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(16),,,,false,126,0.4,1.0,Niederspannung -6bc0dda8-25f4-48a6-9645-21e1eed5c6ff,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(8),,,,false,146,0.4,1.0,Niederspannung -810bebb0-0d5c-4899-b213-3207be661248,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(19),,,,false,146,0.4,1.0,Niederspannung -06b7f21a-d6d7-4ec0-94c6-141845f14986,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(38),,,,false,126,0.4,1.0,Niederspannung -f1e55c8b-357f-45a7-9d57-e299f9b207f3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(13),,,,false,146,0.4,1.0,Niederspannung -92cb5065-2e57-4099-8e29-75cbc0c80370,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(21),,,,false,146,0.4,1.0,Niederspannung -9baae5ff-40e3-48cb-9ddf-de6d1c133e13,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(27),,,,false,146,0.4,1.0,Niederspannung -dfae9806-9b44-4995-ba27-d66d8e4a43e0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",HS_NET1_Station_2,,,,false,1,110.0,1.0,Hochspannung -f26b5511-3c50-42d5-97c2-be408330eb84,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(11),,,,false,146,0.4,1.0,Niederspannung -b32c5f5e-b6b8-41ed-a192-078e1aed05ac,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(13),,,,false,126,0.4,1.0,Niederspannung -00d03670-7833-47ee-ad52-04d18d1c64fd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",HS_NET1_Station_1,,,,false,1,110.0,1.0,Hochspannung -5f1c776c-6935-40f7-ba9e-60646e08992b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS2_04,,,,false,12,20.0,1.0,Mittelspannung -a5c73608-5a85-495d-bea0-df77b6ce66ea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(9),,,,false,146,0.4,1.0,Niederspannung +443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(30),,,,false,126,0.4,1.0,Niederspannung +4e188ac9-e507-46b1-b8e2-376cf7c6ceb1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_1,,,,false,136,0.4,1.0,Niederspannung +40b0f497-96a3-49d9-9503-8fa67a5b532a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS3_07,,,,false,13,20.0,1.0,Mittelspannung +ab3645a7-af26-480d-b1bd-5b0fa00dc83f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(2),,,,false,146,0.4,1.0,Niederspannung +ca438ab9-3abc-4416-91d1-df01d1c5fa5a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(28),,,,false,146,0.4,1.0,Niederspannung +401f37f8-6f2c-4564-bc78-6736cb9cbf8d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",HS_NET1_Station_4,,,,false,1,110.0,1.0,Hochspannung +bbd210a5-eb85-4616-bdd0-72bbd3ed7ef9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(9),,,,false,126,0.4,1.0,Niederspannung +9502fd3e-c00f-48fa-8b56-c72d21f80f3c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(18),,,,false,126,0.4,1.0,Niederspannung +174fb4b2-4f9e-415c-bfee-d850ef751307,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS4_02,,,,false,14,20.0,1.0,Mittelspannung +f0f8f187-5dbf-46ab-8a43-d6169ab5042d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(29),,,,false,126,0.4,1.0,Niederspannung 1f040625-ad1d-409f-bd7e-944c4d805e46,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(19),,,,false,146,0.4,1.0,Niederspannung -f8dd541b-4a4d-417e-89ff-a9650ee3aac2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(12),,,,false,146,0.4,1.0,Niederspannung +b608d71e-3ede-4156-a015-3f6e1d22242a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(13),,,,false,146,0.4,1.0,Niederspannung +3e4cce4a-6e85-4ec2-b3ea-08673a0ada15,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(37),,,,false,126,0.4,1.0,Niederspannung +bd288184-99d8-4233-bb3d-484f3922200a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(26),,,,false,146,0.4,1.0,Niederspannung +366a70fb-8d7f-4201-9eca-0fcbc839239d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(8),,,,false,126,0.4,1.0,Niederspannung +3da4fd3d-ac5e-409d-91fa-36516673cf57,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_ONS,,,,false,146,0.4,1.0,Niederspannung +1dee13af-e638-4858-9c69-0069190cd577,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(21),,,,false,126,0.4,1.0,Niederspannung +9baae5ff-40e3-48cb-9ddf-de6d1c133e13,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(27),,,,false,146,0.4,1.0,Niederspannung +519ace7e-fd3f-4797-b14b-36c1694b00cd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(30),,,,false,126,0.4,1.0,Niederspannung 3bc8235b-03b5-489b-81a2-58d520fbe28e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S3_5,,,,false,136,0.4,1.0,Niederspannung -dc022eec-16b0-4a64-a2f5-498d81aca71e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(26),,,,false,126,0.4,1.0,Niederspannung -00bbc353-d47e-4865-a696-fe5d29b9e6a2,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(15),,,,false,146,0.4,1.0,Niederspannung -9f95c733-71e2-4bf0-a27a-70144518ea2c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(30),,,,false,146,0.4,1.0,Niederspannung -eb95ff15-56db-4463-bb54-0ee131167812,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_3,,,,false,136,0.4,1.0,Niederspannung -369cffa5-bcee-4489-8193-1d9b10230eca,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(4),,,,false,146,0.4,1.0,Niederspannung +fa6d5184-b205-4b1b-839f-7b21ac956c29,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS4_06,,,,false,14,20.0,1.0,Mittelspannung +416fa5eb-2f72-46c3-978f-6a0ebb714a40,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S3_1,,,,false,136,0.4,1.0,Niederspannung +2d4beb13-8e6c-46de-9b1c-409c7ca7573a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_ONS,,,,false,126,0.4,1.0,Niederspannung +41414318-73e3-4bdc-8147-570a96b28d37,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(10),,,,false,146,0.4,1.0,Niederspannung +b5548457-5923-4d52-b3c9-fdb75a1df98e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(3),,,,false,146,0.4,1.0,Niederspannung +2645e336-b0df-4d1e-a0ea-375444488f06,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(15),,,,false,126,0.4,1.0,Niederspannung 41c0087f-ce27-4da3-97d2-92d711b639b4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(15),,,,false,126,0.4,1.0,Niederspannung -df8df8d2-3494-4da9-8d1b-f913d15f520f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(14),,,,false,126,0.4,1.0,Niederspannung -f6272655-bd7e-4d2d-8bdd-285f3ac0d3e8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(5),,,,false,126,0.4,1.0,Niederspannung -fc7821d2-ac64-483e-b520-38d9971f4db0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(7),,,,false,126,0.4,1.0,Niederspannung -5dfd45b8-48e7-42fd-ac53-cc57455486b5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(9),,,,false,126,0.4,1.0,Niederspannung -443c1513-fdeb-4e29-ae89-5ea47c0b1d3f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(30),,,,false,126,0.4,1.0,Niederspannung -14a8dc4c-0906-402f-b073-6d6d4725d0cb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_07,,,,false,12,20.0,1.0,Mittelspannung -b425b28e-48a8-4ec4-a15a-387fcfb79895,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(33),,,,false,126,0.4,1.0,Niederspannung -3f63be7c-7f1a-4e7e-87ee-90ada222f64a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(1),,,,false,126,0.4,1.0,Niederspannung -5af425fa-6ed7-43e1-8898-7af1315128c5,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(21),,,,false,126,0.4,1.0,Niederspannung -55b3d03f-2204-4ab3-84cc-a28476868c9d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(15),,,,false,126,0.4,1.0,Niederspannung -636dec7c-4242-46e8-b7ae-db7e5a28c39c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(19),,,,false,146,0.4,1.0,Niederspannung -b237dd88-bcba-4a7c-aee6-c0c3e151e14e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(3),,,,false,146,0.4,1.0,Niederspannung -2aa2d409-8bb2-477d-ac7a-6439552e136a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(20),,,,false,146,0.4,1.0,Niederspannung -5fe9c522-37d0-48f8-b3b8-e91b956e39f6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(17),,,,false,126,0.4,1.0,Niederspannung -e0a6c8e9-7d1f-4965-98b9-e543bacb6b83,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(28),,,,false,126,0.4,1.0,Niederspannung +ffcaf979-d707-4d25-8f46-f436f9792d7f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F4_(10),,,,false,146,0.4,1.0,Niederspannung +c72a08bc-4685-49b1-b8ef-803aebc8c388,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(28),,,,false,146,0.4,1.0,Niederspannung +7cff7ac7-2d18-4c4c-8e1b-893bb050c1ed,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(30),,,,false,146,0.4,1.0,Niederspannung +205fcee1-928c-4374-950c-34575f07fa49,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(24),,,,false,146,0.4,1.0,Niederspannung +773aebe4-fc03-46be-8209-0213e2760a8e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(24),,,,false,146,0.4,1.0,Niederspannung +2c520ab6-507e-4dcf-ab05-8f238e9b9385,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(1),,,,false,146,0.4,1.0,Niederspannung +bdf97a4d-622c-4251-8183-8b1a696f376e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(13),,,,false,146,0.4,1.0,Niederspannung +550ebca7-1455-44eb-9431-ffbf08e58bd4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET116_S3_2,,,,false,116,0.4,1.0,Niederspannung +dd9d4153-c56f-4457-ad5e-46a48d4486b6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(4),,,,false,146,0.4,1.0,Niederspannung +49b511fa-8cff-45f4-9a59-54faaaf90abf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(32),,,,false,126,0.4,1.0,Niederspannung +a7ebd30b-b843-405f-9fae-ca6b489601f9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(2),,,,false,126,0.4,1.0,Niederspannung +0d94a5ea-3a13-48ba-a27f-b2903841c334,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(17),,,,false,146,0.4,1.0,Niederspannung +bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(7),,,,false,146,0.4,1.0,Niederspannung +01bdd8b2-145f-42b3-80e3-a2366dea1044,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(6),,,,false,146,0.4,1.0,Niederspannung +33f29587-f63e-45b7-960b-037bda37a3cb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",HS_NET1_Station_3,,,,false,1,110.0,1.0,Hochspannung +3dec12fd-3dc6-481d-be05-8df9df7f0c5d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(14),,,,false,146,0.4,1.0,Niederspannung +92cb5065-2e57-4099-8e29-75cbc0c80370,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(21),,,,false,146,0.4,1.0,Niederspannung +c7e09266-c778-433b-b01a-5fb9e298ea8e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(2),,,,false,126,0.4,1.0,Niederspannung +ce71377d-63ea-462a-9290-67e51946a098,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F3_(5),,,,false,146,0.4,1.0,Niederspannung +27d9e46d-5a9a-44f9-b17e-cd6cffb5e769,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(29),,,,false,126,0.4,1.0,Niederspannung +b8fa1f73-223c-4b08-a140-44f12484cce3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(16),,,,false,126,0.4,1.0,Niederspannung +d2aff632-fc26-4595-931c-92e266247ac8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(19),,,,false,126,0.4,1.0,Niederspannung +77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS4_01,,,,false,14,20.0,1.0,Mittelspannung +f1cef042-1fc4-4bd8-b17f-dfbded4f2aaa,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(7),,,,false,146,0.4,1.0,Niederspannung 3a2f199c-2966-4b9a-939b-3a6c9924341c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(25),,,,false,126,0.4,1.0,Niederspannung +69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_03,,,,false,12,20.0,1.0,Mittelspannung +cbcfc3b6-ac90-4215-975c-a033f5cf9912,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_2,,,,false,136,0.4,1.0,Niederspannung +970cf93c-36c5-4938-a7e4-3f184a7035f0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(24),,,,false,146,0.4,1.0,Niederspannung +d82fae59-844a-4c85-997e-326dd876137c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(15),,,,false,146,0.4,1.0,Niederspannung +32bd37df-255b-4eb2-9d16-5b711132eee6,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_5,,,,false,116,0.4,1.0,Niederspannung +a286f73a-20ee-4056-8129-c7963b34ecd9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(9),,,,false,126,0.4,1.0,Niederspannung +8f422111-67d7-42f0-9f80-fbd0ec64c4fc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F2_(3),,,,false,126,0.4,1.0,Niederspannung +0228ffcd-f6bc-47c8-b26c-fcc0abacd963,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(5),,,,false,146,0.4,1.0,Niederspannung +890f2162-b4cb-49e7-a16f-4b552c5e245c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS4_04,,,,false,14,20.0,1.0,Mittelspannung +9f7599de-c488-46c5-b053-1279a511f7b9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(16),,,,false,146,0.4,1.0,Niederspannung +9d7038e9-5bcc-4676-bead-46c4f1291ba8,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(6),,,,false,126,0.4,1.0,Niederspannung +df97c0d1-379b-417a-a473-8e7fe37da99d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS2_06,,,,false,12,20.0,1.0,Mittelspannung +1cb45ba0-d2c2-45a6-9bb2-5f374e30a6e9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(3),,,,false,126,0.4,1.0,Niederspannung +bd292f64-65e8-42ec-9b78-b9b9f013750e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(21),,,,false,146,0.4,1.0,Niederspannung +5071dd8c-bbc1-4c8d-a180-4492f80e183d,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(6),,,,false,146,0.4,1.0,Niederspannung +9d10a92f-576d-4777-99ff-59d145924fea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(12),,,,false,126,0.4,1.0,Niederspannung +5f1c776c-6935-40f7-ba9e-60646e08992b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",MS2_04,,,,false,12,20.0,1.0,Mittelspannung +49e14db3-a4bc-464a-b606-653ac8a604dd,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(13),,,,false,146,0.4,1.0,Niederspannung +52e15712-2572-442a-b22c-add48af95115,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(19),,,,false,126,0.4,1.0,Niederspannung +60173008-809d-4d8f-b06a-3c4a838dd989,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(39),,,,false,126,0.4,1.0,Niederspannung d40a1a85-40f2-4ad3-ba58-720d5ba02268,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(14),,,,false,126,0.4,1.0,Niederspannung -ab3645a7-af26-480d-b1bd-5b0fa00dc83f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(2),,,,false,146,0.4,1.0,Niederspannung -e25387d0-ab9a-406d-bcb4-555414b88b1b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(10),,,,false,126,0.4,1.0,Niederspannung -8254d91b-e5da-4402-bb8f-301eafa09d28,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(12),,,,false,146,0.4,1.0,Niederspannung +4f28e734-5148-4caf-ac64-270231740cbf,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(1),,,,false,146,0.4,1.0,Niederspannung +df9c3d91-41a0-4e49-bb1f-1cd2a8fd9a2e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S2_3,,,,false,116,0.4,1.0,Niederspannung +196fe620-d4a7-45f9-93ad-0579e2bcbb9a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(1),,,,false,126,0.4,1.0,Niederspannung +d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_ONS,,,,false,136,0.4,1.0,Niederspannung +f1e88392-3b2a-4ce8-a31f-c963f08f8043,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(7),,,,false,146,0.4,1.0,Niederspannung e3a40690-d085-4796-9fcb-48d776e58594,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(6),,,,false,126,0.4,1.0,Niederspannung -fd534474-cd65-47aa-8005-dc50d17d6920,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_3,,,,false,136,0.4,1.0,Niederspannung -ed4697fd-016c-40c2-a66b-e793878dadea,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S1_4,,,,false,136,0.4,1.0,Niederspannung -3b879239-20c8-4adf-bd51-92924327ee71,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(12),,,,false,146,0.4,1.0,Niederspannung -011e3794-3341-4376-839c-3f5a452e15ab,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(25),,,,false,146,0.4,1.0,Niederspannung -0c266541-6235-4d01-8258-e763c58af6c7,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(28),,,,false,126,0.4,1.0,Niederspannung -154e9a99-467b-4f65-9928-8ebb14149baa,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(26),,,,false,146,0.4,1.0,Niederspannung -b9a28095-68f7-44c1-9ccc-6efc5ea84c59,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_5,,,,false,116,0.4,1.0,Niederspannung -1a8ba1a5-3cee-4791-b21b-f17b08526873,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS2_01,,,,false,12,20.0,1.0,Mittelspannung -9f7599de-c488-46c5-b053-1279a511f7b9,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F4_(16),,,,false,146,0.4,1.0,Niederspannung +8254d91b-e5da-4402-bb8f-301eafa09d28,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F2_(12),,,,false,146,0.4,1.0,Niederspannung +da79c960-d35a-4193-9b06-2d4d57051706,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(13),,,,false,126,0.4,1.0,Niederspannung +81cd3f38-867b-4a71-ba22-cb33834e0e58,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET136_S2_4,,,,false,136,0.4,1.0,Niederspannung +e25387d0-ab9a-406d-bcb4-555414b88b1b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F3_(10),,,,false,126,0.4,1.0,Niederspannung +d69efff2-ba8b-4aa6-a4a1-27267964147a,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_3,,,,false,116,0.4,1.0,Niederspannung +69efeb2d-9845-49ac-8500-5e017a7a64ef,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(2),,,,false,146,0.4,1.0,Niederspannung +f5ae3279-fe21-4bb7-849a-eaacb0546b0e,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(35),,,,false,146,0.4,1.0,Niederspannung +7546df1d-8a62-4650-bf2e-d1e441b38d70,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",MS1_07,,,,false,11,20.0,1.0,Mittelspannung +75f2dfb9-75a0-496d-9c44-79e7df54c1df,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F4_(8),,,,false,126,0.4,1.0,Niederspannung +5e213f42-d93e-45c5-a295-adbe09105746,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(31),,,,false,146,0.4,1.0,Niederspannung +012c9eee-86c2-494c-adcc-bbfc481e4a46,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F1_(28),,,,false,146,0.4,1.0,Niederspannung +b425b28e-48a8-4ec4-a15a-387fcfb79895,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F1_(33),,,,false,126,0.4,1.0,Niederspannung 2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(18),,,,false,146,0.4,1.0,Niederspannung -5545d21b-bdc8-495f-bd28-d22ffcc0fafc,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(26),,,,false,126,0.4,1.0,Niederspannung -ce513b50-b57a-41e2-b744-4c0fd2ae97d0,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(23),,,,false,146,0.4,1.0,Niederspannung -36dccefc-f04c-493f-bb88-11343583bf9f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET116_S3_4,,,,false,116,0.4,1.0,Niederspannung -4db634e5-3eb8-4c17-bc44-eb224667580c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(7),,,,false,126,0.4,1.0,Niederspannung -5d1cce49-e000-4a33-a0ea-f3685f8cc5a3,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(28),,,,false,126,0.4,1.0,Niederspannung \ No newline at end of file +21359dd1-7a23-4932-b656-c196fbffe751,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET146_F2_(18),,,,false,146,0.4,1.0,Niederspannung +ca3391eb-ca94-4945-ac72-e116f396f82c,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F1_(36),,,,false,126,0.4,1.0,Niederspannung +98072ded-726f-4f0b-8bbc-4fb6d5086a7b,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET126_F4_(7),,,,false,126,0.4,1.0,Niederspannung +4258f215-5b22-446f-a260-e8cdaa7c95d1,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F3_(11),,,,false,126,0.4,1.0,Niederspannung +154e9a99-467b-4f65-9928-8ebb14149baa,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F1_(26),,,,false,146,0.4,1.0,Niederspannung +fd3b7bb8-3976-4441-9211-745243afd80f,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:0""}}}",NS_NET146_F3_(32),,,,false,146,0.4,1.0,Niederspannung +9ce9d92c-5583-4b16-bec6-9f67834663cb,"{""type"":""Point"",""coordinates"":[7.4116482,51.4843281],""crs"":{""type"":""name"",""properties"":{""name"":""EPSG:4326""}}}",NS_NET126_F2_(14),,,,false,126,0.4,1.0,Niederspannung diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/pv_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/pv_input.csv index 897fbf631..9ee7ccb79 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/pv_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/pv_input.csv @@ -1,64 +1,64 @@ -"uuid","albedo","azimuth","cos_phi_rated","eta_conv","elevation_angle","id","k_g","k_t","market_reaction","node","operates_from","operates_until","operator","q_characteristics","s_rated" -5b38af42-1ee4-4a41-b666-ea141187df37,0.20000000298023224,-11.463644027709961,0.8999999761581421,96.0,33.62879943847656,NS_NET146_F2_(3)_PV,0.8999999761581421,1.0,false,0170837a-1876-45f9-a613-666f9991964d,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -e447506e-3d43-4bce-8aab-a7ca8b7fbc45,0.20000000298023224,3.8914573192596436,0.8999999761581421,98.0,42.77021408081055,NS_NET146_F4_(9)_PV,0.8999999761581421,1.0,false,9b889b73-c108-4b38-b6eb-3377841e0c83,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -6cac0624-6336-4418-bcf0-990abcdb824b,0.20000000298023224,-8.097375869750977,0.8999999761581421,98.0,44.90728759765625,NS_NET146_F4_(16)_PV,0.8999999761581421,1.0,false,9f7599de-c488-46c5-b053-1279a511f7b9,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -3c98b5a6-1d44-449e-83e4-d610a4846d8f,0.20000000298023224,-12.883859634399414,0.800000011920929,95.0,38.764892578125,MS4_EEG_03,0.8999999761581421,1.0,false,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -6291eea2-689c-48f3-b7a9-5054bf567cab,0.20000000298023224,5.255863666534424,0.8999999761581421,97.0,36.56882858276367,NS_NET146_F3_(32)_PV,0.8999999761581421,1.0,false,fd3b7bb8-3976-4441-9211-745243afd80f,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -4fc73066-d9a2-4175-84e5-f3692e050492,0.20000000298023224,9.423768997192383,0.8999999761581421,98.0,39.56998062133789,NS_NET146_F1_(35)_PV,0.8999999761581421,1.0,false,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -cbcfa285-fe3a-4a98-bb4a-05d28d466c79,0.20000000298023224,1.1021884679794312,0.800000011920929,96.0,30.529081344604492,MS1_EEG_05,0.8999999761581421,1.0,false,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -3776dfa9-f161-419e-9014-9cfb5a379025,0.20000000298023224,20.107717514038086,0.8999999761581421,98.0,39.57343292236328,NS_NET146_F4_(17)_PV,0.8999999761581421,1.0,false,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -bb929fcc-a67e-423c-9569-73364746383d,0.20000000298023224,6.103052139282227,0.8999999761581421,97.0,44.66648483276367,NS_NET146_F2_(21)_PV,0.8999999761581421,1.0,false,bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -a50f12e1-33ed-4992-8579-da1800d5eff7,0.20000000298023224,11.473278045654297,0.8999999761581421,98.0,34.85277557373047,NS_NET146_F1_(29)_PV,0.8999999761581421,1.0,false,867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -e04c6258-0ee5-4928-96c1-8e04acbbcc8f,0.20000000298023224,3.925752878189087,0.8999999761581421,97.0,32.65638732910156,NS_NET146_F3_(12)_PV,0.8999999761581421,1.0,false,f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -61788990-7681-42c0-9d0c-cfd22d4d3a83,0.20000000298023224,-17.2542781829834,0.800000011920929,98.0,32.63483810424805,MS1_EEG_03,0.8999999761581421,1.0,false,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -114efaa0-dd3f-47ce-bbbe-856cacb034d1,0.20000000298023224,11.962505340576172,0.8999999761581421,97.0,39.01054000854492,NS_NET146_F3_(18)_PV,0.8999999761581421,1.0,false,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -53df57d0-c789-4393-b0a5-897a3bc821a2,0.20000000298023224,-1.3447864055633545,0.8999999761581421,95.0,37.434146881103516,NS_NET136_S1_5_PV,0.8999999761581421,1.0,false,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -83a0dcd8-d6ad-49bf-8cbc-5a5774ed18ac,0.20000000298023224,9.723748207092285,0.8999999761581421,98.0,51.525978088378906,NS_NET146_F2_(27)_PV,0.8999999761581421,1.0,false,b179c38b-5af0-4304-84b1-1dc03314fd80,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -2560c371-f420-4c2a-b4e6-e04c11b64c03,0.20000000298023224,0.7802008390426636,0.8999999761581421,98.0,40.086585998535156,NS_NET116_S3_2_PV,0.8999999761581421,1.0,false,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -241b5dad-aaac-4f7c-8152-a32839fcfa13,0.20000000298023224,-5.435481071472168,0.8999999761581421,98.0,36.50833511352539,NS_NET146_F1_(10)_PV,0.8999999761581421,1.0,false,6c24b464-790a-4aae-bb11-766718f07cd5,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -4fa4ce55-0944-463a-a91b-3a3806286e0b,0.20000000298023224,-11.769233703613281,0.800000011920929,98.0,27.860116958618164,MS1_EEG_01,0.8999999761581421,1.0,false,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -645b0617-e6ab-438b-a141-9c497d720e4b,0.20000000298023224,-5.639688968658447,0.800000011920929,97.0,34.71104049682617,MS4_EEG_05,0.8999999761581421,1.0,false,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -5206abaa-3abc-4a15-a8f2-778139a3fc65,0.20000000298023224,4.901591777801514,0.8999999761581421,98.0,42.587581634521484,NS_NET146_F3_(7)_PV,0.8999999761581421,1.0,false,f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -4ff2235f-24d6-440c-bf09-76ef3eaa340d,0.20000000298023224,-13.216256141662598,0.800000011920929,98.0,35.950138092041016,MS3_EEG_01,0.8999999761581421,1.0,false,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -d3bacaf6-8558-4df5-8481-8d684ef3e14d,0.20000000298023224,6.262790203094482,0.8999999761581421,97.0,23.13505744934082,NS_NET146_F1_(26)_PV,0.8999999761581421,1.0,false,154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -fad9b8c1-9ded-4856-ab91-f41217259363,0.20000000298023224,-7.745131015777588,0.8999999761581421,97.0,27.492389678955078,NS_NET146_F3_(3)_PV,0.8999999761581421,1.0,false,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -e87c9d51-cfec-4e04-9790-16cd6b238d51,0.20000000298023224,-16.93343734741211,0.8999999761581421,96.0,46.32542037963867,NS_NET146_F2_(4)_PV,0.8999999761581421,1.0,false,369cffa5-bcee-4489-8193-1d9b10230eca,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -26647b27-a278-4ddb-a68e-8437d24798ca,0.20000000298023224,6.223939418792725,0.800000011920929,98.0,42.38501739501953,MS3_EEG_05,0.8999999761581421,1.0,false,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -51ed457c-81ff-470f-b45b-30a94a965c36,0.20000000298023224,-6.537350177764893,0.8999999761581421,98.0,33.695167541503906,NS_NET146_F1_(4)_PV,0.8999999761581421,1.0,false,dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -3d74e9fc-be60-41bf-9339-cd067c9378a2,0.20000000298023224,-3.632584810256958,0.8999999761581421,97.0,40.744606018066406,NS_NET146_F1_(25)_PV,0.8999999761581421,1.0,false,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -033e5854-65d9-4a14-8b5c-6aa675ded4a2,0.20000000298023224,-0.8097801208496094,0.8999999761581421,96.0,41.69758605957031,NS_NET146_F1_(18)_PV,0.8999999761581421,1.0,false,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -b8209f35-1405-4f7f-b1ec-3c853954e2a8,0.20000000298023224,-0.43818584084510803,0.800000011920929,97.0,31.086620330810547,MS2_EEG_01,0.8999999761581421,1.0,false,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -d350f4a1-c675-4f22-8fda-26ad0bd03edb,0.20000000298023224,-4.302062511444092,0.800000011920929,95.0,47.19122314453125,MS2_EEG_03,0.8999999761581421,1.0,false,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -0c8bcc26-ce6e-4d2c-acdd-e304cfb3c02f,0.20000000298023224,-1.1688426733016968,0.8999999761581421,95.0,47.49247360229492,NS_NET146_F3_(4)_PV,0.8999999761581421,1.0,false,f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -0818deae-c7d9-4252-ac4c-f147004e5752,0.20000000298023224,3.7626590728759766,0.800000011920929,98.0,39.33173751831055,MS2_EEG_05,0.8999999761581421,1.0,false,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -b938f0ab-e2c4-469e-9979-303d42224932,0.20000000298023224,3.1050832271575928,0.8999999761581421,98.0,31.573686599731445,NS_NET136_S3_2_PV,0.8999999761581421,1.0,false,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -9d7cd8e2-d859-4f4f-9c01-abba06ef2e2c,0.20000000298023224,-14.803051948547363,0.8999999761581421,96.0,42.391395568847656,NS_NET146_F4_(12)_PV,0.8999999761581421,1.0,false,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -4e655530-909f-4acf-8ed9-d19f849265df,0.20000000298023224,13.844985008239746,0.8999999761581421,98.0,29.355819702148438,NS_NET146_F1_(21)_PV,0.8999999761581421,1.0,false,92cb5065-2e57-4099-8e29-75cbc0c80370,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -de40f0bd-3793-4b02-b663-31d282b33f61,0.20000000298023224,-2.511692762374878,0.8999999761581421,96.0,44.8326416015625,NS_NET146_F3_(27)_PV,0.8999999761581421,1.0,false,55caf2ec-a21b-4afd-8830-1e4009cce396,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -d142aeef-1b06-4910-88b5-0bce6ef7c1e2,0.20000000298023224,4.056053638458252,0.8999999761581421,97.0,37.51328659057617,NS_NET146_F1_(26)_PV(1),0.8999999761581421,1.0,false,154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -c023f6f8-c35c-46d4-9ab7-1d098994d65d,0.20000000298023224,0.6144548654556274,0.8999999761581421,97.0,34.94338607788086,NS_NET146_F1_(1)_PV,0.8999999761581421,1.0,false,4f28e734-5148-4caf-ac64-270231740cbf,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -62b0cca9-b44c-4eda-999f-ae2832319848,0.20000000298023224,-8.658151626586914,0.8999999761581421,97.0,37.54166030883789,NS_NET146_F3_(22)_PV,0.8999999761581421,1.0,false,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -6a909b40-9c28-4e7a-9a86-f52bb0c9d7e9,0.20000000298023224,-11.42428207397461,0.8999999761581421,97.0,40.5459098815918,NS_NET146_F3_(10)_PV,0.8999999761581421,1.0,false,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -19d949f2-54ff-483c-928b-2438fc760385,0.20000000298023224,-8.571032524108887,0.8999999761581421,96.0,33.3157844543457,NS_NET146_F3_(20)_PV,0.8999999761581421,1.0,false,0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -819018d3-4601-4c39-9d41-4a911572d406,0.20000000298023224,10.485807418823242,0.800000011920929,96.0,36.37184143066406,MS3_EEG_07,0.8999999761581421,1.0,false,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,"cosPhiFixed:{(0.00,0.80)}",2000.0 -a364e957-2dcc-49c2-b213-2a68d9c3ee83,0.20000000298023224,20.24332618713379,0.800000011920929,97.0,32.75543975830078,MS2_EEG_07,0.8999999761581421,1.0,false,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,"cosPhiFixed:{(0.00,0.80)}",2000.0 -1a738cc5-b8f0-41f0-9f60-85073dc80136,0.20000000298023224,3.0615782737731934,0.8999999761581421,96.0,32.88844299316406,NS_NET146_F1_(37)_PV,0.8999999761581421,1.0,false,450426ac-a560-4d17-b1fc-9e169530a655,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -287285e2-c0ac-40dc-a15f-82a5de6ef37f,0.20000000298023224,-4.0978522300720215,0.8999999761581421,97.0,36.18789291381836,NS_NET146_F2_(20)_PV,0.8999999761581421,1.0,false,2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -5a612315-ad74-4d98-b350-7e44630b8a6e,0.20000000298023224,19.121809005737305,0.8999999761581421,96.0,36.42670440673828,NS_NET146_F3_(1)_PV,0.8999999761581421,1.0,false,22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -90a5aeab-5a04-4580-bc1c-4d8ea399cc8c,0.20000000298023224,-9.382472038269043,0.8999999761581421,96.0,40.04149627685547,NS_NET146_F4_(6)_PV,0.8999999761581421,1.0,false,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -a1eb7fc1-3bee-4b65-a387-ef3046644bf0,0.20000000298023224,-8.999500274658203,0.8999999761581421,98.0,37.14517593383789,NS_NET146_F2_(12)_PV,0.8999999761581421,1.0,false,8254d91b-e5da-4402-bb8f-301eafa09d28,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -dcc2950b-23cc-407d-b53f-0056234f7ee1,0.20000000298023224,-16.258031845092773,0.8999999761581421,96.0,31.165266036987305,NS_NET146_F2_(24)_PV,0.8999999761581421,1.0,false,970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -2f99a367-0fc2-4ca2-ab58-cb5d7004a6bd,0.20000000298023224,-22.032642364501953,0.8999999761581421,96.0,32.09359359741211,NS_NET146_F1_(34)_PV,0.8999999761581421,1.0,false,fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -83f68d87-a893-4e7f-b21d-4874929f927d,0.20000000298023224,4.363753795623779,0.8999999761581421,95.0,35.53179168701172,NS_NET146_F3_(15)_PV,0.8999999761581421,1.0,false,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -95b1b117-1c7b-4a69-b10e-8963fbced23a,0.20000000298023224,1.3804796934127808,0.800000011920929,98.0,40.089256286621094,MS3_EEG_03,0.8999999761581421,1.0,false,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -75a4050d-bdfd-4ca4-a1fd-a5d729613ed5,0.20000000298023224,-8.951131820678711,0.800000011920929,95.0,35.71611022949219,MS4_EEG_07,0.8999999761581421,1.0,false,898d8295-bf35-4079-9374-99b059c2c956,,,,"cosPhiFixed:{(0.00,0.80)}",2000.0 -71e4f6f1-2b50-41ce-adb7-80a4e309bd63,0.20000000298023224,-7.6025238037109375,0.8999999761581421,96.0,38.04230499267578,NS_NET146_F4_(14)_PV,0.8999999761581421,1.0,false,f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -0fbb53fd-cadb-4170-9f31-5af1cd05fd11,0.20000000298023224,0.9310876131057739,0.800000011920929,96.0,38.48886489868164,MS1_EEG_07,0.8999999761581421,1.0,false,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,"cosPhiFixed:{(0.00,0.80)}",2000.0 -41a126ec-6254-4b68-821b-ecebb98ad0fd,0.20000000298023224,5.3010125160217285,0.8999999761581421,95.0,39.12493896484375,NS_NET146_F4_(7)_PV,0.8999999761581421,1.0,false,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -0a2cdd93-b055-4e0b-8fce-088968316df4,0.20000000298023224,11.104238510131836,0.8999999761581421,96.0,32.18717575073242,NS_NET146_F1_(20)_PV,0.8999999761581421,1.0,false,7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -9b3ae847-e2ea-4598-b56e-35501f61f70c,0.20000000298023224,10.634596824645996,0.800000011920929,95.0,51.043861389160156,MS4_EEG_01,0.8999999761581421,1.0,false,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,"cosPhiFixed:{(0.00,0.80)}",1000.0 -ef4764b4-27b9-44bd-8b7d-6903df8b4a72,0.20000000298023224,-7.34271240234375,0.8999999761581421,98.0,41.763492584228516,NS_NET146_F1_(11)_PV,0.8999999761581421,1.0,false,666757e2-292e-473c-ac9c-04c0786574bc,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -23e79154-30f9-44c5-b9c7-ab80ab7a4b6a,0.20000000298023224,-19.919971466064453,0.8999999761581421,97.0,38.07854080200195,NS_NET146_F2_(8)_PV,0.8999999761581421,1.0,false,792b505c-87ab-4665-a31d-b6035c5ece70,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -de8cfef5-7620-4b9e-9a10-1faebb5a80c0,0.20000000298023224,4.093344211578369,0.8999999761581421,97.0,37.69556427001953,NS_NET116_S1_5_PV,0.8999999761581421,1.0,false,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.00,0.90)}",30.0 -cb646f5c-890a-4317-81eb-c7aeffb86389,0.20000000298023224,-1.5687041282653809,0.8999999761581421,96.0,43.37920379638672,NS_NET146_F1_(15)_PV,0.8999999761581421,1.0,false,00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 -fa6d5184-b205-4b1b-839f-7b21ac956c28,0.20000000298023224,-1.5687041282653809,0.8999999761581421,96.0,43.37920379638672,NS_NET146_F1_(2000)_PV,0.8999999761581421,1.0,false,fa6d5184-b205-4b1b-839f-7b21ac956c29,,,,"cosPhiFixed:{(0.00,0.90)}",10.0 +uuid,albedo,azimuth,cos_phi_rated,elevation_angle,eta_conv,id,k_g,k_t,market_reaction,node,operates_from,operates_until,operator,q_characteristics,s_rated +a1eb7fc1-3bee-4b65-a387-ef3046644bf0,0.20000000298023224,-8.999500274658203,0.8999999761581421,37.14517593383789,98.0,NS_NET146_F2_(12)_PV,0.8999999761581421,1.0,false,8254d91b-e5da-4402-bb8f-301eafa09d28,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +9d7cd8e2-d859-4f4f-9c01-abba06ef2e2c,0.20000000298023224,-14.803051948547363,0.8999999761581421,42.391395568847656,96.0,NS_NET146_F4_(12)_PV,0.8999999761581421,1.0,false,f8dd541b-4a4d-417e-89ff-a9650ee3aac2,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +e04c6258-0ee5-4928-96c1-8e04acbbcc8f,0.20000000298023224,3.925752878189087,0.8999999761581421,32.65638732910156,97.0,NS_NET146_F3_(12)_PV,0.8999999761581421,1.0,false,f6eff0d1-af6b-46ce-b430-4d30976ec08f,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +5206abaa-3abc-4a15-a8f2-778139a3fc65,0.20000000298023224,4.901591777801514,0.8999999761581421,42.587581634521484,98.0,NS_NET146_F3_(7)_PV,0.8999999761581421,1.0,false,f1e88392-3b2a-4ce8-a31f-c963f08f8043,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +033e5854-65d9-4a14-8b5c-6aa675ded4a2,0.20000000298023224,-0.8097801208496094,0.8999999761581421,41.69758605957031,96.0,NS_NET146_F1_(18)_PV,0.8999999761581421,1.0,false,2f921888-36d3-4c88-a8aa-1ecbdc62b9c4,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +6291eea2-689c-48f3-b7a9-5054bf567cab,0.20000000298023224,5.255863666534424,0.8999999761581421,36.56882858276367,97.0,NS_NET146_F3_(32)_PV,0.8999999761581421,1.0,false,fd3b7bb8-3976-4441-9211-745243afd80f,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +fa6d5184-b205-4b1b-839f-7b21ac956c28,0.20000000298023224,-1.5687041282653809,0.8999999761581421,43.37920379638672,96.0,NS_NET146_F1_(2000)_PV,0.8999999761581421,1.0,false,fa6d5184-b205-4b1b-839f-7b21ac956c29,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +51ed457c-81ff-470f-b45b-30a94a965c36,0.20000000298023224,-6.537350177764893,0.8999999761581421,33.695167541503906,98.0,NS_NET146_F1_(4)_PV,0.8999999761581421,1.0,false,dd9d4153-c56f-4457-ad5e-46a48d4486b6,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +83a0dcd8-d6ad-49bf-8cbc-5a5774ed18ac,0.20000000298023224,9.723748207092285,0.8999999761581421,51.525978088378906,98.0,NS_NET146_F2_(27)_PV,0.8999999761581421,1.0,false,b179c38b-5af0-4304-84b1-1dc03314fd80,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +4ff2235f-24d6-440c-bf09-76ef3eaa340d,0.20000000298023224,-13.216256141662598,0.800000011920929,35.950138092041016,98.0,MS3_EEG_01,0.8999999761581421,1.0,false,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +9b3ae847-e2ea-4598-b56e-35501f61f70c,0.20000000298023224,10.634596824645996,0.800000011920929,51.043861389160156,95.0,MS4_EEG_01,0.8999999761581421,1.0,false,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +b938f0ab-e2c4-469e-9979-303d42224932,0.20000000298023224,3.1050832271575928,0.8999999761581421,31.573686599731445,98.0,NS_NET136_S3_2_PV,0.8999999761581421,1.0,false,b46d4395-6724-4830-ba55-357e81fc2814,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +1a738cc5-b8f0-41f0-9f60-85073dc80136,0.20000000298023224,3.0615782737731934,0.8999999761581421,32.88844299316406,96.0,NS_NET146_F1_(37)_PV,0.8999999761581421,1.0,false,450426ac-a560-4d17-b1fc-9e169530a655,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +114efaa0-dd3f-47ce-bbbe-856cacb034d1,0.20000000298023224,11.962505340576172,0.8999999761581421,39.01054000854492,97.0,NS_NET146_F3_(18)_PV,0.8999999761581421,1.0,false,85ec9277-c5fd-4e5b-8a34-9627d9599ad7,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +4fc73066-d9a2-4175-84e5-f3692e050492,0.20000000298023224,9.423768997192383,0.8999999761581421,39.56998062133789,98.0,NS_NET146_F1_(35)_PV,0.8999999761581421,1.0,false,f5ae3279-fe21-4bb7-849a-eaacb0546b0e,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +26647b27-a278-4ddb-a68e-8437d24798ca,0.20000000298023224,6.223939418792725,0.800000011920929,42.38501739501953,98.0,MS3_EEG_05,0.8999999761581421,1.0,false,86dfce49-05b2-4208-a6ae-877c3e98e6be,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +90a5aeab-5a04-4580-bc1c-4d8ea399cc8c,0.20000000298023224,-9.382472038269043,0.8999999761581421,40.04149627685547,96.0,NS_NET146_F4_(6)_PV,0.8999999761581421,1.0,false,49dcfc70-76ca-4f6f-83f7-0bc2aab1ae34,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +3d74e9fc-be60-41bf-9339-cd067c9378a2,0.20000000298023224,-3.632584810256958,0.8999999761581421,40.744606018066406,97.0,NS_NET146_F1_(25)_PV,0.8999999761581421,1.0,false,2287c2a8-c2d0-4c63-80b5-6b66a1288df8,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +19d949f2-54ff-483c-928b-2438fc760385,0.20000000298023224,-8.571032524108887,0.8999999761581421,33.3157844543457,96.0,NS_NET146_F3_(20)_PV,0.8999999761581421,1.0,false,0ebf0088-f596-4cd1-9ae0-5da02dc40335,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +4e655530-909f-4acf-8ed9-d19f849265df,0.20000000298023224,13.844985008239746,0.8999999761581421,29.355819702148438,98.0,NS_NET146_F1_(21)_PV,0.8999999761581421,1.0,false,92cb5065-2e57-4099-8e29-75cbc0c80370,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +0818deae-c7d9-4252-ac4c-f147004e5752,0.20000000298023224,3.7626590728759766,0.800000011920929,39.33173751831055,98.0,MS2_EEG_05,0.8999999761581421,1.0,false,582ed42c-fd18-49ae-bdf5-6aa59353c7e3,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +e447506e-3d43-4bce-8aab-a7ca8b7fbc45,0.20000000298023224,3.8914573192596436,0.8999999761581421,42.77021408081055,98.0,NS_NET146_F4_(9)_PV,0.8999999761581421,1.0,false,9b889b73-c108-4b38-b6eb-3377841e0c83,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +0c8bcc26-ce6e-4d2c-acdd-e304cfb3c02f,0.20000000298023224,-1.1688426733016968,0.8999999761581421,47.49247360229492,95.0,NS_NET146_F3_(4)_PV,0.8999999761581421,1.0,false,f66df6fa-3dfa-4515-85d7-54d0f429fde7,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +de40f0bd-3793-4b02-b663-31d282b33f61,0.20000000298023224,-2.511692762374878,0.8999999761581421,44.8326416015625,96.0,NS_NET146_F3_(27)_PV,0.8999999761581421,1.0,false,55caf2ec-a21b-4afd-8830-1e4009cce396,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +2f99a367-0fc2-4ca2-ab58-cb5d7004a6bd,0.20000000298023224,-22.032642364501953,0.8999999761581421,32.09359359741211,96.0,NS_NET146_F1_(34)_PV,0.8999999761581421,1.0,false,fd4f6232-c28d-4fc3-81dd-03b84aad695e,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +d3bacaf6-8558-4df5-8481-8d684ef3e14d,0.20000000298023224,6.262790203094482,0.8999999761581421,23.13505744934082,97.0,NS_NET146_F1_(26)_PV,0.8999999761581421,1.0,false,154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +a364e957-2dcc-49c2-b213-2a68d9c3ee83,0.20000000298023224,20.24332618713379,0.800000011920929,32.75543975830078,97.0,MS2_EEG_07,0.8999999761581421,1.0,false,14a8dc4c-0906-402f-b073-6d6d4725d0cb,,,,"cosPhiFixed:{(0.0,0.8)}",2000.0 +bb929fcc-a67e-423c-9569-73364746383d,0.20000000298023224,6.103052139282227,0.8999999761581421,44.66648483276367,97.0,NS_NET146_F2_(21)_PV,0.8999999761581421,1.0,false,bd292f64-65e8-42ec-9b78-b9b9f013750e,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +61788990-7681-42c0-9d0c-cfd22d4d3a83,0.20000000298023224,-17.2542781829834,0.800000011920929,32.63483810424805,98.0,MS1_EEG_03,0.8999999761581421,1.0,false,787237ad-b3a8-4f2c-ab70-31c5113d82d7,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +5a612315-ad74-4d98-b350-7e44630b8a6e,0.20000000298023224,19.121809005737305,0.8999999761581421,36.42670440673828,96.0,NS_NET146_F3_(1)_PV,0.8999999761581421,1.0,false,22e58399-428f-4633-9ee4-e5fa0db68d6d,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +71e4f6f1-2b50-41ce-adb7-80a4e309bd63,0.20000000298023224,-7.6025238037109375,0.8999999761581421,38.04230499267578,96.0,NS_NET146_F4_(14)_PV,0.8999999761581421,1.0,false,f2d03b34-9595-4819-a00b-ff9ddd92eb07,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +287285e2-c0ac-40dc-a15f-82a5de6ef37f,0.20000000298023224,-4.0978522300720215,0.8999999761581421,36.18789291381836,97.0,NS_NET146_F2_(20)_PV,0.8999999761581421,1.0,false,2aa2d409-8bb2-477d-ac7a-6439552e136a,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +d350f4a1-c675-4f22-8fda-26ad0bd03edb,0.20000000298023224,-4.302062511444092,0.800000011920929,47.19122314453125,95.0,MS2_EEG_03,0.8999999761581421,1.0,false,69f7846e-d979-4c77-8a3b-e2ec2e1f6e76,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +75a4050d-bdfd-4ca4-a1fd-a5d729613ed5,0.20000000298023224,-8.951131820678711,0.800000011920929,35.71611022949219,95.0,MS4_EEG_07,0.8999999761581421,1.0,false,898d8295-bf35-4079-9374-99b059c2c956,,,,"cosPhiFixed:{(0.0,0.8)}",2000.0 +3776dfa9-f161-419e-9014-9cfb5a379025,0.20000000298023224,20.107717514038086,0.8999999761581421,39.57343292236328,98.0,NS_NET146_F4_(17)_PV,0.8999999761581421,1.0,false,155bb2dc-0121-413e-ab42-67c2ed5ce6ea,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +6cac0624-6336-4418-bcf0-990abcdb824b,0.20000000298023224,-8.097375869750977,0.8999999761581421,44.90728759765625,98.0,NS_NET146_F4_(16)_PV,0.8999999761581421,1.0,false,9f7599de-c488-46c5-b053-1279a511f7b9,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +cb646f5c-890a-4317-81eb-c7aeffb86389,0.20000000298023224,-1.5687041282653809,0.8999999761581421,43.37920379638672,96.0,NS_NET146_F1_(15)_PV,0.8999999761581421,1.0,false,00bbc353-d47e-4865-a696-fe5d29b9e6a2,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +d142aeef-1b06-4910-88b5-0bce6ef7c1e2,0.20000000298023224,4.056053638458252,0.8999999761581421,37.51328659057617,97.0,NS_NET146_F1_(26)_PV(1),0.8999999761581421,1.0,false,154e9a99-467b-4f65-9928-8ebb14149baa,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +0a2cdd93-b055-4e0b-8fce-088968316df4,0.20000000298023224,11.104238510131836,0.8999999761581421,32.18717575073242,96.0,NS_NET146_F1_(20)_PV,0.8999999761581421,1.0,false,7d45f0ab-1e6b-452f-b665-c4846cf046f5,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +95b1b117-1c7b-4a69-b10e-8963fbced23a,0.20000000298023224,1.3804796934127808,0.800000011920929,40.089256286621094,98.0,MS3_EEG_03,0.8999999761581421,1.0,false,e4502c52-b4d7-4082-a583-b5688d8244e0,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +b8209f35-1405-4f7f-b1ec-3c853954e2a8,0.20000000298023224,-0.43818584084510803,0.800000011920929,31.086620330810547,97.0,MS2_EEG_01,0.8999999761581421,1.0,false,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +dcc2950b-23cc-407d-b53f-0056234f7ee1,0.20000000298023224,-16.258031845092773,0.8999999761581421,31.165266036987305,96.0,NS_NET146_F2_(24)_PV,0.8999999761581421,1.0,false,970cf93c-36c5-4938-a7e4-3f184a7035f0,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +e87c9d51-cfec-4e04-9790-16cd6b238d51,0.20000000298023224,-16.93343734741211,0.8999999761581421,46.32542037963867,96.0,NS_NET146_F2_(4)_PV,0.8999999761581421,1.0,false,369cffa5-bcee-4489-8193-1d9b10230eca,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +23e79154-30f9-44c5-b9c7-ab80ab7a4b6a,0.20000000298023224,-19.919971466064453,0.8999999761581421,38.07854080200195,97.0,NS_NET146_F2_(8)_PV,0.8999999761581421,1.0,false,792b505c-87ab-4665-a31d-b6035c5ece70,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +6a909b40-9c28-4e7a-9a86-f52bb0c9d7e9,0.20000000298023224,-11.42428207397461,0.8999999761581421,40.5459098815918,97.0,NS_NET146_F3_(10)_PV,0.8999999761581421,1.0,false,4632291f-80d7-4e4a-9dc9-5c0fd0c56312,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +819018d3-4601-4c39-9d41-4a911572d406,0.20000000298023224,10.485807418823242,0.800000011920929,36.37184143066406,96.0,MS3_EEG_07,0.8999999761581421,1.0,false,40b0f497-96a3-49d9-9503-8fa67a5b532a,,,,"cosPhiFixed:{(0.0,0.8)}",2000.0 +0fbb53fd-cadb-4170-9f31-5af1cd05fd11,0.20000000298023224,0.9310876131057739,0.800000011920929,38.48886489868164,96.0,MS1_EEG_07,0.8999999761581421,1.0,false,7546df1d-8a62-4650-bf2e-d1e441b38d70,,,,"cosPhiFixed:{(0.0,0.8)}",2000.0 +cbcfa285-fe3a-4a98-bb4a-05d28d466c79,0.20000000298023224,1.1021884679794312,0.800000011920929,30.529081344604492,96.0,MS1_EEG_05,0.8999999761581421,1.0,false,c1c3b5c2-c79e-4368-a8ae-28fd0f4e357a,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +241b5dad-aaac-4f7c-8152-a32839fcfa13,0.20000000298023224,-5.435481071472168,0.8999999761581421,36.50833511352539,98.0,NS_NET146_F1_(10)_PV,0.8999999761581421,1.0,false,6c24b464-790a-4aae-bb11-766718f07cd5,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +4fa4ce55-0944-463a-a91b-3a3806286e0b,0.20000000298023224,-11.769233703613281,0.800000011920929,27.860116958618164,98.0,MS1_EEG_01,0.8999999761581421,1.0,false,f5839ade-5968-4879-a824-90b5fb3552cd,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +5b38af42-1ee4-4a41-b666-ea141187df37,0.20000000298023224,-11.463644027709961,0.8999999761581421,33.62879943847656,96.0,NS_NET146_F2_(3)_PV,0.8999999761581421,1.0,false,0170837a-1876-45f9-a613-666f9991964d,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +de8cfef5-7620-4b9e-9a10-1faebb5a80c0,0.20000000298023224,4.093344211578369,0.8999999761581421,37.69556427001953,97.0,NS_NET116_S1_5_PV,0.8999999761581421,1.0,false,92301422-94ae-48ab-89c7-a69eea9450b2,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +fad9b8c1-9ded-4856-ab91-f41217259363,0.20000000298023224,-7.745131015777588,0.8999999761581421,27.492389678955078,97.0,NS_NET146_F3_(3)_PV,0.8999999761581421,1.0,false,8b92ad35-8b0a-49b9-9f66-f42ddfeb9c65,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +c023f6f8-c35c-46d4-9ab7-1d098994d65d,0.20000000298023224,0.6144548654556274,0.8999999761581421,34.94338607788086,97.0,NS_NET146_F1_(1)_PV,0.8999999761581421,1.0,false,4f28e734-5148-4caf-ac64-270231740cbf,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +62b0cca9-b44c-4eda-999f-ae2832319848,0.20000000298023224,-8.658151626586914,0.8999999761581421,37.54166030883789,97.0,NS_NET146_F3_(22)_PV,0.8999999761581421,1.0,false,616da4e5-e837-44ec-bbbc-0cd12b5da8f7,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +2560c371-f420-4c2a-b4e6-e04c11b64c03,0.20000000298023224,0.7802008390426636,0.8999999761581421,40.086585998535156,98.0,NS_NET116_S3_2_PV,0.8999999761581421,1.0,false,550ebca7-1455-44eb-9431-ffbf08e58bd4,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +ef4764b4-27b9-44bd-8b7d-6903df8b4a72,0.20000000298023224,-7.34271240234375,0.8999999761581421,41.763492584228516,98.0,NS_NET146_F1_(11)_PV,0.8999999761581421,1.0,false,666757e2-292e-473c-ac9c-04c0786574bc,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +41a126ec-6254-4b68-821b-ecebb98ad0fd,0.20000000298023224,5.3010125160217285,0.8999999761581421,39.12493896484375,95.0,NS_NET146_F4_(7)_PV,0.8999999761581421,1.0,false,bea7ca63-3ae4-4280-8127-fe2c7fd5ea2d,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +53df57d0-c789-4393-b0a5-897a3bc821a2,0.20000000298023224,-1.3447864055633545,0.8999999761581421,37.434146881103516,95.0,NS_NET136_S1_5_PV,0.8999999761581421,1.0,false,926d6113-933f-49e3-9529-a3035acdc9b2,,,,"cosPhiFixed:{(0.0,0.9)}",30.0 +a50f12e1-33ed-4992-8579-da1800d5eff7,0.20000000298023224,11.473278045654297,0.8999999761581421,34.85277557373047,98.0,NS_NET146_F1_(29)_PV,0.8999999761581421,1.0,false,867c4b4d-0f38-4f28-82ce-135f2cc63808,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +3c98b5a6-1d44-449e-83e4-d610a4846d8f,0.20000000298023224,-12.883859634399414,0.800000011920929,38.764892578125,95.0,MS4_EEG_03,0.8999999761581421,1.0,false,85ea3976-1779-4d46-bd6f-dfd36427ebdf,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 +83f68d87-a893-4e7f-b21d-4874929f927d,0.20000000298023224,4.363753795623779,0.8999999761581421,35.53179168701172,95.0,NS_NET146_F3_(15)_PV,0.8999999761581421,1.0,false,d07dc1b0-e29a-452a-84c5-7df7b0bb3141,,,,"cosPhiFixed:{(0.0,0.9)}",10.0 +645b0617-e6ab-438b-a141-9c497d720e4b,0.20000000298023224,-5.639688968658447,0.800000011920929,34.71104049682617,97.0,MS4_EEG_05,0.8999999761581421,1.0,false,ee384ace-040e-4f21-8a8a-d702ab51af55,,,,"cosPhiFixed:{(0.0,0.8)}",1000.0 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/storage_type_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/storage_type_input.csv index 4f1a62242..31cce697f 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/storage_type_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/storage_type_input.csv @@ -1,2 +1,2 @@ -"uuid","active_power_gradient","capex","cos_phi_rated","e_storage","eta","id","opex","p_max","s_rated" -95d4c980-d9e1-4813-9f2a-b0942488a570,1.0,0.0,0.96,16.0,93.0,Typ_1,0.65,4.0,4.166666666666667 +uuid,active_power_gradient,capex,cos_phi_rated,dod,e_storage,eta,id,life_cycle,life_time,opex,p_max,s_rated +95d4c980-d9e1-4813-9f2a-b0942488a570,1.0,0.0,0.96,8.0,16.0,93.0,Typ_1,5000,5000.0,0.65,4.0,4.166666666666667 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/time_series_mapping.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/time_series_mapping.csv index f4e57691f..70d91edf5 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/time_series_mapping.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/time_series_mapping.csv @@ -1,2 +1,2 @@ -"uuid","participant","time_series" -e0fa5c16-1078-44d4-a23d-377ccff59c4a,4642d648-b0dd-4597-a3bd-2cc1fce74f27,8c04e94e-76b0-4369-a55c-f5e1117fb83e \ No newline at end of file +"participant","time_series" +4642d648-b0dd-4597-a3bd-2cc1fce74f27,8c04e94e-76b0-4369-a55c-f5e1117fb83e \ No newline at end of file diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_input.csv index 5bcbaddbe..0d7cfa360 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_input.csv @@ -1,10 +1,10 @@ -"uuid","auto_tap","id","node_a","node_b","operates_from","operates_until","operator","parallel_devices","tap_pos","type" -1132dbf4-e8a1-44ae-8415-f42d4497aa1d,true,S3_MS-Trafo,33f29587-f63e-45b7-960b-037bda37a3cb,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,1,0,14b1798a-6903-49d6-8578-ad2a7d399341 -4ac7f0bd-2ea9-4510-9e71-0da40886d9d3,false,TRA_MS3_06-NS_NET136,39dbc5ed-d874-48a8-9128-e970436a94b4,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,,,,1,10,f88989c7-9812-4b3e-9bc0-3df29f1e5ae1 -2cbbd48e-e6d8-40b4-80cc-010157dfbf3e,false,TRA_MS1_06-NS_NET116,b22c9299-5fb4-46a7-b566-fc17e0d51d60,31a2b9bf-e785-4475-aa44-1c34646e8c79,,,,1,10,f88989c7-9812-4b3e-9bc0-3df29f1e5ae1 -18d6ef15-962a-480d-a96a-9ba19ba4b3b3,false,TRA_MS2_06-NS_NET126_ONS,df97c0d1-379b-417a-a473-8e7fe37da99d,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,,,,1,10,f88989c7-9812-4b3e-9bc0-3df29f1e5ae1 -bfa702b1-d4d4-44ff-8c3d-a79c2418b5d3,true,S1_MS-Trafo,00d03670-7833-47ee-ad52-04d18d1c64fd,f5839ade-5968-4879-a824-90b5fb3552cd,,,,1,0,14b1798a-6903-49d6-8578-ad2a7d399341 -d2a3736d-d10b-4f38-88cf-871df43e3665,true,HöS-Trafo_S1,34cd8ee0-e607-4c47-89a7-121c3e32768a,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,1,0,97735722-05cc-4ca8-8a8d-c08ac3ded19a +uuid,auto_tap,id,node_a,node_b,operates_from,operates_until,operator,parallel_devices,tap_pos,type aa5d6bf2-2a88-4cac-9e1f-2a5c19dd2c18,false,TRA_MS4_06-NS_NET146_ONS,fa6d5184-b205-4b1b-839f-7b21ac956c29,3da4fd3d-ac5e-409d-91fa-36516673cf57,,,,1,10,49cfe484-0183-4a23-a922-d72909dba673 -e62b6f82-9a37-49e6-af51-93008df6ea53,true,S2_MS-Trafo,dfae9806-9b44-4995-ba27-d66d8e4a43e0,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,1,0,14b1798a-6903-49d6-8578-ad2a7d399341 +bfa702b1-d4d4-44ff-8c3d-a79c2418b5d3,true,S1_MS-Trafo,00d03670-7833-47ee-ad52-04d18d1c64fd,f5839ade-5968-4879-a824-90b5fb3552cd,,,,1,0,1214c366-826e-4aeb-88f5-af8f40acaa04 +1132dbf4-e8a1-44ae-8415-f42d4497aa1d,true,S3_MS-Trafo,33f29587-f63e-45b7-960b-037bda37a3cb,bb59ca46-1f2e-41c9-9723-90b306f043cd,,,,1,0,cf7b1102-8dbd-4da2-a469-90800b3394b6 +2cbbd48e-e6d8-40b4-80cc-010157dfbf3e,false,TRA_MS1_06-NS_NET116,b22c9299-5fb4-46a7-b566-fc17e0d51d60,31a2b9bf-e785-4475-aa44-1c34646e8c79,,,,1,10,4984f493-d6e5-4201-a040-c10722b30362 +18d6ef15-962a-480d-a96a-9ba19ba4b3b3,false,TRA_MS2_06-NS_NET126_ONS,df97c0d1-379b-417a-a473-8e7fe37da99d,2d4beb13-8e6c-46de-9b1c-409c7ca7573a,,,,1,10,f88989c7-9812-4b3e-9bc0-3df29f1e5ae1 +e62b6f82-9a37-49e6-af51-93008df6ea53,true,S2_MS-Trafo,dfae9806-9b44-4995-ba27-d66d8e4a43e0,1a8ba1a5-3cee-4791-b21b-f17b08526873,,,,1,0,5901c24c-0c64-4be7-82df-21d4335abdb7 253a0e3a-c7e0-415e-bdbd-5152aa8f9e27,true,S4_MS-Trafo,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,77fc154f-f41c-4e75-bbb1-b7fca68b2f4e,,,,1,0,14b1798a-6903-49d6-8578-ad2a7d399341 +d2a3736d-d10b-4f38-88cf-871df43e3665,true,HöS-Trafo_S1,34cd8ee0-e607-4c47-89a7-121c3e32768a,00d03670-7833-47ee-ad52-04d18d1c64fd,,,,1,0,97735722-05cc-4ca8-8a8d-c08ac3ded19a +4ac7f0bd-2ea9-4510-9e71-0da40886d9d3,false,TRA_MS3_06-NS_NET136,39dbc5ed-d874-48a8-9128-e970436a94b4,d29f66a1-dee9-4e3e-9f41-c4bc8d375bbe,,,,1,10,a7a3d9b8-da90-4670-b865-4a527df542bd diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_type_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_type_input.csv index 09045c27d..893e181dc 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_type_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/transformer_2_w_type_input.csv @@ -1,5 +1,10 @@ -"uuid","b_m","d_phi","d_v","g_m","id","r_sc","s_rated","tap_max","tap_min","tap_neutr","tap_side","v_rated_a","v_rated_b","x_sc" -14b1798a-6903-49d6-8578-ad2a7d399341,0.0,0.0,1.5,0.0,HS-MS_1,45.375,20000.0,10,-10,0,false,110.0,20.0,102.759 +uuid,b_m,d_phi,d_v,g_m,id,r_sc,s_rated,tap_max,tap_min,tap_neutr,tap_side,v_rated_a,v_rated_b,x_sc +cf7b1102-8dbd-4da2-a469-90800b3394b6,0.0,0.0,1.5,0.0,HS-MS_1,45.375,20000.0,10,-10,0,false,110.0,20.0,102.759 +49cfe484-0183-4a23-a922-d72909dba673,0.0,0.0,0.5,0.0,MS-NS_2,25.0,400.0,10,-10,0,false,20.0,0.4,31.225 +4984f493-d6e5-4201-a040-c10722b30362,0.0,0.0,0.5,0.0,MS-NS_1,10.078,630.0,10,-10,0,false,20.0,0.4,23.312 97735722-05cc-4ca8-8a8d-c08ac3ded19a,-1.27,0.0,1.5,555.5,HöS-HS_1,5.415,200000.0,5,-5,0,false,380.0,110.0,108.165 +1214c366-826e-4aeb-88f5-af8f40acaa04,0.0,0.0,1.5,0.0,HS-MS_1,45.375,20000.0,10,-10,0,false,110.0,20.0,102.759 +14b1798a-6903-49d6-8578-ad2a7d399341,0.0,0.0,1.5,0.0,HS-MS_1,45.375,20000.0,10,-10,0,false,110.0,20.0,102.759 f88989c7-9812-4b3e-9bc0-3df29f1e5ae1,0.0,0.0,0.5,0.0,MS-NS_1,10.078,630.0,10,-10,0,false,20.0,0.4,23.312 -49cfe484-0183-4a23-a922-d72909dba673,0.0,0.0,0.5,0.0,MS-NS_2,25.0,400.0,10,-10,0,false,20.0,0.4,31.225 +5901c24c-0c64-4be7-82df-21d4335abdb7,0.0,0.0,1.5,0.0,HS-MS_1,45.375,20000.0,10,-10,0,false,110.0,20.0,102.759 +a7a3d9b8-da90-4670-b865-4a527df542bd,0.0,0.0,0.5,0.0,MS-NS_1,10.078,630.0,10,-10,0,false,20.0,0.4,23.312 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_input.csv index 6e1cfb9a4..bc5ad89ce 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_input.csv @@ -1,3 +1,3 @@ -"uuid","id","market_reaction","node","operates_from","operates_until","operator","q_characteristics","type" -f9eaec6e-ce25-42d7-8265-2f8f4679a816,HS_NET1_S4_WEA,false,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,"cosPhiFixed:{(0.00,0.90)}",b70374f3-1feb-45af-8011-1304a532d398 -d6ad8c73-716a-4244-9ae2-4a3735e492ab,HS_NET1_S2_WEA,false,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,"cosPhiFixed:{(0.00,0.90)}",b70374f3-1feb-45af-8011-1304a532d398 +uuid,id,market_reaction,node,operates_from,operates_until,operator,q_characteristics,type +d6ad8c73-716a-4244-9ae2-4a3735e492ab,HS_NET1_S2_WEA,false,dfae9806-9b44-4995-ba27-d66d8e4a43e0,,,,"cosPhiFixed:{(0.0,0.9)}",b70374f3-1feb-45af-8011-1304a532d398 +f9eaec6e-ce25-42d7-8265-2f8f4679a816,HS_NET1_S4_WEA,false,401f37f8-6f2c-4564-bc78-6736cb9cbf8d,,,,"cosPhiFixed:{(0.0,0.9)}",b70374f3-1feb-45af-8011-1304a532d398 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_type_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_type_input.csv index b87be9bda..392645876 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_type_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/wec_type_input.csv @@ -1,2 +1,2 @@ -"uuid","capex","cos_phi_rated","cp_characteristic","eta_conv","hub_height","id","opex","rotor_area","s_rated" -b70374f3-1feb-45af-8011-1304a532d398,0.0,0.9,"cP:{(0.0,0.0),(1.0,0.0),(2.0,0.115933516),(3.0,0.286255595),(4.0,0.39610618),(5.0,0.430345211),(6.0,0.45944023),(7.0,0.479507331),(8.0,0.492113623),(9.0,0.500417188),(10.0,0.488466547),(11.0,0.420415054),(12.0,0.354241299),(13.0,0.288470591),(14.0,0.230965702),(15.0,0.18778367),(16.0,0.154728976),(17.0,0.128998552),(18.0,0.108671106),(19.0,0.09239975),(20.0,0.079221236),(21.0,0.068434282),(22.0,0.059520087),(23.0,0.052089249),(24.0,0.045845623),(25.0,0.040561273),(26.0,0.036058824),(27.0,0.032198846),(28.0,0.016618264),(29.0,0.010330976),(30.0,0.006091519),(31.0,0.003331177),(32.0,0.001641637),(33.0,0.000705423),(34.0,0.000196644),(35.0,0.0),(36.0,0.0),(37.0,0.0),(38.0,0.0),(39.0,0.0),(40.0,0.0),(41.0,0.0),(42.0,0.0),(43.0,0.0),(44.0,0.0),(45.0,0.0),(46.0,0.0),(47.0,0.0),(48.0,0.0),(49.0,0.0),(50.0,0.0)}",100.0,98.0,EnerconE-82,0.0,5281.02,2222.2 +uuid,capex,cos_phi_rated,cp_characteristic,eta_conv,hub_height,id,opex,rotor_area,s_rated +b70374f3-1feb-45af-8011-1304a532d398,0.0,0.9,"cP:{(0.0,0.0),(1.0,0.0),(2.0,0.115933516),(3.0,0.286255595),(4.0,0.39610618),(5.0,0.430345211),(6.0,0.45944023),(7.0,0.479507331),(8.0,0.492113623),(9.0,0.500417188),(10.0,0.488466547),(11.0,0.420415054),(12.0,0.354241299),(13.0,0.288470591),(14.0,0.230965702),(15.0,0.18778367),(16.0,0.154728976),(17.0,0.128998552),(18.0,0.108671106),(19.0,0.09239975),(20.0,0.079221236),(21.0,0.068434282),(22.0,0.059520087),(23.0,0.052089249),(24.0,0.045845623),(25.0,0.040561273),(26.0,0.036058824),(27.0,0.032198846),(28.0,0.016618264),(29.0,0.010330976),(30.0,0.006091519),(31.0,0.003331177),(32.0,0.001641637),(33.0,7.05423E-4),(34.0,1.96644E-4),(35.0,0.0),(36.0,0.0),(37.0,0.0),(38.0,0.0),(39.0,0.0),(40.0,0.0),(41.0,0.0),(42.0,0.0),(43.0,0.0),(44.0,0.0),(45.0,0.0),(46.0,0.0),(47.0,0.0),(48.0,0.0),(49.0,0.0),(50.0,0.0)}",100.0,98.0,EnerconE-82,0.0,5281.02,2222.2 From 58926844f51680f4622cad3c959f3713d2fba998 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 16:16:25 +0100 Subject: [PATCH 274/310] Introduce thermal power for thermal storages --- CHANGELOG.md | 1 + .../input/thermal/cylindricalstorage.md | 6 +++- .../result/participant/cylindricalstorage.md | 2 +- .../main/input/ThermalDatamodelConcept.puml | 1 + .../input/CylindricalStorageInputFactory.java | 18 ++++++++-- .../thermal/CylindricalStorageInput.java | 35 ++++++++++++++++--- .../CylindricalStorageInputFactoryTest.groovy | 4 ++- .../ie3/datamodel/io/sink/SqlSinkTest.groovy | 2 +- .../io/source/csv/CsvThermalSourceTest.groovy | 1 + .../CylindricalStorageInputTest.groovy | 5 +-- .../ThermalValidationUtilsTest.groovy | 16 +++++---- .../common/SystemParticipantTestData.groovy | 5 ++- .../common/ThermalUnitInputTestData.groovy | 11 +++--- .../datamodel/io/sink/_sql/input_entities.sql | 1 + .../cylindrical_storage_input.csv | 4 +-- .../_thermal/cylindrical_storage_input.csv | 4 +-- 16 files changed, 88 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b35da38c7..b9d230a41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) - Added `BdewLoadProfileTimeSeries` [#1230](https://github.com/ie3-institute/PowerSystemDataModel/issues/1230) - Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) +- Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 6e674f91b..5da1828df 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -2,7 +2,7 @@ # Cylindrical Thermal Storage -Model of a cylindrical thermal storage using a fluent to store thermal energy. +Model of a cylindrical thermal storage using a fluid to store thermal energy. ## Attributes, Units and Remarks @@ -51,6 +51,10 @@ Model of a cylindrical thermal storage using a fluent to store thermal energy. * - c - kWh / (K :math:`\cdot` m³) - Specific heat capacity of the storage medium + + * - pThermalMax + - kW + - Maximum permissible thermal power of the storage ``` diff --git a/docs/readthedocs/models/result/participant/cylindricalstorage.md b/docs/readthedocs/models/result/participant/cylindricalstorage.md index b8a83dbf7..9fe8c5df5 100644 --- a/docs/readthedocs/models/result/participant/cylindricalstorage.md +++ b/docs/readthedocs/models/result/participant/cylindricalstorage.md @@ -2,7 +2,7 @@ # Cylindrical Thermal Storage -Result of a cylindrical thermal storage using a fluent to store thermal energy. +Result of a cylindrical thermal storage using a fluid to store thermal energy. ## Attributes, Units and Remarks diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 3f275bc5b..d94f2ce4b 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -118,6 +118,7 @@ package models { - inletTemp: ComparableQuantity [°C] - returnTemp: ComparableQuantity [°C] - c: ComparableQuantity [kWh/(K*m³)] + - pThermalMax: ComparableQuantity [kW] } CylindricalStorageInput --|> ThermalStorageInput } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java index 08545acd5..b41f1eecd 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactory.java @@ -12,6 +12,7 @@ import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; import java.util.UUID; +import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; @@ -22,6 +23,7 @@ public class CylindricalStorageInputFactory private static final String INLET_TEMP = "inletTemp"; private static final String RETURN_TEMP = "returnTemp"; private static final String C = "c"; + private static final String P_THERMAL_MAX = "pThermalMax"; public CylindricalStorageInputFactory() { super(CylindricalStorageInput.class); @@ -29,7 +31,7 @@ public CylindricalStorageInputFactory() { @Override protected String[] getAdditionalFields() { - return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C}; + return new String[] {STORAGE_VOLUME_LVL, INLET_TEMP, RETURN_TEMP, C, P_THERMAL_MAX}; } @Override @@ -48,7 +50,19 @@ protected CylindricalStorageInput buildModel( data.getQuantity(RETURN_TEMP, StandardUnits.TEMPERATURE); final ComparableQuantity c = data.getQuantity(C, StandardUnits.SPECIFIC_HEAT_CAPACITY); + final ComparableQuantity pThermalMax = + data.getQuantity(P_THERMAL_MAX, StandardUnits.ACTIVE_POWER_IN); + return new CylindricalStorageInput( - uuid, id, operator, operationTime, bus, storageVolumeLvl, inletTemp, returnTemp, c); + uuid, + id, + operator, + operationTime, + bus, + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 3b1c2c473..443f708bc 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -11,6 +11,7 @@ import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; import java.util.Objects; import java.util.UUID; +import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; @@ -25,6 +26,8 @@ public class CylindricalStorageInput extends ThermalStorageInput { private final ComparableQuantity returnTemp; /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ private final ComparableQuantity c; + /** Maximum permissible thermal power (typically in kW) */ + private final ComparableQuantity pThermalMax; /** * @param uuid Unique identifier of a cylindrical storage @@ -36,6 +39,7 @@ public class CylindricalStorageInput extends ThermalStorageInput { * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage */ public CylindricalStorageInput( UUID uuid, @@ -46,12 +50,14 @@ public CylindricalStorageInput( ComparableQuantity storageVolumeLvl, ComparableQuantity inletTemp, ComparableQuantity returnTemp, - ComparableQuantity c) { + ComparableQuantity c, + ComparableQuantity pThermalMax) { super(uuid, id, operator, operationTime, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } /** @@ -62,6 +68,7 @@ public CylindricalStorageInput( * @param inletTemp Temperature of the inlet * @param returnTemp Temperature of the outlet * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage */ public CylindricalStorageInput( UUID uuid, @@ -70,12 +77,14 @@ public CylindricalStorageInput( ComparableQuantity storageVolumeLvl, ComparableQuantity inletTemp, ComparableQuantity returnTemp, - ComparableQuantity c) { + ComparableQuantity c, + ComparableQuantity pThermalMax) { super(uuid, id, bus); this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } public ComparableQuantity getStorageVolumeLvl() { @@ -94,6 +103,10 @@ public ComparableQuantity getC() { return c; } + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + @Override public CylindricalStorageInputCopyBuilder copy() { return new CylindricalStorageInputCopyBuilder(this); @@ -107,12 +120,13 @@ public boolean equals(Object o) { return storageVolumeLvl.equals(that.storageVolumeLvl) && inletTemp.equals(that.inletTemp) && returnTemp.equals(that.returnTemp) - && c.equals(that.c); + && c.equals(that.c) + && pThermalMax.equals(that.getpThermalMax()); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c); + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } @Override @@ -136,6 +150,8 @@ public String toString() { + returnTemp + ", c=" + c + + ", pThermalMax=" + + pThermalMax + '}'; } @@ -151,6 +167,7 @@ public static class CylindricalStorageInputCopyBuilder private ComparableQuantity inletTemp; private ComparableQuantity returnTemp; private ComparableQuantity c; + private ComparableQuantity pThermalMax; private CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); @@ -158,6 +175,7 @@ private CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { this.inletTemp = entity.getInletTemp(); this.returnTemp = entity.getReturnTemp(); this.c = entity.getC(); + this.pThermalMax = entity.getpThermalMax(); } public CylindricalStorageInputCopyBuilder storageVolumeLvl( @@ -182,9 +200,15 @@ public CylindricalStorageInputCopyBuilder c(ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return this; + } + @Override public CylindricalStorageInputCopyBuilder scale(Double factor) { storageVolumeLvl(storageVolumeLvl.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); return this; } @@ -199,7 +223,8 @@ public CylindricalStorageInput build() { storageVolumeLvl, inletTemp, returnTemp, - c); + c, + pThermalMax); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy index 20e516f8e..e8d7f8989 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/CylindricalStorageInputFactoryTest.groovy @@ -34,7 +34,8 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto "storagevolumelvl" : "3", "inlettemp" : "4", "returntemp" : "5", - "c" : "6" + "c" : "6", + "pThermalMax" : "7" ] def inputClass = CylindricalStorageInput def thermalBusInput = Mock(ThermalBusInput) @@ -55,6 +56,7 @@ class CylindricalStorageInputFactoryTest extends Specification implements Facto assert inletTemp == getQuant(parameter["inlettemp"], StandardUnits.TEMPERATURE) assert returnTemp == getQuant(parameter["returntemp"], StandardUnits.TEMPERATURE) assert c == getQuant(parameter["c"], StandardUnits.SPECIFIC_HEAT_CAPACITY) + assert pThermalMax == getQuant(parameter["pThermalMax"], StandardUnits.ACTIVE_POWER_IN) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy index 75a0859a2..4973525e1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/SqlSinkTest.groovy @@ -133,7 +133,7 @@ class SqlSinkTest extends Specification implements TestContainerHelper, TimeSeri GridTestData.transformerCtoG, GridTestData.lineGraphicCtoD, GridTestData.nodeGraphicC, - ThermalUnitInputTestData.cylindricStorageInput, + ThermalUnitInputTestData.cylindricalStorageInput, ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index 915046bb6..a0e966bf7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -68,6 +68,7 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { inletTemp == sptd.inletTemp returnTemp == sptd.returnTemp c == sptd.c + pThermalMax == sptd.pThermalMax } //test method when operators and thermal buses are provided as constructor parameters diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy index eee911126..98e147f29 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInputTest.groovy @@ -13,7 +13,7 @@ class CylindricalStorageInputTest extends Specification { def "A CylindricalStorageInput copy method should work as expected"() { given: - def cylindricalStorageInput = ThermalUnitInputTestData.cylindricStorageInput + def cylindricalStorageInput = ThermalUnitInputTestData.cylindricalStorageInput when: def alteredUnit = cylindricalStorageInput.copy().storageVolumeLvl(ThermalUnitInputTestData.storageVolumeLvl) @@ -38,7 +38,7 @@ class CylindricalStorageInputTest extends Specification { def "Scaling a CylindricalStorageInput via builder should work as expected"() { given: - def cylindricalStorageInput = ThermalUnitInputTestData.cylindricStorageInput + def cylindricalStorageInput = ThermalUnitInputTestData.cylindricalStorageInput when: def alteredUnit = cylindricalStorageInput.copy().scale(2d).build() @@ -54,6 +54,7 @@ class CylindricalStorageInputTest extends Specification { assert inletTemp == cylindricalStorageInput.inletTemp assert returnTemp == cylindricalStorageInput.returnTemp assert c == cylindricalStorageInput.c + assert pThermalMax == cylindricalStorageInput.pThermalMax * 2d } } } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index aee73fe73..8015f655d 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -17,6 +17,7 @@ import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import edu.ie3.test.common.ThermalUnitInputTestData import edu.ie3.util.TimeUtil +import edu.ie3.util.quantities.PowerSystemUnits import edu.ie3.util.quantities.interfaces.HeatCapacity import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity import edu.ie3.util.quantities.interfaces.ThermalConductance @@ -24,6 +25,7 @@ import spock.lang.Specification import tech.units.indriya.ComparableQuantity import tech.units.indriya.quantity.Quantities +import javax.measure.quantity.Power import javax.measure.quantity.Temperature import javax.measure.quantity.Volume @@ -50,6 +52,7 @@ class ThermalValidationUtilsTest extends Specification { private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) + private static final ComparableQuantity pThermalMax = Quantities.getQuantity(10.2, StandardUnits.ACTIVE_POWER_IN) // Thermal House @@ -88,7 +91,7 @@ class ThermalValidationUtilsTest extends Specification { def "Smoke Test: Correct thermal cylindrical storage throws no exception"() { given: - def cylindricalStorageInput = ThermalUnitInputTestData.cylindricStorageInput + def cylindricalStorageInput = ThermalUnitInputTestData.cylindricalStorageInput when: ValidationUtils.check(cylindricalStorageInput) @@ -108,17 +111,18 @@ class ThermalValidationUtilsTest extends Specification { ex.message == expectedException.message where: - invalidCylindricalStorage || expectedSize || expectedException - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(100, StandardUnits.TEMPERATURE), c) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) - new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) + invalidCylindricalStorage || expectedSize || expectedException + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(200, StandardUnits.TEMPERATURE), c, pThermalMax) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, storageVolumeLvl, Quantities.getQuantity(100, StandardUnits.TEMPERATURE), Quantities.getQuantity(100, StandardUnits.TEMPERATURE), c, pThermalMax) || 1 || new InvalidEntityException("Inlet temperature of the cylindrical storage cannot be lower or equal than outlet temperature", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), pThermalMax) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) + new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY), Quantities.getQuantity(-20, PowerSystemUnits.KILOWATT)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³, -20 kW", invalidCylindricalStorage) } def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { when: def thermalBus = ThermalUnitInputTestData.thermalBus def cylindricalStorageInput = [ - ThermalUnitInputTestData.cylindricStorageInput + ThermalUnitInputTestData.cylindricalStorageInput ] diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index 6953bb55e..a3dc6a8f9 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -173,6 +173,8 @@ class SystemParticipantTestData { public static final ComparableQuantity returnTemp = Quantities.getQuantity(80, TEMPERATURE) public static final ComparableQuantity c = Quantities.getQuantity( 1, SPECIFIC_HEAT_CAPACITY) + public static final ComparableQuantity pThermalMax = Quantities.getQuantity(20, ACTIVE_POWER_IN) + public static final ThermalStorageInput thermalStorage = new CylindricalStorageInput( UUID.fromString("8851813b-3a7d-4fee-874b-4df9d724e4b3"), "test_cylindricThermalStorage", @@ -182,7 +184,8 @@ class SystemParticipantTestData { storageVolumeLvl, inletTemp, returnTemp, - c + c, + pThermalMax, ) public static final ChpInput chpInput = new ChpInput( diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index bf3f6a521..acffbade3 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -17,6 +17,7 @@ import edu.ie3.util.quantities.interfaces.ThermalConductance import tech.units.indriya.ComparableQuantity import tech.units.indriya.quantity.Quantities +import javax.measure.quantity.Power import javax.measure.quantity.Temperature import javax.measure.quantity.Volume @@ -48,20 +49,22 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) - // thermal cylindric storage input + // thermal cylindrical storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) private static final ComparableQuantity inletTemp = Quantities.getQuantity(100, StandardUnits.TEMPERATURE) private static final ComparableQuantity returnTemp = Quantities.getQuantity(80, StandardUnits.TEMPERATURE) private static final ComparableQuantity c = Quantities.getQuantity(1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY) + private static final ComparableQuantity pThermalMax = Quantities.getQuantity(20, StandardUnits.ACTIVE_POWER_IN) - public static final cylindricStorageInput = new CylindricalStorageInput( + public static final cylindricalStorageInput = new CylindricalStorageInput( thermalUnitUuid, - "test_cylindricStorageInput", + "testCylindricalStorageInput", operator, operationTime, thermalBus, storageVolumeLvl, inletTemp, returnTemp, - c) + c, + pThermalMax) } diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index 6018e6f7c..01481dbbc 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -89,6 +89,7 @@ CREATE TABLE public.cylindrical_storage_input return_temp double precision NOT NULL, storage_volume_lvl double precision NOT NULL, thermal_bus uuid NOT NULL, + p_thermal_max DOUBLE PRECISION NOT NULL, grid_uuid uuid NOT NULL ) WITHOUT OIDS diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv index 325d29445..0b0114091 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ -uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus,em -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 +uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,p_thermal_max,thermal_bus,em +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,20.0,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv index 4a11cda89..4f57d7972 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ -uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e +uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus,p_thermal_max +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e,20.0 From 5ccd9695b1dbdd3bc9478280369cb94486c5dd13 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 16:20:49 +0100 Subject: [PATCH 275/310] fix tests after renaming --- .../edu/ie3/datamodel/io/extractor/ExtractorTest.groovy | 8 ++++---- .../edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index be1cf541d..9c4968164 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -134,10 +134,10 @@ class ExtractorTest extends Specification { tutd.thermalBus.operator ] - tutd.cylindricStorageInput || [ - tutd.cylindricStorageInput.operator, - tutd.cylindricStorageInput.thermalBus, - tutd.cylindricStorageInput.thermalBus.operator + tutd.cylindricalStorageInput || [ + tutd.cylindricalStorageInput.operator, + tutd.cylindricalStorageInput.thermalBus, + tutd.cylindricalStorageInput.thermalBus.operator ] tutd.thermalHouseInput || [ diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 7a0957607..2ee20aa57 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -165,7 +165,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { GridTestData.transformerCtoG, GridTestData.lineGraphicCtoD, GridTestData.nodeGraphicC, - ThermalUnitInputTestData.cylindricStorageInput, + ThermalUnitInputTestData.cylindricalStorageInput, ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, From 44ead93ab04ef6464b3667049973ba855b3009ca Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 16:31:25 +0100 Subject: [PATCH 276/310] fix ThermalValidationUtils --- .../datamodel/utils/validation/ThermalValidationUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java index 15cc20d2f..a67a57ecf 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java @@ -254,7 +254,9 @@ private static List> checkCylindricalStorage( () -> detectZeroOrNegativeQuantities( new Quantity[] { - cylindricalStorageInput.getStorageVolumeLvl(), cylindricalStorageInput.getC() + cylindricalStorageInput.getStorageVolumeLvl(), + cylindricalStorageInput.getC(), + cylindricalStorageInput.getpThermalMax() }, cylindricalStorageInput), InvalidEntityException.class)); From 9eaf48867aa8bee660463700977b308e005e60f3 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 16:45:32 +0100 Subject: [PATCH 277/310] Add Attributes housingType and numberInhabitants to ThermalHouses --- CHANGELOG.md | 1 + docs/readthedocs/io/ValidationUtils.md | 2 +- .../input/thermal/cylindricalstorage.md | 2 +- .../models/input/thermal/thermalhouse.md | 8 +++ .../main/input/ThermalDatamodelConcept.puml | 2 + .../input/ThermalHouseInputFactory.java | 16 ++++- .../input/thermal/ThermalHouseInput.java | 61 +++++++++++++++++-- .../validation/ThermalValidationUtils.java | 27 ++++++++ .../input/ThermalHouseInputFactoryTest.groovy | 7 ++- .../io/source/csv/CsvThermalSourceTest.groovy | 4 ++ .../thermal/ThermalHouseInputTest.groovy | 5 +- .../ThermalValidationUtilsTest.groovy | 28 +++++---- .../common/ThermalUnitInputTestData.groovy | 9 ++- .../datamodel/io/sink/_sql/input_entities.sql | 2 + .../csv/_thermal/thermal_house_input.csv | 4 +- 15 files changed, 150 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b35da38c7..6334f7c97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) - Added `BdewLoadProfileTimeSeries` [#1230](https://github.com/ie3-institute/PowerSystemDataModel/issues/1230) - Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) +- Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/docs/readthedocs/io/ValidationUtils.md b/docs/readthedocs/io/ValidationUtils.md index 7937ac204..4c2bf9194 100644 --- a/docs/readthedocs/io/ValidationUtils.md +++ b/docs/readthedocs/io/ValidationUtils.md @@ -74,7 +74,7 @@ The ValidationUtils include validation checks for... - HpTypeInput - StorageTypeInput - WecTypeInput -- ThermalUnitValidationUtils +- ThermalValidationUtils - ThermalUnitInput - ThermalSinkInput - ThermalHouseInput diff --git a/docs/readthedocs/models/input/thermal/cylindricalstorage.md b/docs/readthedocs/models/input/thermal/cylindricalstorage.md index 6e674f91b..ba25c5f5a 100644 --- a/docs/readthedocs/models/input/thermal/cylindricalstorage.md +++ b/docs/readthedocs/models/input/thermal/cylindricalstorage.md @@ -2,7 +2,7 @@ # Cylindrical Thermal Storage -Model of a cylindrical thermal storage using a fluent to store thermal energy. +Model of a cylindrical thermal storage using a fluid to store thermal energy. ## Attributes, Units and Remarks diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index 50837ee65..bcf0da11d 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -56,6 +56,14 @@ This reflects a simple shoe box with transmission losses * - lowerTemperatureLimit - °C - Lower temperature boundary + + * - housingType + - – + - Type of building can either be house or flat + + * - numberInhabititans + - – + - Number of people living in the house ``` diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 3f275bc5b..466c4fdc0 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -107,6 +107,8 @@ package models { - targetTemperature: ComparableQuantity [°C] - upperTemperatureLimit: ComparableQuantity [°C] - lowerTemperatureLimit: ComparableQuantity [°C] + - houseType: String ['house' or 'flat'] + - numberInhabitants: Integer } ThermalHouseInput --|> ThermalSinkInput diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java index 6fab0fc61..69533c930 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java @@ -23,6 +23,8 @@ public class ThermalHouseInputFactory private static final String TARGET_TEMPERATURE = "targetTemperature"; private static final String UPPER_TEMPERATURE_LIMIT = "upperTemperatureLimit"; private static final String LOWER_TEMPERATURE_LIMIT = "lowerTemperatureLimit"; + private static final String HOUSING_TYPE = "housingType"; + private static final String NUMBER_INHABITANTS = "numberInhabitants"; public ThermalHouseInputFactory() { super(ThermalHouseInput.class); @@ -31,7 +33,13 @@ public ThermalHouseInputFactory() { @Override protected String[] getAdditionalFields() { return new String[] { - ETH_LOSSES, ETH_CAPA, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT + ETH_LOSSES, + ETH_CAPA, + TARGET_TEMPERATURE, + UPPER_TEMPERATURE_LIMIT, + LOWER_TEMPERATURE_LIMIT, + HOUSING_TYPE, + NUMBER_INHABITANTS }; } @@ -53,6 +61,8 @@ protected ThermalHouseInput buildModel( data.getQuantity(UPPER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); final ComparableQuantity lowerTemperatureLimit = data.getQuantity(LOWER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); + final String housingType = data.getField(HOUSING_TYPE); + final Integer numberInhabitants = data.getInt(NUMBER_INHABITANTS); return new ThermalHouseInput( uuid, id, @@ -63,6 +73,8 @@ protected ThermalHouseInput buildModel( ethCapa, targetTemperature, upperTemperatureLimit, - lowerTemperatureLimit); + lowerTemperatureLimit, + housingType, + numberInhabitants); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index b0fbab0b6..e2a89a833 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -27,6 +27,10 @@ public class ThermalHouseInput extends ThermalSinkInput { private final ComparableQuantity upperTemperatureLimit; /** Lower boundary temperature of the thermal house model (typically in °C) */ private final ComparableQuantity lowerTemperatureLimit; + /** Type of the building, e.g. house or flat */ + private final String housingType; + /** Number of people living in the building, double to allow proper scaling */ + private final double numberInhabitants; /** * @param uuid Unique identifier of a thermal house model @@ -37,6 +41,8 @@ public class ThermalHouseInput extends ThermalSinkInput { * @param targetTemperature Desired target temperature of the thermal house model * @param upperTemperatureLimit Upper boundary temperature of the thermal house model * @param lowerTemperatureLimit Lower boundary temperature of the thermal house model + * @param housingType Type of the building: either house or flat + * @param numberInhabitants Number of inhabitants living in this house */ public ThermalHouseInput( UUID uuid, @@ -46,13 +52,17 @@ public ThermalHouseInput( ComparableQuantity ethCapa, ComparableQuantity targetTemperature, ComparableQuantity upperTemperatureLimit, - ComparableQuantity lowerTemperatureLimit) { + ComparableQuantity lowerTemperatureLimit, + String housingType, + double numberInhabitants) { super(uuid, id, bus); this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); this.targetTemperature = targetTemperature.to(StandardUnits.TEMPERATURE); this.upperTemperatureLimit = upperTemperatureLimit.to(StandardUnits.TEMPERATURE); this.lowerTemperatureLimit = lowerTemperatureLimit.to(StandardUnits.TEMPERATURE); + this.housingType = housingType; + this.numberInhabitants = numberInhabitants; } /** @@ -66,6 +76,8 @@ public ThermalHouseInput( * @param targetTemperature Desired target temperature of the thermal house model * @param upperTemperatureLimit Upper boundary temperature of the thermal house model * @param lowerTemperatureLimit Lower boundary temperature of the thermal house model + * @param housingType Type of the building: either house or flat + * @param numberInhabitants Number of inhabitants living in this house */ public ThermalHouseInput( UUID uuid, @@ -77,13 +89,17 @@ public ThermalHouseInput( ComparableQuantity ethCapa, ComparableQuantity targetTemperature, ComparableQuantity upperTemperatureLimit, - ComparableQuantity lowerTemperatureLimit) { + ComparableQuantity lowerTemperatureLimit, + String housingType, + double numberInhabitants) { super(uuid, id, operator, operationTime, bus); this.ethLosses = ethLosses.to(StandardUnits.THERMAL_TRANSMISSION); this.ethCapa = ethCapa.to(StandardUnits.HEAT_CAPACITY); this.targetTemperature = targetTemperature.to(StandardUnits.TEMPERATURE); this.upperTemperatureLimit = upperTemperatureLimit.to(StandardUnits.TEMPERATURE); this.lowerTemperatureLimit = lowerTemperatureLimit.to(StandardUnits.TEMPERATURE); + this.housingType = housingType; + this.numberInhabitants = numberInhabitants; } public ComparableQuantity getEthLosses() { @@ -106,6 +122,14 @@ public ComparableQuantity getLowerTemperatureLimit() { return lowerTemperatureLimit; } + public String getHousingType() { + return housingType; + } + + public double getNumberOfInhabitants() { + return numberInhabitants; + } + @Override public ThermalHouseInputCopyBuilder copy() { return new ThermalHouseInputCopyBuilder(this); @@ -120,7 +144,9 @@ public boolean equals(Object o) { && ethCapa.equals(that.ethCapa) && targetTemperature.equals(that.targetTemperature) && upperTemperatureLimit.equals(that.upperTemperatureLimit) - && lowerTemperatureLimit.equals(that.lowerTemperatureLimit); + && lowerTemperatureLimit.equals(that.lowerTemperatureLimit) + && Objects.equals(housingType, that.housingType) + && Objects.equals(numberInhabitants, that.numberInhabitants); } @Override @@ -131,7 +157,9 @@ public int hashCode() { ethCapa, targetTemperature, upperTemperatureLimit, - lowerTemperatureLimit); + lowerTemperatureLimit, + housingType, + numberInhabitants); } @Override @@ -157,6 +185,10 @@ public String toString() { + upperTemperatureLimit + ", lowerTemperatureLimit=" + lowerTemperatureLimit + + ", housingType=" + + housingType + + ", numberInhabitants=" + + numberInhabitants + '}'; } @@ -173,6 +205,8 @@ public static class ThermalHouseInputCopyBuilder private ComparableQuantity targetTemperature; private ComparableQuantity upperTemperatureLimit; private ComparableQuantity lowerTemperatureLimit; + private String housingType; + private double numberInhabitants; private ThermalHouseInputCopyBuilder(ThermalHouseInput entity) { super(entity); @@ -181,6 +215,8 @@ private ThermalHouseInputCopyBuilder(ThermalHouseInput entity) { this.targetTemperature = entity.getTargetTemperature(); this.upperTemperatureLimit = entity.getUpperTemperatureLimit(); this.lowerTemperatureLimit = entity.getLowerTemperatureLimit(); + this.housingType = entity.getHousingType(); + this.numberInhabitants = entity.getNumberOfInhabitants(); } public ThermalHouseInputCopyBuilder ethLosses( @@ -212,12 +248,23 @@ public ThermalHouseInputCopyBuilder lowerTemperatureLimit( return this; } + public ThermalHouseInputCopyBuilder housingType(String housingType) { + this.housingType = housingType; + return this; + } + + public ThermalHouseInputCopyBuilder numberInhabitants(double numberInhabitants) { + this.numberInhabitants = numberInhabitants; + return this; + } + @Override public ThermalHouseInputCopyBuilder scale(Double factor) { - // scale losses as well as capacity to keep equal + // scale losses as well as capacity and number of inhabitants to keep equal // the time needed to heat a scaled house ethLosses(ethLosses.multiply(factor)); ethCapa(ethCapa.multiply(factor)); + numberInhabitants(numberInhabitants * factor); return this; } @@ -233,7 +280,9 @@ public ThermalHouseInput build() { ethCapa, targetTemperature, upperTemperatureLimit, - lowerTemperatureLimit); + lowerTemperatureLimit, + housingType, + numberInhabitants); } @Override diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java index 15cc20d2f..fc849a299 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/ThermalValidationUtils.java @@ -13,6 +13,7 @@ import edu.ie3.datamodel.utils.Try.Failure; import java.util.ArrayList; import java.util.List; +import java.util.Set; import javax.measure.Quantity; public class ThermalValidationUtils extends ValidationUtils { @@ -172,6 +173,8 @@ private ThermalValidationUtils() { *

  • its thermal capacity is positive *
  • its upper temperature limit is higher than the lower temperature limit *
  • its target temperature lies between the upper und lower limit temperatures + *
  • its housing type is either `house` or `flat` + *
  • its number of inhabitants is higher than zero * * * @param thermalHouseInput ThermalHouseInput to validate @@ -210,9 +213,33 @@ private static List> checkThermalHouse( thermalHouseInput))); } + if (!isValidHousingType(thermalHouseInput.getHousingType())) { + exceptions.add( + new Failure<>( + new InvalidEntityException( + "Housing type must be either 'house' or 'flat'", thermalHouseInput))); + } + + if (thermalHouseInput.getNumberOfInhabitants() <= 0) { + exceptions.add( + new Failure<>( + new InvalidEntityException( + "Number of inhabitants must be greater than zero", thermalHouseInput))); + } + return exceptions; } + /** + * Checks if the housing type is valid (either "house" or "flat"). + * + * @param housingType The housing type to check + * @return true if valid, false otherwise + */ + private static boolean isValidHousingType(String housingType) { + return Set.of("house", "flat").contains(housingType.toLowerCase()); + } + /** * Validates a cylindricalStorageInput if: * diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy index 82c0e7843..07f5794fd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy @@ -35,7 +35,10 @@ class ThermalHouseInputFactoryTest extends Specification implements FactoryTestH "ethcapa" : "4", "targetTemperature" : "5", "upperTemperatureLimit": "6", - "lowerTemperatureLimit": "7" + "lowerTemperatureLimit": "7", + "housingType" : "flat", + "numberInhabitants" : "9", + ] def inputClass = ThermalHouseInput def thermalBusInput = Mock(ThermalBusInput) @@ -57,6 +60,8 @@ class ThermalHouseInputFactoryTest extends Specification implements FactoryTestH assert targetTemperature == getQuant(parameter["targetTemperature"], StandardUnits.TEMPERATURE) assert upperTemperatureLimit == getQuant(parameter["upperTemperatureLimit"], StandardUnits.TEMPERATURE) assert lowerTemperatureLimit == getQuant(parameter["lowerTemperatureLimit"], StandardUnits.TEMPERATURE) + assert housingType == parameter["housingType"] + assert numberInhabitants == parameter["numberInhabitants"].toInteger() } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index 915046bb6..bdbfc2528 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -114,6 +114,8 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + housingType == ThermalUnitInputTestData.thermalHouseInput.housingType + numberOfInhabitants == ThermalUnitInputTestData.thermalHouseInput.numberOfInhabitants } //test method when operators and thermal buses are provided as constructor parameters @@ -134,6 +136,8 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + housingType == ThermalUnitInputTestData.thermalHouseInput.housingType + numberOfInhabitants == ThermalUnitInputTestData.thermalHouseInput.numberOfInhabitants } } } \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy index d2f9c5afd..7f93dab21 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy @@ -67,7 +67,10 @@ class ThermalHouseInputTest extends Specification { Quantities.getQuantity(20, StandardUnits.HEAT_CAPACITY), Quantities.getQuantity(20, StandardUnits.TEMPERATURE), Quantities.getQuantity(25, StandardUnits.TEMPERATURE), - Quantities.getQuantity(15, StandardUnits.TEMPERATURE)) + Quantities.getQuantity(15, StandardUnits.TEMPERATURE), + "house", + 2 + ) expect: thermalHouseInput.targetTemperature == Quantities.getQuantity(20, StandardUnits.TEMPERATURE) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index aee73fe73..3c017676c 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -44,6 +44,8 @@ class ThermalValidationUtilsTest extends Specification { private static final ComparableQuantity TARGET_TEMPERATURE = Quantities.getQuantity(20, StandardUnits.TEMPERATURE) private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) + private static final String HOUSING_TYPE = "House" + private static final Integer NUMBER_INHABITANTS = 2.0 // Specific data for thermal cylindrical storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) @@ -64,7 +66,7 @@ class ThermalValidationUtilsTest extends Specification { noExceptionThrown() } - def "ThermalUnitValidationUtils.checkThermalHouse() recognizes all potential errors for a thermal house"() { + def "ThermalValidationUtils.checkThermalHouse() recognizes all potential errors for a thermal house"() { when: List> exceptions = ThermalValidationUtils.check(invalidThermalHouse).stream().filter { it -> it.failure }.toList() @@ -75,13 +77,15 @@ class ThermalValidationUtilsTest extends Specification { ex.message == expectedException.message where: - invalidThermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-10, StandardUnits.THERMAL_TRANSMISSION), ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("The following quantities have to be zero or positive: -10 kW/K", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, Quantities.getQuantity(0, StandardUnits.HEAT_CAPACITY), TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("The following quantities have to be positive: 0 kWh/K", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, Quantities.getQuantity(30, StandardUnits.TEMPERATURE)) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, TARGET_TEMPERATURE, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + invalidThermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-10, StandardUnits.THERMAL_TRANSMISSION), ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("The following quantities have to be zero or positive: -10 kW/K", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, Quantities.getQuantity(0, StandardUnits.HEAT_CAPACITY), TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("The following quantities have to be positive: 0 kWh/K", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, Quantities.getQuantity(30, StandardUnits.TEMPERATURE), HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, TARGET_TEMPERATURE, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "someWrongType", NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Housing type must be either 'house' or 'flat'", invalidThermalHouse) + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, 0d) || 1 || new InvalidEntityException("Number of inhabitants must be greater than zero", invalidThermalHouse) } // Thermal Cylindrical Storage @@ -97,7 +101,7 @@ class ThermalValidationUtilsTest extends Specification { noExceptionThrown() } - def "ThermalUnitValidationUtils.checkCylindricalStorage() recognizes all potential errors for a thermal cylindrical storage"() { + def "ThermalValidationUtils.checkCylindricalStorage() recognizes all potential errors for a thermal cylindrical storage"() { when: List> exceptions = ThermalValidationUtils.check(invalidCylindricalStorage).stream().filter { it -> it.failure }.toList() @@ -114,7 +118,7 @@ class ThermalValidationUtilsTest extends Specification { new CylindricalStorageInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, Quantities.getQuantity(-100, StandardUnits.VOLUME), inletTemp, returnTemp, Quantities.getQuantity(-1.05, StandardUnits.SPECIFIC_HEAT_CAPACITY)) || 1 || new InvalidEntityException("The following quantities have to be positive: -100 ㎥, -1.05 kWh/K*m³", invalidCylindricalStorage) } - def "ThermalUnitValidationUtils.check() works for complete ThermalGrid as well"() { + def "ThermalValidationUtils.check() works for complete ThermalGrid as well"() { when: def thermalBus = ThermalUnitInputTestData.thermalBus def cylindricalStorageInput = [ @@ -135,7 +139,7 @@ class ThermalValidationUtilsTest extends Specification { where: - thermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) + thermalHouse || expectedSize || expectedException + new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } } diff --git a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy index bf3f6a521..ce12807e6 100644 --- a/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/ThermalUnitInputTestData.groovy @@ -36,9 +36,12 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { private static final ComparableQuantity TARGET_TEMPERATURE = Quantities.getQuantity(20, StandardUnits.TEMPERATURE) private static final ComparableQuantity UPPER_TEMPERATURE_LIMIT = Quantities.getQuantity(25, StandardUnits.TEMPERATURE) private static final ComparableQuantity LOWER_TEMPERATURE_LIMIT = Quantities.getQuantity(15, StandardUnits.TEMPERATURE) + private static final String HOUSING_TYPE = "house" + private static final double NUMBER_INHABITANTS = 2.0 + public static final thermalHouseInput = new ThermalHouseInput( thermalUnitUuid, - "test_thermalHouseInput", + "testThermalHouseInput", operator, operationTime, thermalBus, @@ -46,7 +49,9 @@ class ThermalUnitInputTestData extends SystemParticipantTestData { ethCapa, TARGET_TEMPERATURE, UPPER_TEMPERATURE_LIMIT, - LOWER_TEMPERATURE_LIMIT) + LOWER_TEMPERATURE_LIMIT, + HOUSING_TYPE, + NUMBER_INHABITANTS) // thermal cylindric storage input private static final ComparableQuantity storageVolumeLvl = Quantities.getQuantity(100, StandardUnits.VOLUME) diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index 6018e6f7c..5d7cb1a50 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -107,6 +107,8 @@ CREATE TABLE public.thermal_house_input target_temperature DOUBLE PRECISION NOT NULL, thermal_bus UUID NOT NULL, upper_temperature_limit DOUBLE PRECISION NOT NULL, + housing_type TEXT NOT NULL, + number_of_inhabitants TEXT NOT NULL, grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv index a1a8cdbdc..87dcf4374 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/thermal_house_input.csv @@ -1,2 +1,2 @@ -uuid,id,operates_from,operates_until,operator,thermal_bus,eth_losses,eth_capa,target_temperature,upper_temperature_limit,lower_temperature_limit -717af017-cc69-406f-b452-e022d7fb516a,"test_thermalHouseInput",2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,0d95d7f2-49fb-4d49-8636-383a5220384e,10,20,20,25,15 \ No newline at end of file +uuid,id,operates_from,operates_until,operator,thermal_bus,eth_losses,eth_capa,target_temperature,upper_temperature_limit,lower_temperature_limit,housing_type,number_inhabitants +717af017-cc69-406f-b452-e022d7fb516a,"testThermalHouseInput",2020-03-24T15:11:31Z,2020-03-25T15:11:31Z,8f9682df-0744-4b58-a122-f0dc730f6510,0d95d7f2-49fb-4d49-8636-383a5220384e,10,20,20,25,15,"house",2 \ No newline at end of file From 79960727eb0f31b269fae8d192f0b4d8d6d4a427 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 16:54:15 +0100 Subject: [PATCH 278/310] remove double entry from changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66a930899..e5b9c0d64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,8 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) -- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) -- Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) +- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) From b1ddd42d1aab1f790da5bbafda7971cf1ba419a8 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Fri, 21 Feb 2025 17:21:16 +0100 Subject: [PATCH 279/310] include reviewers feedback --- docs/readthedocs/models/input/thermal/thermalhouse.md | 2 +- .../io/factory/input/ThermalHouseInputFactory.java | 2 +- .../datamodel/models/input/thermal/ThermalHouseInput.java | 2 +- .../io/factory/input/ThermalHouseInputFactoryTest.groovy | 2 +- .../models/input/thermal/ThermalHouseInputTest.groovy | 8 +++++++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/readthedocs/models/input/thermal/thermalhouse.md b/docs/readthedocs/models/input/thermal/thermalhouse.md index bcf0da11d..9120eb27f 100644 --- a/docs/readthedocs/models/input/thermal/thermalhouse.md +++ b/docs/readthedocs/models/input/thermal/thermalhouse.md @@ -63,7 +63,7 @@ This reflects a simple shoe box with transmission losses * - numberInhabititans - – - - Number of people living in the house + - Number of people living in the house. Double values to enable modeling based on statistical data sources. ``` diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java index 69533c930..590dbcce1 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java @@ -62,7 +62,7 @@ protected ThermalHouseInput buildModel( final ComparableQuantity lowerTemperatureLimit = data.getQuantity(LOWER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); final String housingType = data.getField(HOUSING_TYPE); - final Integer numberInhabitants = data.getInt(NUMBER_INHABITANTS); + final Double numberInhabitants = data.getDouble(NUMBER_INHABITANTS); return new ThermalHouseInput( uuid, id, diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index e2a89a833..95af4144b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -187,7 +187,7 @@ public String toString() { + lowerTemperatureLimit + ", housingType=" + housingType - + ", numberInhabitants=" + + ", #Inhabitants=" + numberInhabitants + '}'; } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy index 07f5794fd..b2c1055c8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactoryTest.groovy @@ -61,7 +61,7 @@ class ThermalHouseInputFactoryTest extends Specification implements FactoryTestH assert upperTemperatureLimit == getQuant(parameter["upperTemperatureLimit"], StandardUnits.TEMPERATURE) assert lowerTemperatureLimit == getQuant(parameter["lowerTemperatureLimit"], StandardUnits.TEMPERATURE) assert housingType == parameter["housingType"] - assert numberInhabitants == parameter["numberInhabitants"].toInteger() + assert numberInhabitants == parameter["numberInhabitants"].toDouble() } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy index 7f93dab21..739e8c1d6 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/thermal/ThermalHouseInputTest.groovy @@ -38,6 +38,8 @@ class ThermalHouseInputTest extends Specification { assert targetTemperature == ThermalUnitInputTestData.TARGET_TEMPERATURE assert upperTemperatureLimit == ThermalUnitInputTestData.UPPER_TEMPERATURE_LIMIT assert lowerTemperatureLimit == ThermalUnitInputTestData.LOWER_TEMPERATURE_LIMIT + assert housingType == ThermalUnitInputTestData.HOUSING_TYPE + assert numberOfInhabitants == ThermalUnitInputTestData.NUMBER_INHABITANTS } } @@ -69,13 +71,15 @@ class ThermalHouseInputTest extends Specification { Quantities.getQuantity(25, StandardUnits.TEMPERATURE), Quantities.getQuantity(15, StandardUnits.TEMPERATURE), "house", - 2 + 2.0 ) expect: thermalHouseInput.targetTemperature == Quantities.getQuantity(20, StandardUnits.TEMPERATURE) thermalHouseInput.upperTemperatureLimit == Quantities.getQuantity(25, StandardUnits.TEMPERATURE) thermalHouseInput.lowerTemperatureLimit == Quantities.getQuantity(15, StandardUnits.TEMPERATURE) + thermalHouseInput.housingType == "house" + thermalHouseInput.numberOfInhabitants == 2.0 } def "Scaling a ThermalHouseInput via builder should work as expected"() { @@ -97,6 +101,8 @@ class ThermalHouseInputTest extends Specification { assert targetTemperature == thermalHouseInput.targetTemperature assert upperTemperatureLimit == thermalHouseInput.upperTemperatureLimit assert lowerTemperatureLimit == thermalHouseInput.lowerTemperatureLimit + assert housingType == thermalHouseInput.housingType + assert numberOfInhabitants == thermalHouseInput.numberOfInhabitants * 2d } } } From 8b867595a3871d42f13e5e8a8a4f9ce3f0a88744 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 12:38:23 +0100 Subject: [PATCH 280/310] include reviewers feedback --- docs/uml/main/input/ThermalDatamodelConcept.puml | 2 +- .../datamodel/io/factory/input/ThermalHouseInputFactory.java | 2 +- .../ie3/datamodel/models/input/thermal/ThermalHouseInput.java | 2 +- .../resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 2df67bae6..11abcb7ac 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -108,7 +108,7 @@ package models { - upperTemperatureLimit: ComparableQuantity [°C] - lowerTemperatureLimit: ComparableQuantity [°C] - houseType: String ['house' or 'flat'] - - numberInhabitants: Integer + - numberInhabitants: Double } ThermalHouseInput --|> ThermalSinkInput diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java index 590dbcce1..6972f99a0 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalHouseInputFactory.java @@ -62,7 +62,7 @@ protected ThermalHouseInput buildModel( final ComparableQuantity lowerTemperatureLimit = data.getQuantity(LOWER_TEMPERATURE_LIMIT, StandardUnits.TEMPERATURE); final String housingType = data.getField(HOUSING_TYPE); - final Double numberInhabitants = data.getDouble(NUMBER_INHABITANTS); + final double numberInhabitants = data.getDouble(NUMBER_INHABITANTS); return new ThermalHouseInput( uuid, id, diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java index 95af4144b..e5ccfd342 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/ThermalHouseInput.java @@ -187,7 +187,7 @@ public String toString() { + lowerTemperatureLimit + ", housingType=" + housingType - + ", #Inhabitants=" + + ", #inhabitants=" + numberInhabitants + '}'; } diff --git a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql index adbfe4a9e..31464bae3 100644 --- a/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql +++ b/src/test/resources/edu/ie3/datamodel/io/sink/_sql/input_entities.sql @@ -109,7 +109,7 @@ CREATE TABLE public.thermal_house_input thermal_bus UUID NOT NULL, upper_temperature_limit DOUBLE PRECISION NOT NULL, housing_type TEXT NOT NULL, - number_of_inhabitants TEXT NOT NULL, + number_of_inhabitants DOUBLE PRECISION NOT NULL, grid_uuid UUID NOT NULL REFERENCES grids(uuid) ) WITHOUT OIDS From a765db569e02480e2b12fcd526569a20a338d895 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 13:06:11 +0100 Subject: [PATCH 281/310] fix test input data --- .../io/source/csv/_participants/cylindrical_storage_input.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv index b48e80e60..d560ea36b 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ -uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,p_thermal_max,p_thermal_max,thermal_bus,em -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,20.0,20.0,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 +uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,p_thermal_max,thermal_bus,em +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,20.0,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 From fdfbe0088d41c753672179b2bbe23fa7a9dae10e Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 13:06:25 +0100 Subject: [PATCH 282/310] fix CylindricalStorageInput --- .../datamodel/models/input/thermal/CylindricalStorageInput.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 6252efa72..9792deff4 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -52,7 +52,6 @@ public CylindricalStorageInput( returnTemp, c, pThermalMax); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } /** From fd90159b8287cc18eb5049bfe4d58e25834fd584 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 13:12:51 +0100 Subject: [PATCH 283/310] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4c524d71..ace148413 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) -- Added domestic hot water storage model [#1131](https://github.com/ie3-institute/PowerSystemDataModel/issues/1131) +- Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) From d364ce0dcb8714d958f7202f5b1450906abca74a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:57:16 +0000 Subject: [PATCH 284/310] Bump sphinx from 8.2.0 to 8.2.1 in /docs/readthedocs (#1255) --- docs/readthedocs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/requirements.txt b/docs/readthedocs/requirements.txt index 257fa67e1..dabb2b301 100644 --- a/docs/readthedocs/requirements.txt +++ b/docs/readthedocs/requirements.txt @@ -1,6 +1,6 @@ commonmark==0.9.1 recommonmark==0.7.1 -Sphinx==8.2.0 +Sphinx==8.2.1 sphinx-rtd-theme==3.0.2 myst-parser==4.0.1 markdown-it-py==3.0.0 From 2d2b26a52cd69e877a81e9abdf9cb36b4fa3b719 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 14:26:00 +0100 Subject: [PATCH 285/310] fix typo in naming --- .../groovy/edu/ie3/test/common/SystemParticipantTestData.groovy | 2 +- .../io/source/csv/_participants/cylindrical_storage_input.csv | 2 +- .../io/source/csv/_thermal/cylindrical_storage_input.csv | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index f3c12c657..7611b78bc 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -178,7 +178,7 @@ class SystemParticipantTestData { public static final ThermalStorageInput thermalStorage = new CylindricalStorageInput( UUID.fromString("8851813b-3a7d-4fee-874b-4df9d724e4b3"), - "test_cylindricThermalStorage", + "test_cylindricalThermalStorage", GridTestData.profBroccoli, OperationTime.notLimited(), thermalBus, diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv index d560ea36b..141286dbb 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,p_thermal_max,thermal_bus,em -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,20.0,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricalThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,20.0,0d95d7f2-49fb-4d49-8636-383a5220384e,977157f4-25e5-4c72-bf34-440edc778792 diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv index 211cd2857..98f6d91e2 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,thermal_bus,p_thermal_max -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0d95d7f2-49fb-4d49-8636-383a5220384e,20.0 +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricalThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0d95d7f2-49fb-4d49-8636-383a5220384e,20.0 From 0d2fba2b348f35936160077063907c24b9917990 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 14:48:33 +0100 Subject: [PATCH 286/310] rollback changes with regard to AbstractThermalStorageInput --- .../thermal/AbstractThermalStorageInput.java | 221 ------------------ .../thermal/CylindricalStorageInput.java | 183 +++++++++++++-- .../thermal/DomesticHotWaterStorageInput.java | 35 ++- 3 files changed, 199 insertions(+), 240 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java deleted file mode 100644 index 940717377..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractThermalStorageInput.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * © 2025. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.input.thermal; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; -import java.util.Objects; -import java.util.UUID; -import javax.measure.quantity.Power; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Volume; -import tech.units.indriya.ComparableQuantity; - -public abstract class AbstractThermalStorageInput extends ThermalStorageInput { - - /** - * @param uuid Unique identifier of a cylindrical storage - * @param id Identifier of the thermal unit - * @param operator operator of the asset - * @param operationTime operation time of the asset - * @param bus Thermal bus, a thermal unit is connected to /** Available storage volume (typically - * in m³) - */ - private final ComparableQuantity storageVolumeLvl; - /** Temperature of the inlet (typically in C) */ - private final ComparableQuantity inletTemp; - /** Temperature of the outlet (typically in C) */ - private final ComparableQuantity returnTemp; - /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ - private final ComparableQuantity c; - /** Maximum permissible thermal power (typically in kW) */ - private final ComparableQuantity pThermalMax; - - AbstractThermalStorageInput( - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime, - ThermalBusInput bus, - ComparableQuantity storageVolumeLvl, - ComparableQuantity inletTemp, - ComparableQuantity returnTemp, - ComparableQuantity c, - ComparableQuantity pThermalMax) { - super(uuid, id, operator, operationTime, bus); - this.storageVolumeLvl = storageVolumeLvl; - this.inletTemp = inletTemp; - this.returnTemp = returnTemp; - this.c = c; - this.pThermalMax = pThermalMax; - } - - AbstractThermalStorageInput( - UUID uuid, - String id, - ThermalBusInput bus, - ComparableQuantity storageVolumeLvl, - ComparableQuantity inletTemp, - ComparableQuantity returnTemp, - ComparableQuantity c, - ComparableQuantity pThermalMax) { - super(uuid, id, bus); - this.storageVolumeLvl = storageVolumeLvl; - this.inletTemp = inletTemp; - this.returnTemp = returnTemp; - this.c = c; - this.pThermalMax = pThermalMax; - } - - public ComparableQuantity getStorageVolumeLvl() { - return storageVolumeLvl; - } - - public ComparableQuantity getInletTemp() { - return inletTemp; - } - - public ComparableQuantity getReturnTemp() { - return returnTemp; - } - - public ComparableQuantity getC() { - return c; - } - - public ComparableQuantity getpThermalMax() { - return pThermalMax; - } - - @Override - public AbstractThermalStorageInputCopyBuilder copy() { - return new AbstractThermalStorageInputCopyBuilder(this); - } - - /** - * A builder pattern based approach to create copies of {@link AbstractThermalStorageInput} - * entities with altered field values. For detailed field descriptions refer to java docs of - * {@link AbstractThermalStorageInput} - */ - public static class AbstractThermalStorageInputCopyBuilder - extends ThermalStorageInputCopyBuilder { - - private ComparableQuantity storageVolumeLvl; - private ComparableQuantity inletTemp; - private ComparableQuantity returnTemp; - private ComparableQuantity c; - private ComparableQuantity pThermalMax; - - protected AbstractThermalStorageInputCopyBuilder(AbstractThermalStorageInput entity) { - super(entity); - this.storageVolumeLvl = entity.getStorageVolumeLvl(); - this.inletTemp = entity.getInletTemp(); - this.returnTemp = entity.getReturnTemp(); - this.c = entity.getC(); - this.pThermalMax = entity.getpThermalMax(); - } - - public AbstractThermalStorageInputCopyBuilder storageVolumeLvl( - ComparableQuantity storageVolumeLvl) { - this.storageVolumeLvl = storageVolumeLvl; - return this; - } - - public AbstractThermalStorageInputCopyBuilder inletTemp( - ComparableQuantity inletTemp) { - this.inletTemp = inletTemp; - return this; - } - - public AbstractThermalStorageInputCopyBuilder returnTemp( - ComparableQuantity returnTemp) { - this.returnTemp = returnTemp; - return this; - } - - public AbstractThermalStorageInputCopyBuilder c(ComparableQuantity c) { - this.c = c; - return this; - } - - public AbstractThermalStorageInputCopyBuilder pThermalMax( - ComparableQuantity pThermalMax) { - this.pThermalMax = pThermalMax; - return this; - } - - @Override - public AbstractThermalStorageInputCopyBuilder scale(Double factor) { - storageVolumeLvl(storageVolumeLvl.multiply(factor)); - pThermalMax(pThermalMax.multiply(factor)); - return this; - } - - @Override - public CylindricalStorageInput build() { - return new CylindricalStorageInput( - getUuid(), - getId(), - getOperator(), - getOperationTime(), - getThermalBus(), - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); - } - - @Override - protected AbstractThermalStorageInputCopyBuilder thisInstance() { - return this; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof CylindricalStorageInput that)) return false; - if (!super.equals(o)) return false; - return storageVolumeLvl.equals(that.getStorageVolumeLvl()) - && inletTemp.equals(that.getInletTemp()) - && returnTemp.equals(that.getReturnTemp()) - && c.equals(that.getC()) - && pThermalMax.equals(that.getpThermalMax()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); - } - - @Override - public String toString() { - return "CylindricalStorageInput{" - + "uuid=" - + getUuid() - + ", id=" - + getId() - + ", operator=" - + getOperator().getUuid() - + ", operationTime=" - + getOperationTime() - + ", bus=" - + getThermalBus().getUuid() - + ", storageVolumeLvl=" - + storageVolumeLvl - + ", inletTemp=" - + inletTemp - + ", returnTemp=" - + returnTemp - + ", c=" - + c - + ", pThermalMax=" - + pThermalMax - + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 9792deff4..407466677 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -6,8 +6,10 @@ package edu.ie3.datamodel.models.input.thermal; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; +import java.util.Objects; import java.util.UUID; import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; @@ -15,10 +17,19 @@ import tech.units.indriya.ComparableQuantity; /** Thermal storage with cylindrical shape */ -public class CylindricalStorageInput extends AbstractThermalStorageInput { +public class CylindricalStorageInput extends ThermalStorageInput { + /** Available storage volume (typically in m³) */ + private final ComparableQuantity storageVolumeLvl; + /** Temperature of the inlet (typically in C) */ + private final ComparableQuantity inletTemp; + /** Temperature of the outlet (typically in C) */ + private final ComparableQuantity returnTemp; + /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ + private final ComparableQuantity c; + /** Maximum permissible thermal power (typically in kW) */ + private final ComparableQuantity pThermalMax; + /** - * Constructor for CylindricalStorageInput - * * @param uuid Unique identifier of a cylindrical storage * @param id Identifier of the thermal unit * @param operator operator of the asset @@ -41,17 +52,12 @@ public CylindricalStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super( - uuid, - id, - operator, - operationTime, - bus, - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); + super(uuid, id, operator, operationTime, bus); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); } /** @@ -73,14 +79,157 @@ public CylindricalStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); + super(uuid, id, bus); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + } + + public ComparableQuantity getStorageVolumeLvl() { + return storageVolumeLvl; + } + + public ComparableQuantity getInletTemp() { + return inletTemp; + } + + public ComparableQuantity getReturnTemp() { + return returnTemp; + } + + public ComparableQuantity getC() { + return c; + } + + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + + @Override + public CylindricalStorageInputCopyBuilder copy() { + return new CylindricalStorageInputCopyBuilder(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CylindricalStorageInput that)) return false; + if (!super.equals(o)) return false; + return storageVolumeLvl.equals(that.storageVolumeLvl) + && inletTemp.equals(that.inletTemp) + && returnTemp.equals(that.returnTemp) + && c.equals(that.c) + && pThermalMax.equals(that.getpThermalMax()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); + } + + @Override + public String toString() { + return "CylindricalStorageInput{" + + "uuid=" + + getUuid() + + ", id=" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", bus=" + + getThermalBus().getUuid() + + ", storageVolumeLvl=" + + storageVolumeLvl + + ", inletTemp=" + + inletTemp + + ", returnTemp=" + + returnTemp + + ", c=" + + c + + ", pThermalMax=" + + pThermalMax + + '}'; } + /** + * A builder pattern based approach to create copies of {@link CylindricalStorageInput} entities + * with altered field values. For detailed field descriptions refer to java docs of {@link + * CylindricalStorageInput} + */ public static class CylindricalStorageInputCopyBuilder - extends AbstractThermalStorageInputCopyBuilder { + extends ThermalStorageInputCopyBuilder { + + private ComparableQuantity storageVolumeLvl; + private ComparableQuantity inletTemp; + private ComparableQuantity returnTemp; + private ComparableQuantity c; + private ComparableQuantity pThermalMax; - protected CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { + CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); + this.storageVolumeLvl = entity.getStorageVolumeLvl(); + this.inletTemp = entity.getInletTemp(); + this.returnTemp = entity.getReturnTemp(); + this.c = entity.getC(); + this.pThermalMax = entity.getpThermalMax(); + } + + public CylindricalStorageInputCopyBuilder storageVolumeLvl( + ComparableQuantity storageVolumeLvl) { + this.storageVolumeLvl = storageVolumeLvl; + return this; + } + + public CylindricalStorageInputCopyBuilder inletTemp(ComparableQuantity inletTemp) { + this.inletTemp = inletTemp; + return this; + } + + public CylindricalStorageInputCopyBuilder returnTemp( + ComparableQuantity returnTemp) { + this.returnTemp = returnTemp; + return this; + } + + public CylindricalStorageInputCopyBuilder c(ComparableQuantity c) { + this.c = c; + return this; + } + + public CylindricalStorageInputCopyBuilder pThermalMax(ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return this; + } + + @Override + public CylindricalStorageInputCopyBuilder scale(Double factor) { + storageVolumeLvl(storageVolumeLvl.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); + return this; + } + + @Override + public CylindricalStorageInput build() { + return new CylindricalStorageInput( + getUuid(), + getId(), + getOperator(), + getOperationTime(), + getThermalBus(), + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); + } + + @Override + protected CylindricalStorageInputCopyBuilder thisInstance() { + return this; } } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 99012f3d4..64866069d 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -14,7 +14,7 @@ import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; -public class DomesticHotWaterStorageInput extends AbstractThermalStorageInput { +public class DomesticHotWaterStorageInput extends CylindricalStorageInput { /** * Constructor for DomesticHotWaterStorageInput @@ -78,8 +78,39 @@ public DomesticHotWaterStorageInput( super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } + @Override + public DomesticHotWaterStorageInputCopyBuilder copy() { + return new DomesticHotWaterStorageInputCopyBuilder(this); + } + + @Override + public String toString() { + return "DomesticHotWaterStorageInput{" + + "uuid=" + + getUuid() + + ", id=" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", bus=" + + getThermalBus().getUuid() + + ", storageVolumeLvl=" + + getStorageVolumeLvl() + + ", inletTemp=" + + getInletTemp() + + ", returnTemp=" + + getReturnTemp() + + ", c=" + + getC() + + ", pThermalMax=" + + getpThermalMax() + + '}'; + } + public static class DomesticHotWaterStorageInputCopyBuilder - extends AbstractThermalStorageInputCopyBuilder { + extends CylindricalStorageInputCopyBuilder { protected DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); From bb86ba5d4f57bdc0b501f03a52a1850deb42385d Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 14:50:59 +0100 Subject: [PATCH 287/310] fmt changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ace148413..f09ecbf14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,9 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Enhance `TimeSeriesSource` with method to retrieve the previous value before a given key [#1182](https://github.com/ie3-institute/PowerSystemDataModel/issues/1182) - Added `BdewLoadProfileTimeSeries` [#1230](https://github.com/ie3-institute/PowerSystemDataModel/issues/1230) - Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) -- Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) +- Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) -- Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) +- - Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) From ed4ab8ac187c7d26c00d573861f522643a388e18 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 14:51:50 +0100 Subject: [PATCH 288/310] fix uml --- docs/uml/main/input/ThermalDatamodelConcept.puml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 39aa15934..fcdd24472 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -129,6 +129,7 @@ package models { - inletTemp: ComparableQuantity [°C] - returnTemp: ComparableQuantity [°C] - c: ComparableQuantity [kWh/(K*m³)] + - pThermalMax: ComparableQuantity [kW] } DomesticHotWaterStorageInput --|> ThermalStorageInput } From 6de65f359123bf218654d228ed3a798ca84c4e34 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Mon, 24 Feb 2025 14:53:14 +0100 Subject: [PATCH 289/310] fmt --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f09ecbf14..89b866d0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `RandomLoadProfileTimeSeries` [#1232](https://github.com/ie3-institute/PowerSystemDataModel/issues/1232) - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) -- - Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) +- Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) From 7656fc59407f13961dd6e0a4ba857386e831f7c1 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 10:13:50 +0100 Subject: [PATCH 290/310] fmt ThermalDatamodelConcept.puml --- docs/uml/main/input/ThermalDatamodelConcept.puml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index fcdd24472..1f07c2b54 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -125,13 +125,13 @@ package models { CylindricalStorageInput --|> ThermalStorageInput class DomesticHotWaterStorageInput { - - storageVolumeLvl: ComparableQuantity [m³] - - inletTemp: ComparableQuantity [°C] - - returnTemp: ComparableQuantity [°C] - - c: ComparableQuantity [kWh/(K*m³)] - - pThermalMax: ComparableQuantity [kW] - } - DomesticHotWaterStorageInput --|> ThermalStorageInput + - storageVolumeLvl: ComparableQuantity [m³] + - inletTemp: ComparableQuantity [°C] + - returnTemp: ComparableQuantity [°C] + - c: ComparableQuantity [kWh/(K*m³)] + - pThermalMax: ComparableQuantity [kW] + } + DomesticHotWaterStorageInput --|> ThermalStorageInput } } } From c8ffad5f298c3d400f103d38f2b3f2d429502d85 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 10:20:17 +0100 Subject: [PATCH 291/310] use .collect(toMap()) --- src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 0b9b2feb0..ea714ab19 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -15,7 +15,6 @@ import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -128,7 +127,7 @@ public Map getThermalBuses(Map opera public Map getThermalStorages() throws SourceException { return Stream.of(getCylindricalStorages(), getDomesticHotWaterStorages()) .flatMap(Collection::stream) - .collect(Collectors.toMap(ThermalStorageInput::getUuid, storage -> storage)); + .collect(toMap()); } /** @@ -155,7 +154,7 @@ public Map getThermalStorages( throws SourceException { return Stream.of(getCylindricalStorages(), getDomesticHotWaterStorages()) .flatMap(Collection::stream) - .collect(Collectors.toMap(ThermalStorageInput::getUuid, storage -> storage)); + .collect(toMap()); } /** From 274ca0ea9a3c0f9a305987b8d52f2b1623e508e7 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 10:20:26 +0100 Subject: [PATCH 292/310] remove artefact --- src/main/java/edu/ie3/datamodel/utils/Try.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/Try.java b/src/main/java/edu/ie3/datamodel/utils/Try.java index 495a8eef8..ffe006407 100644 --- a/src/main/java/edu/ie3/datamodel/utils/Try.java +++ b/src/main/java/edu/ie3/datamodel/utils/Try.java @@ -8,7 +8,6 @@ import static java.util.stream.Collectors.partitioningBy; import edu.ie3.datamodel.exceptions.FailureException; -import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.TryException; import java.util.*; import java.util.function.BiFunction; @@ -639,7 +638,7 @@ public int hashCode() { */ @FunctionalInterface public interface TrySupplier { - T get() throws E, SourceException; + T get() throws E; } /** From 6eaaf33487b0f7161956797d1b4a22a5cd7240a4 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 10:25:51 +0100 Subject: [PATCH 293/310] fmt --- .../ie3/datamodel/models/input/container/ThermalGridTest.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy index 904635bb9..3dcde3c32 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/ThermalGridTest.groovy @@ -47,6 +47,7 @@ class ThermalGridTest extends Specification { def modifiedHouses = [Mock(ThermalHouseInput)] def modifiedHeatStorages = [Mock(CylindricalStorageInput)] def modifiedDomesticHotWaterStorages = [Mock(CylindricalStorageInput)] + when: def modifiedThermalGrid = thermalGrid.copy() .houses(modifiedHouses as Set) From 8c36978f449146976b7c7610685db85235ca94e9 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 10:26:17 +0100 Subject: [PATCH 294/310] make CylindricalStorageInputCopyBuilder protected --- .../datamodel/models/input/thermal/CylindricalStorageInput.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index 407466677..a2288bc0a 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -169,7 +169,7 @@ public static class CylindricalStorageInputCopyBuilder private ComparableQuantity c; private ComparableQuantity pThermalMax; - CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { + protected CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); this.storageVolumeLvl = entity.getStorageVolumeLvl(); this.inletTemp = entity.getInletTemp(); From d77f2910a8c79a4d8bae6b064f6539095ad70d3a Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 13:44:23 +0100 Subject: [PATCH 295/310] introduce AbstractStorageInput --- .../input/thermal/AbstractStorageInput.java | 230 ++++++++++++++++++ .../thermal/CylindricalStorageInput.java | 143 ++--------- .../thermal/DomesticHotWaterStorageInput.java | 24 +- 3 files changed, 276 insertions(+), 121 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java new file mode 100644 index 000000000..a7d495c45 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/AbstractStorageInput.java @@ -0,0 +1,230 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.thermal; + +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; +import java.util.Objects; +import java.util.UUID; +import javax.measure.quantity.Power; +import javax.measure.quantity.Temperature; +import javax.measure.quantity.Volume; +import tech.units.indriya.ComparableQuantity; + +/** Thermal storage with cylindrical shape */ +public abstract class AbstractStorageInput extends ThermalStorageInput { + /** Available storage volume (typically in m³) */ + private final ComparableQuantity storageVolumeLvl; + /** Temperature of the inlet (typically in C) */ + private final ComparableQuantity inletTemp; + /** Temperature of the outlet (typically in C) */ + private final ComparableQuantity returnTemp; + /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ + private final ComparableQuantity c; + /** Maximum permissible thermal power (typically in kW) */ + private final ComparableQuantity pThermalMax; + + /** + * @param uuid Unique identifier of a cylindrical storage + * @param id Identifier of the thermal unit + * @param operator operator of the asset + * @param operationTime operation time of the asset + * @param bus Thermal bus, a thermal unit is connected to + * @param storageVolumeLvl Available storage volume + * @param inletTemp Temperature of the inlet + * @param returnTemp Temperature of the outlet + * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage + */ + public AbstractStorageInput( + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime, + ThermalBusInput bus, + ComparableQuantity storageVolumeLvl, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(uuid, id, operator, operationTime, bus); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + } + + /** + * @param uuid Unique identifier of a cylindrical storage + * @param id Identifier of the thermal unit + * @param bus Thermal bus, a thermal unit is connected to + * @param storageVolumeLvl Available storage volume + * @param inletTemp Temperature of the inlet + * @param returnTemp Temperature of the outlet + * @param c Specific heat capacity of the storage medium + * @param pThermalMax Maximum thermal power of the storage + */ + public AbstractStorageInput( + UUID uuid, + String id, + ThermalBusInput bus, + ComparableQuantity storageVolumeLvl, + ComparableQuantity inletTemp, + ComparableQuantity returnTemp, + ComparableQuantity c, + ComparableQuantity pThermalMax) { + super(uuid, id, bus); + this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); + this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); + this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); + this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); + this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + } + + public ComparableQuantity getStorageVolumeLvl() { + return storageVolumeLvl; + } + + public ComparableQuantity getInletTemp() { + return inletTemp; + } + + public ComparableQuantity getReturnTemp() { + return returnTemp; + } + + public ComparableQuantity getC() { + return c; + } + + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AbstractStorageInput that)) return false; + if (!super.equals(o)) return false; + return storageVolumeLvl.equals(that.storageVolumeLvl) + && inletTemp.equals(that.inletTemp) + && returnTemp.equals(that.returnTemp) + && c.equals(that.c) + && pThermalMax.equals(that.getpThermalMax()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); + } + + @Override + public String toString() { + return "CylindricalStorageInput{" + + "uuid=" + + getUuid() + + ", id=" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", bus=" + + getThermalBus().getUuid() + + ", storageVolumeLvl=" + + storageVolumeLvl + + ", inletTemp=" + + inletTemp + + ", returnTemp=" + + returnTemp + + ", c=" + + c + + ", pThermalMax=" + + pThermalMax + + '}'; + } + + /** + * A builder pattern based approach to create copies of {@link AbstractStorageInput} entities with + * altered field values. For detailed field descriptions refer to java docs of {@link + * AbstractStorageInput} + */ + protected abstract static class AbstractStorageInputCopyBuilder< + B extends AbstractStorageInputCopyBuilder> + extends ThermalStorageInputCopyBuilder { + + private ComparableQuantity storageVolumeLvl; + private ComparableQuantity inletTemp; + private ComparableQuantity returnTemp; + private ComparableQuantity c; + private ComparableQuantity pThermalMax; + + protected AbstractStorageInputCopyBuilder(AbstractStorageInput entity) { + super(entity); + + this.storageVolumeLvl = entity.getStorageVolumeLvl(); + this.inletTemp = entity.getInletTemp(); + this.returnTemp = entity.getReturnTemp(); + this.c = entity.getC(); + this.pThermalMax = entity.getpThermalMax(); + } + + public B storageVolumeLvl(ComparableQuantity storageVolumeLvl) { + this.storageVolumeLvl = storageVolumeLvl; + return thisInstance(); + } + + public B inletTemp(ComparableQuantity inletTemp) { + this.inletTemp = inletTemp; + return thisInstance(); + } + + public B returnTemp(ComparableQuantity returnTemp) { + this.returnTemp = returnTemp; + return thisInstance(); + } + + public B c(ComparableQuantity c) { + this.c = c; + return thisInstance(); + } + + public B pThermalMax(ComparableQuantity pThermalMax) { + this.pThermalMax = pThermalMax; + return thisInstance(); + } + + @Override + public B scale(Double factor) { + storageVolumeLvl(storageVolumeLvl.multiply(factor)); + pThermalMax(pThermalMax.multiply(factor)); + return thisInstance(); + } + + public ComparableQuantity getStorageVolumeLvl() { + return storageVolumeLvl; + } + + public ComparableQuantity getInletTemp() { + return inletTemp; + } + + public ComparableQuantity getReturnTemp() { + return returnTemp; + } + + public ComparableQuantity getC() { + return c; + } + + public ComparableQuantity getpThermalMax() { + return pThermalMax; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java index a2288bc0a..9e43ef04b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/CylindricalStorageInput.java @@ -6,10 +6,8 @@ package edu.ie3.datamodel.models.input.thermal; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.util.quantities.interfaces.SpecificHeatCapacity; -import java.util.Objects; import java.util.UUID; import javax.measure.quantity.Power; import javax.measure.quantity.Temperature; @@ -17,18 +15,7 @@ import tech.units.indriya.ComparableQuantity; /** Thermal storage with cylindrical shape */ -public class CylindricalStorageInput extends ThermalStorageInput { - /** Available storage volume (typically in m³) */ - private final ComparableQuantity storageVolumeLvl; - /** Temperature of the inlet (typically in C) */ - private final ComparableQuantity inletTemp; - /** Temperature of the outlet (typically in C) */ - private final ComparableQuantity returnTemp; - /** Specific heat capacity of the storage medium (typically in kWh/K*m³) */ - private final ComparableQuantity c; - /** Maximum permissible thermal power (typically in kW) */ - private final ComparableQuantity pThermalMax; - +public class CylindricalStorageInput extends AbstractStorageInput { /** * @param uuid Unique identifier of a cylindrical storage * @param id Identifier of the thermal unit @@ -52,12 +39,17 @@ public CylindricalStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, operator, operationTime, bus); - this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); - this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); - this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); + super( + uuid, + id, + operator, + operationTime, + bus, + storageVolumeLvl, + inletTemp, + returnTemp, + c, + pThermalMax); } /** @@ -79,32 +71,7 @@ public CylindricalStorageInput( ComparableQuantity returnTemp, ComparableQuantity c, ComparableQuantity pThermalMax) { - super(uuid, id, bus); - this.storageVolumeLvl = storageVolumeLvl.to(StandardUnits.VOLUME); - this.inletTemp = inletTemp.to(StandardUnits.TEMPERATURE); - this.returnTemp = returnTemp.to(StandardUnits.TEMPERATURE); - this.c = c.to(StandardUnits.SPECIFIC_HEAT_CAPACITY); - this.pThermalMax = pThermalMax.to(StandardUnits.ACTIVE_POWER_IN); - } - - public ComparableQuantity getStorageVolumeLvl() { - return storageVolumeLvl; - } - - public ComparableQuantity getInletTemp() { - return inletTemp; - } - - public ComparableQuantity getReturnTemp() { - return returnTemp; - } - - public ComparableQuantity getC() { - return c; - } - - public ComparableQuantity getpThermalMax() { - return pThermalMax; + super(uuid, id, bus, storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); } @Override @@ -112,23 +79,6 @@ public CylindricalStorageInputCopyBuilder copy() { return new CylindricalStorageInputCopyBuilder(this); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof CylindricalStorageInput that)) return false; - if (!super.equals(o)) return false; - return storageVolumeLvl.equals(that.storageVolumeLvl) - && inletTemp.equals(that.inletTemp) - && returnTemp.equals(that.returnTemp) - && c.equals(that.c) - && pThermalMax.equals(that.getpThermalMax()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), storageVolumeLvl, inletTemp, returnTemp, c, pThermalMax); - } - @Override public String toString() { return "CylindricalStorageInput{" @@ -143,15 +93,15 @@ public String toString() { + ", bus=" + getThermalBus().getUuid() + ", storageVolumeLvl=" - + storageVolumeLvl + + getStorageVolumeLvl() + ", inletTemp=" - + inletTemp + + getInletTemp() + ", returnTemp=" - + returnTemp + + getReturnTemp() + ", c=" - + c + + getC() + ", pThermalMax=" - + pThermalMax + + getpThermalMax() + '}'; } @@ -161,55 +111,10 @@ public String toString() { * CylindricalStorageInput} */ public static class CylindricalStorageInputCopyBuilder - extends ThermalStorageInputCopyBuilder { - - private ComparableQuantity storageVolumeLvl; - private ComparableQuantity inletTemp; - private ComparableQuantity returnTemp; - private ComparableQuantity c; - private ComparableQuantity pThermalMax; + extends AbstractStorageInputCopyBuilder { protected CylindricalStorageInputCopyBuilder(CylindricalStorageInput entity) { super(entity); - this.storageVolumeLvl = entity.getStorageVolumeLvl(); - this.inletTemp = entity.getInletTemp(); - this.returnTemp = entity.getReturnTemp(); - this.c = entity.getC(); - this.pThermalMax = entity.getpThermalMax(); - } - - public CylindricalStorageInputCopyBuilder storageVolumeLvl( - ComparableQuantity storageVolumeLvl) { - this.storageVolumeLvl = storageVolumeLvl; - return this; - } - - public CylindricalStorageInputCopyBuilder inletTemp(ComparableQuantity inletTemp) { - this.inletTemp = inletTemp; - return this; - } - - public CylindricalStorageInputCopyBuilder returnTemp( - ComparableQuantity returnTemp) { - this.returnTemp = returnTemp; - return this; - } - - public CylindricalStorageInputCopyBuilder c(ComparableQuantity c) { - this.c = c; - return this; - } - - public CylindricalStorageInputCopyBuilder pThermalMax(ComparableQuantity pThermalMax) { - this.pThermalMax = pThermalMax; - return this; - } - - @Override - public CylindricalStorageInputCopyBuilder scale(Double factor) { - storageVolumeLvl(storageVolumeLvl.multiply(factor)); - pThermalMax(pThermalMax.multiply(factor)); - return this; } @Override @@ -220,11 +125,11 @@ public CylindricalStorageInput build() { getOperator(), getOperationTime(), getThermalBus(), - storageVolumeLvl, - inletTemp, - returnTemp, - c, - pThermalMax); + getStorageVolumeLvl(), + getInletTemp(), + getReturnTemp(), + getC(), + getpThermalMax()); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java index 64866069d..b26af2c79 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/thermal/DomesticHotWaterStorageInput.java @@ -14,7 +14,7 @@ import javax.measure.quantity.Volume; import tech.units.indriya.ComparableQuantity; -public class DomesticHotWaterStorageInput extends CylindricalStorageInput { +public class DomesticHotWaterStorageInput extends AbstractStorageInput { /** * Constructor for DomesticHotWaterStorageInput @@ -110,10 +110,30 @@ public String toString() { } public static class DomesticHotWaterStorageInputCopyBuilder - extends CylindricalStorageInputCopyBuilder { + extends AbstractStorageInputCopyBuilder { protected DomesticHotWaterStorageInputCopyBuilder(DomesticHotWaterStorageInput entity) { super(entity); } + + @Override + public DomesticHotWaterStorageInput build() { + return new DomesticHotWaterStorageInput( + getUuid(), + getId(), + getOperator(), + getOperationTime(), + getThermalBus(), + getStorageVolumeLvl(), + getInletTemp(), + getReturnTemp(), + getC(), + getpThermalMax()); + } + + @Override + protected DomesticHotWaterStorageInputCopyBuilder thisInstance() { + return this; + } } } From 1267cb3f1ed2116f888cc00fb3009b839da4db53 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 14:00:46 +0100 Subject: [PATCH 296/310] introduce AbstractStorageInput also to puml --- docs/uml/main/input/ThermalDatamodelConcept.puml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/uml/main/input/ThermalDatamodelConcept.puml b/docs/uml/main/input/ThermalDatamodelConcept.puml index 1f07c2b54..5fafcb880 100644 --- a/docs/uml/main/input/ThermalDatamodelConcept.puml +++ b/docs/uml/main/input/ThermalDatamodelConcept.puml @@ -115,6 +115,9 @@ package models { abstract class ThermalStorageInput ThermalStorageInput --|> ThermalUnitInput + abstract class AbstractStorageInput + AbstractStorageInput --|> ThermalStorageInput + class CylindricalStorageInput { - storageVolumeLvl: ComparableQuantity [m³] - inletTemp: ComparableQuantity [°C] @@ -122,7 +125,7 @@ package models { - c: ComparableQuantity [kWh/(K*m³)] - pThermalMax: ComparableQuantity [kW] } - CylindricalStorageInput --|> ThermalStorageInput + CylindricalStorageInput --|> AbstractStorageInput class DomesticHotWaterStorageInput { - storageVolumeLvl: ComparableQuantity [m³] @@ -131,7 +134,7 @@ package models { - c: ComparableQuantity [kWh/(K*m³)] - pThermalMax: ComparableQuantity [kW] } - DomesticHotWaterStorageInput --|> ThermalStorageInput + DomesticHotWaterStorageInput --|> AbstractStorageInput } } } From 12ad54937023cd63f327ea4e3b70636d29f93041 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 14:13:50 +0100 Subject: [PATCH 297/310] introduce changes also to all other puml diagrams --- docs/uml/main/EntitySourceClassDiagram.puml | 8 ++++++-- docs/uml/main/OutputDatamodelConcept.puml | 10 ++++++++-- .../uml/main/input/DefaultInputDirectoryHierarchy.puml | 2 +- .../main/input/DefaultResultDirectoryHierarchy.puml | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/uml/main/EntitySourceClassDiagram.puml b/docs/uml/main/EntitySourceClassDiagram.puml index a9ae77130..d7c0de723 100644 --- a/docs/uml/main/EntitySourceClassDiagram.puml +++ b/docs/uml/main/EntitySourceClassDiagram.puml @@ -130,6 +130,7 @@ class ResultEntitySource { + Set getEvResults() throws SourceException + Set getHpResults() throws SourceException + Set getCylindricalStorageResult() throws SourceException + + Set getDomesticHotWaterStorageResult() throws SourceException + Set getThermalHouseResults() throws SourceException + Set getEmResults() throws SourceException + Set getCongestionResults() throws SourceException @@ -179,6 +180,7 @@ class ThermalSource { - TypeSource typeSource - ThermalBusInputFactory thermalBusInputFactory - CylindricalStorageInputFactory cylindricalStorageInputFactory + - DomesticHotWaterStorageInputFactory domesticHotWaterStorageInputFactory - ThermalHouseInputFactory thermalHouseInputFactory + ThermalSource(TypeSource, DataSource) + Map getThermalBuses() throws SourceException @@ -187,8 +189,10 @@ class ThermalSource { + Map getThermalStorages(Map, Map) throws SourceException + Map getThermalHouses() throws SourceException + Map getThermalHouses(Map, Map) throws SourceException - + Set getCylindricStorages() throws SourceException - + Set getCylindricStorages(Map, Map) throws SourceException + + Set getCylindricalStorages() throws SourceException + + Set getCylindricalStorages(Map, Map) throws SourceException + + Set getDomesticHotWaterStorages() throws SourceException + + Set getDomesticHotWaterStorages(Map, Map) throws SourceException } abstract class TimeSeriesMappingSource { diff --git a/docs/uml/main/OutputDatamodelConcept.puml b/docs/uml/main/OutputDatamodelConcept.puml index de0b7c745..5af946551 100644 --- a/docs/uml/main/OutputDatamodelConcept.puml +++ b/docs/uml/main/OutputDatamodelConcept.puml @@ -130,10 +130,16 @@ package models { } ThermalUnitResult <|-- ThermalStorageResult - class CylindricalStorageResult { + Abstract class AbstractThermalStorageResult { - fillLevel: ComparableQuantity [%] } - ThermalStorageResult <|-- CylindricalStorageResult + ThermalStorageResult <|-- AbstractThermalStorageResult + + class CylindricalStorageResult {} + AbstractThermalStorageResult <|-- CylindricalStorageResult + + class DomesticHotWaterStorageResult {} + AbstractThermalStorageResult <|-- DomesticHotWaterStorageResult } } } diff --git a/docs/uml/main/input/DefaultInputDirectoryHierarchy.puml b/docs/uml/main/input/DefaultInputDirectoryHierarchy.puml index f9bb14f35..f9b8a369b 100644 --- a/docs/uml/main/input/DefaultInputDirectoryHierarchy.puml +++ b/docs/uml/main/input/DefaultInputDirectoryHierarchy.puml @@ -9,7 +9,7 @@ package (.tar.gz) { label "line_input.csv\n//measurement_unit_input.csv//\nnode_input.csv\n//switch_input.csv//\ntransformer_2_w_input.csv\n//transformer_3_w_input.csv//" } package "//thermal//" as th { - label "//cylindrical_storage_input.csv//\n//thermal_bus_input.csv//\n//thermal_house_input.csv//" + label "//cylindrical_storage_input.csv//\n//domestic_hot_water_storage_input.csv//\n//thermal_bus_input.csv//\n//thermal_house_input.csv//" } package participants { label "//bm_input.csv//\n//chp_input.csv//\n//ev_input.csv//\n//evcs_input.csv//\n//fixed_feed_in_input.csv//\n//hp_input.csv//\n//load_input.csv//\n//pv_input.csv//\n//storage_input.csv//\n//wec_input.csv//" diff --git a/docs/uml/main/input/DefaultResultDirectoryHierarchy.puml b/docs/uml/main/input/DefaultResultDirectoryHierarchy.puml index ee194e413..08261fb74 100644 --- a/docs/uml/main/input/DefaultResultDirectoryHierarchy.puml +++ b/docs/uml/main/input/DefaultResultDirectoryHierarchy.puml @@ -6,7 +6,7 @@ package (.tar.gz) { label "//line_result.csv//\n//node_result.csv//\n//switch_result.csv//\n//transformer_2_w_result.csv//\n//transformer_3_w_result.csv//" } package "//thermal//" { - label "//cylindrical_storage_result.csv//\n//thermal_bus_result.csv//\n//thermal_house_result.csv//" + label "//cylindrical_storage_result.csv//\n//domestic_hot_water_storage_result.csv//\n//thermal_bus_result.csv//\n//thermal_house_result.csv//" } package "//participants//" { label "//bm_result.csv//\n//chp_result.csv//\n//ev_result.csv//\n//evcs_result.csv//\n//fixed_feed_in_result.csv//\n//hp_result.csv//\n//load_result.csv//\n//pv_result.csv//\n//storage_result.csv//\n//wec_result.csv//" From 64b7da7dce1f47b50d70b0ee57dc5ef7d1fe9b67 Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 14:38:10 +0100 Subject: [PATCH 298/310] use operators and thermalBuses for getThermalStorages --- src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index ea714ab19..f8d73a0a7 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -152,7 +152,9 @@ public Map getThermalStorages() throws SourceExceptio public Map getThermalStorages( Map operators, Map thermalBuses) throws SourceException { - return Stream.of(getCylindricalStorages(), getDomesticHotWaterStorages()) + return Stream.of( + getCylindricalStorages(operators, thermalBuses), + getDomesticHotWaterStorages(operators, thermalBuses)) .flatMap(Collection::stream) .collect(toMap()); } From d75926f51c80c545af4a233ecc9035841ed5860a Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 25 Feb 2025 14:59:24 +0100 Subject: [PATCH 299/310] Adapting `LoadProfileSource`s. --- .../edu/ie3/datamodel/io/source/LoadProfileSource.java | 4 ++-- .../datamodel/io/source/csv/CsvLoadProfileSource.java | 8 ++++---- .../datamodel/io/source/sql/SqlLoadProfileSource.java | 9 +++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index be767995e..60e30dd4e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -83,10 +83,10 @@ protected Try, FactoryException> createEntries( public abstract P getLoadProfile(); /** Returns the maximal power value of the time series */ - public abstract ComparableQuantity getMaxPower(); + public abstract Optional> getMaxPower(); /** Returns the load profile energy scaling for this load profile time series. */ - public abstract ComparableQuantity getLoadProfileEnergyScaling(); + public abstract Optional> getLoadProfileEnergyScaling(); /** * Method to read in the build-in {@link BdewStandardLoadProfile}s. diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index b96e8ee21..f3b271617 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -83,13 +83,13 @@ public P getLoadProfile() { } @Override - public ComparableQuantity getMaxPower() { - return loadProfileTimeSeries.maxPower; + public Optional> getMaxPower() { + return loadProfileTimeSeries.maxPower(); } @Override - public ComparableQuantity getLoadProfileEnergyScaling() { - return loadProfileTimeSeries.profileEnergyScaling; + public Optional> getLoadProfileEnergyScaling() { + return loadProfileTimeSeries.loadProfileScaling(); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 193272e33..28544f37e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -126,13 +126,14 @@ public P getLoadProfile() { } @Override - public ComparableQuantity getMaxPower() { - return entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {})); + public Optional> getMaxPower() { + return Optional.ofNullable( + entryFactory.calculateMaxPower(loadProfile, getEntries(queryFull, ps -> {}))); } @Override - public ComparableQuantity getLoadProfileEnergyScaling() { - return entryFactory.getLoadProfileEnergyScaling(loadProfile); + public Optional> getLoadProfileEnergyScaling() { + return Optional.ofNullable(entryFactory.getLoadProfileEnergyScaling(loadProfile)); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- From e139b01d902f0b391a8902c21fc08f222ad58dc9 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 25 Feb 2025 16:06:37 +0100 Subject: [PATCH 300/310] Adding validation for bdew load profile sources. --- CHANGELOG.md | 1 + src/main/resources/load/lpts_g5.csv | 2 +- .../ThermalValidationUtilsTest.groovy | 28 -- .../resources/load/BdewLoadProfileTest.groovy | 384 ++++++++++++++++++ 4 files changed, 386 insertions(+), 29 deletions(-) create mode 100644 src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy diff --git a/CHANGELOG.md b/CHANGELOG.md index 642923271..567f7d047 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) - Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) +- Validation for bdew load profile sources [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/src/main/resources/load/lpts_g5.csv b/src/main/resources/load/lpts_g5.csv index 5cdfc79bf..49b9d5cde 100644 --- a/src/main/resources/load/lpts_g5.csv +++ b/src/main/resources/load/lpts_g5.csv @@ -38,7 +38,7 @@ SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour 146.4,55.4,208.1,151.7,51.6,211.3,159.5,54.6,230.0,36 137.7,55.7,205.8,145.9,53.5,210.5,155.5,55.4,228.1,37 131.7,56.7,202.6,142.2,55.8,209.1,153.4,56.7,225.4,38 -128.0,58.4,198.5,13.09,58.4,206.5,151.1,58.4,221.7,39 +128.0,58.4,198.5,139.0,58.4,206.5,151.1,58.4,221.7,39 126.0,61.2,193.4,135.1,61.1,202.2,147.0,60.4,216.4,40 125.3,64.5,187.8,130.6,63.7,196.5,141.5,62.5,210.2,41 125.2,68.1,182.3,126.0,66.2,190.3,135.6,64.6,203.7,42 diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index 76ccec889..7f30e8812 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -167,32 +167,4 @@ class ThermalValidationUtilsTest extends Specification { thermalHouse || expectedSize || expectedException new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } - - def "ThermalValidationUtils.check() works for complete ThermalGrid as well"() { - when: - def thermalBus = ThermalUnitInputTestData.thermalBus - def cylindricalStorageInput = [ - ThermalUnitInputTestData.cylindricalStorageInput - ] - def domesticHotWaterStorageInput = [ - ThermalUnitInputTestData.domesticHotWaterStorageInput - ] - - - ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) - - - List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() - - then: - exceptions.size() == expectedSize - Exception ex = exceptions.get(0).exception.get() - ex.class == expectedException.class - ex.message == expectedException.message - - - where: - thermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "house", 2) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) - } } diff --git a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy new file mode 100644 index 000000000..13c5607c1 --- /dev/null +++ b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy @@ -0,0 +1,384 @@ +/* + * © 2025. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.resources.load + +import edu.ie3.datamodel.io.factory.timeseries.BdewLoadProfileFactory +import edu.ie3.datamodel.io.factory.timeseries.LoadProfileData +import edu.ie3.datamodel.io.naming.FileNamingStrategy +import edu.ie3.datamodel.io.source.csv.CsvDataSource +import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile +import edu.ie3.datamodel.models.value.load.BdewLoadValues +import spock.lang.Shared +import spock.lang.Specification + +import java.nio.file.Path +import java.util.function.Function + +class BdewLoadProfileTest extends Specification { + + @Shared + private CsvDataSource source + + @Shared + private BdewLoadProfileFactory factory = new BdewLoadProfileFactory() + + def setupSpec() { + Path resourcePath = Path.of(".", "src", "main", "resources", "load") + source = new CsvDataSource(",", resourcePath, new FileNamingStrategy()) + } + + def "The bdew profile g0 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G0) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9994d + suSu == 6187.2d + suWd == 11784.4d + + trSa == 10434.2d + trSu == 6293.7d + trWd == 12239.9d + + wiSa == 10693.2d + wiSu == 6227.4d + wiWd == 12827.2d + } + + def "The bdew profile g1 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G1) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 2613.7d + suSu == 2127.5d + suWd == 12499.4d + + trSa == 3048.3d + trSu == 1955.6d + trWd == 14523.8d + + wiSa == 3294.2d + wiSu == 2808.7d + wiWd == 17431.7d + } + + def "The bdew profile g2 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G2) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9221.1d + suSu == 7924.7d + suWd == 9954.1d + + trSa == 10706.3d + trSu == 8897.2d + trWd == 11272.5d + + wiSa == 12456d + wiSu == 10596 + wiWd == 12837.4d + } + + def "The bdew profile g3 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G3) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 10834d + suSu == 9656 + suWd == 11544.3d + + trSa == 10544.1d + trSu == 9160.9d + trWd == 10978.1d + + wiSa == 10645.9d + wiSu == 9216.2d + wiWd == 11679.7d + } + + def "The bdew profile g4 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G4) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 10513d + suSu == 6640.3d + suWd == 11968.2d + + trSa == 10120.5d + trSu == 6166.7d + trWd == 11947d + + wiSa == 10733.4d + wiSu == 6202.3d + wiWd == 12749.4d + } + + def "The bdew profile g5 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G5) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 12107.1d + suSu == 5401d + suWd == 12042.8d + + trSa == 11861.1d + trSu == 5111d + trWd == 11969.3d + + wiSa == 12337.1d + wiSu == 5165.2d + wiWd == 12477.4d + } + + def "The bdew profile g6 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.G6) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 11793.6d + suSu == 12017.4d + suWd == 9053.4d + + trSa == 12718.5d + trSu == 13591.8d + trWd == 10111.4d + + wiSa == 13647.2d + wiSu == 13741.2d + wiWd == 10748.5d + } + + def "The bdew profile h0 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.H0) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 12132d + suSu == 11416d + suWd == 11255.9d + + trSa == 12054.9d + trSu == 11079.4d + trWd == 10783.3d + + wiSa == 11546d + wiSu == 10742d + wiWd == 10223.7d + } + + def "The bdew profile L0 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.L0) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9536.1d + suSu == 10243d + suWd == 9985.2d + + trSa == 10662.1d + trSu == 11012.7d + trWd == 10929.7d + + wiSa == 11452.7d + wiSu == 12006.8d + wiWd == 11934.3d + } + + def "The bdew profile L1 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.L1) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9320.5d + suSu == 10011.8d + suWd == 9963.3d + + trSa == 10484.5d + trSu == 10913.8d + trWd == 10874.8d + + wiSa == 11717.6d + wiSu == 12241.9d + wiWd == 12010d + } + + def "The bdew profile L2 should be correct"() { + given: + def data = read(BdewStandardLoadProfile.L2) + + when: + def suSa = sumValues(data, v -> v.suSa) + def suSu = sumValues(data, v -> v.suSu) + def suWd = sumValues(data, v -> v.suWd) + + def trSa = sumValues(data, v -> v.trSa) + def trSu = sumValues(data, v -> v.trSu) + def trWd = sumValues(data, v -> v.trWd) + + def wiSa = sumValues(data, v -> v.wiSa) + def wiSu = sumValues(data, v -> v.wiSu) + def wiWd = sumValues(data, v -> v.wiWd) + + then: + suSa == 9645.7d + suSu == 10408.9d + suWd == 10090.1d + + trSa == 10652.4d + trSu == 10980.3d + trWd == 10927.8d + + wiSa == 11326.9d + wiSu == 11908.2d + wiWd == 11847.5d + } + + + // helper methods + + private List read(BdewStandardLoadProfile profile) { + source.getSourceData(Path.of("lpts_"+profile.key)).map { it -> factory.buildModel(new LoadProfileData<>(it, BdewLoadValues)).value }.toList() + } + + private static double sumValues(List values, Function extractor) { + values.stream().map { extractor.apply(it) }.mapToDouble { it.doubleValue() }.sum() + } +} From f7c428c94e6ff9f13dde673c3682ee4a24c0646c Mon Sep 17 00:00:00 2001 From: danielfeismann Date: Tue, 25 Feb 2025 18:09:50 +0100 Subject: [PATCH 301/310] Remove double test in ThermalValidationUtils --- CHANGELOG.md | 1 + .../ThermalValidationUtilsTest.groovy | 28 ------------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 642923271..7f16f37a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) - Fixed example in ReadTheDocs [#1244](https://github.com/ie3-institute/PowerSystemDataModel/issues/1244) +- Remove double test in ThermalValidationUtils [#1260](https://github.com/ie3-institute/PowerSystemDataModel/issues/1260)] ### Changed - Storage minimum level parameter removed from cylindrical thermal storage [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1123) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy index 76ccec889..7f30e8812 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/ThermalValidationUtilsTest.groovy @@ -167,32 +167,4 @@ class ThermalValidationUtilsTest extends Specification { thermalHouse || expectedSize || expectedException new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, HOUSING_TYPE, NUMBER_INHABITANTS) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) } - - def "ThermalValidationUtils.check() works for complete ThermalGrid as well"() { - when: - def thermalBus = ThermalUnitInputTestData.thermalBus - def cylindricalStorageInput = [ - ThermalUnitInputTestData.cylindricalStorageInput - ] - def domesticHotWaterStorageInput = [ - ThermalUnitInputTestData.domesticHotWaterStorageInput - ] - - - ThermalGrid thermalGrid = new ThermalGrid(thermalBus, [thermalHouse], cylindricalStorageInput, domesticHotWaterStorageInput) - - - List> exceptions = ThermalValidationUtils.check(thermalGrid).stream().filter { it -> it.failure }.toList() - - then: - exceptions.size() == expectedSize - Exception ex = exceptions.get(0).exception.get() - ex.class == expectedException.class - ex.message == expectedException.message - - - where: - thermalHouse || expectedSize || expectedException - new ThermalHouseInput(thermalUnitUuid, id, operator, operationTime, SystemParticipantTestData.thermalBus, thermalConductance, ethCapa, Quantities.getQuantity(0, StandardUnits.TEMPERATURE), UPPER_TEMPERATURE_LIMIT, LOWER_TEMPERATURE_LIMIT, "house", 2) || 1 || new InvalidEntityException("Target temperature must be higher than lower temperature limit and lower than upper temperature limit", thermalHouse) - } } From 8e6576254decf62cc68eda208b8ae5bc83fc417d Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 09:28:04 +0100 Subject: [PATCH 302/310] Improving load profile value validation. --- CHANGELOG.md | 2 +- .../resources/load/BdewLoadProfileTest.groovy | 434 +++++++++--------- 2 files changed, 215 insertions(+), 221 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7e16c3a6..fc76df9e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Attribute `pThermalRated` for `ThermalStorage`s [#679](https://github.com/ie3-institute/PowerSystemDataModel/issues/679) - Attributes `housingType` and `numberInhabitants` for `ThermalHouse`s [#1253](https://github.com/ie3-institute/PowerSystemDataModel/issues/1253) - Added domestic hot water storage model [#1257](https://github.com/ie3-institute/PowerSystemDataModel/issues/1257) -- Validation for bdew load profile sources [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) +- Validation for BDEW load profile values [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) diff --git a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy index 13c5607c1..46bd5cdae 100644 --- a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy @@ -11,10 +11,12 @@ import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.value.load.BdewLoadValues +import edu.ie3.util.TimeUtil import spock.lang.Shared import spock.lang.Specification import java.nio.file.Path +import java.time.ZonedDateTime import java.util.function.Function class BdewLoadProfileTest extends Specification { @@ -30,345 +32,337 @@ class BdewLoadProfileTest extends Specification { source = new CsvDataSource(",", resourcePath, new FileNamingStrategy()) } - def "The bdew profile g0 should be correct"() { + def "The BDEW profile G0 should be correct"() { given: def data = read(BdewStandardLoadProfile.G0) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9994d - suSu == 6187.2d - suWd == 11784.4d + results["suSa"] == 9994.0 + results["suSu"] == 6187.2 + results["suWd"] == 11784.4 - trSa == 10434.2d - trSu == 6293.7d - trWd == 12239.9d + results["trSa"] == 10434.2 + results["trSu"] == 6293.7 + results["trWd"] == 12239.9 - wiSa == 10693.2d - wiSu == 6227.4d - wiWd == 12827.2d + results["wiSa"] == 10693.2 + results["wiSu"] == 6227.4 + results["wiWd"] == 12827.2 } - def "The bdew profile g1 should be correct"() { + def "The BDEW profile G1 should be correct"() { given: def data = read(BdewStandardLoadProfile.G1) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 2613.7d - suSu == 2127.5d - suWd == 12499.4d + results["suSa"] == 2613.7 + results["suSu"] == 2127.5 + results["suWd"] == 12499.4 - trSa == 3048.3d - trSu == 1955.6d - trWd == 14523.8d + results["trSa"] == 3048.3 + results["trSu"] == 1955.6 + results["trWd"] == 14523.8 - wiSa == 3294.2d - wiSu == 2808.7d - wiWd == 17431.7d + results["wiSa"] == 3294.2 + results["wiSu"] == 2808.7 + results["wiWd"] == 17431.7 } - def "The bdew profile g2 should be correct"() { + def "The BDEW profile G2 should be correct"() { given: def data = read(BdewStandardLoadProfile.G2) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9221.1d - suSu == 7924.7d - suWd == 9954.1d + results["suSa"] == 9221.1 + results["suSu"] == 7924.7 + results["suWd"] == 9954.1 - trSa == 10706.3d - trSu == 8897.2d - trWd == 11272.5d + results["trSa"] == 10706.3 + results["trSu"] == 8897.2 + results["trWd"] == 11272.5 - wiSa == 12456d - wiSu == 10596 - wiWd == 12837.4d + results["wiSa"] == 12456 + results["wiSu"] == 10596.0 + results["wiWd"] == 12837.4 } - def "The bdew profile g3 should be correct"() { + def "The BDEW profile G3 should be correct"() { given: def data = read(BdewStandardLoadProfile.G3) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 10834d - suSu == 9656 - suWd == 11544.3d + results["suSa"] == 10834.0 + results["suSu"] == 9656.0 + results["suWd"] == 11544.3 - trSa == 10544.1d - trSu == 9160.9d - trWd == 10978.1d + results["trSa"] == 10544.1 + results["trSu"] == 9160.9 + results["trWd"] == 10978.1 - wiSa == 10645.9d - wiSu == 9216.2d - wiWd == 11679.7d + results["wiSa"] == 10645.9 + results["wiSu"] == 9216.2 + results["wiWd"] == 11679.7 } - def "The bdew profile g4 should be correct"() { + def "The BDEW profile G4 should be correct"() { given: def data = read(BdewStandardLoadProfile.G4) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 10513d - suSu == 6640.3d - suWd == 11968.2d + results["suSa"] == 10513.0 + results["suSu"] == 6640.3 + results["suWd"] == 11968.2 - trSa == 10120.5d - trSu == 6166.7d - trWd == 11947d + results["trSa"] == 10120.5 + results["trSu"] == 6166.7 + results["trWd"] == 11947 - wiSa == 10733.4d - wiSu == 6202.3d - wiWd == 12749.4d + results["wiSa"] == 10733.4 + results["wiSu"] == 6202.3 + results["wiWd"] == 12749.4 } - def "The bdew profile g5 should be correct"() { + def "The BDEW profile G5 should be correct"() { given: def data = read(BdewStandardLoadProfile.G5) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 12107.1d - suSu == 5401d - suWd == 12042.8d + results["suSa"] == 12107.1 + results["suSu"] == 5401.0 + results["suWd"] == 12042.8 - trSa == 11861.1d - trSu == 5111d - trWd == 11969.3d + results["trSa"] == 11861.1 + results["trSu"] == 5111.0 + results["trWd"] == 11969.3 - wiSa == 12337.1d - wiSu == 5165.2d - wiWd == 12477.4d + results["wiSa"] == 12337.1 + results["wiSu"] == 5165.2 + results["wiWd"] == 12477.4 } - def "The bdew profile g6 should be correct"() { + def "The BDEW profile G6 should be correct"() { given: def data = read(BdewStandardLoadProfile.G6) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 11793.6d - suSu == 12017.4d - suWd == 9053.4d + results["suSa"] == 11793.6 + results["suSu"] == 12017.4 + results["suWd"] == 9053.4 - trSa == 12718.5d - trSu == 13591.8d - trWd == 10111.4d + results["trSa"] == 12718.5 + results["trSu"] == 13591.8 + results["trWd"] == 10111.4 - wiSa == 13647.2d - wiSu == 13741.2d - wiWd == 10748.5d + results["wiSa"] == 13647.2 + results["wiSu"] == 13741.2 + results["wiWd"] == 10748.5 } - def "The bdew profile h0 should be correct"() { + def "The BDEW profile H0 should be correct"() { given: def data = read(BdewStandardLoadProfile.H0) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 12132d - suSu == 11416d - suWd == 11255.9d + results["suSa"] == 12132.0 + results["suSu"] == 11416.0 + results["suWd"] == 11255.9 - trSa == 12054.9d - trSu == 11079.4d - trWd == 10783.3d + results["trSa"] == 12054.9 + results["trSu"] == 11079.4 + results["trWd"] == 10783.3 - wiSa == 11546d - wiSu == 10742d - wiWd == 10223.7d + results["wiSa"] == 11546.0 + results["wiSu"] == 10742.0 + results["wiWd"] == 10223.7 } - def "The bdew profile L0 should be correct"() { + def "The BDEW dynamization function for the profile H= should work as expected"() { + when: + def dynamizedValue = BdewLoadValues.dynamization(value, dayOfTheYear) + + then: + dynamizedValue == expectedValue + + where: + dayOfTheYear | value | expectedValue + 153 | 89.8d | 76.3d // suSa, time: 00:15 + 262 | 47.9d | 42.1d // trWd, time: 01:45 + 343 | 146.8d | 174.5d // wiSu, time: 18:15 + } + + def "The BDEW profile L0 should be correct"() { given: def data = read(BdewStandardLoadProfile.L0) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9536.1d - suSu == 10243d - suWd == 9985.2d + results["suSa"] == 9536.1 + results["suSu"] == 10243.0 + results["suWd"] == 9985.2 - trSa == 10662.1d - trSu == 11012.7d - trWd == 10929.7d + results["trSa"] == 10662.1 + results["trSu"] == 11012.7 + results["trWd"] == 10929.7 - wiSa == 11452.7d - wiSu == 12006.8d - wiWd == 11934.3d + results["wiSa"] == 11452.7 + results["wiSu"] == 12006.8 + results["wiWd"] == 11934.3 } - def "The bdew profile L1 should be correct"() { + def "The BDEW profile L1 should be correct"() { given: def data = read(BdewStandardLoadProfile.L1) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) - - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9320.5d - suSu == 10011.8d - suWd == 9963.3d + results["suSa"] == 9320.5 + results["suSu"] == 10011.8 + results["suWd"] == 9963.3 - trSa == 10484.5d - trSu == 10913.8d - trWd == 10874.8d + results["trSa"] == 10484.5 + results["trSu"] == 10913.8 + results["trWd"] == 10874.8 - wiSa == 11717.6d - wiSu == 12241.9d - wiWd == 12010d + results["wiSa"] == 11717.6 + results["wiSu"] == 12241.9 + results["wiWd"] == 12010.0 } - def "The bdew profile L2 should be correct"() { + def "The BDEW profile L2 should be correct"() { given: def data = read(BdewStandardLoadProfile.L2) when: - def suSa = sumValues(data, v -> v.suSa) - def suSu = sumValues(data, v -> v.suSu) - def suWd = sumValues(data, v -> v.suWd) - - def trSa = sumValues(data, v -> v.trSa) - def trSu = sumValues(data, v -> v.trSu) - def trWd = sumValues(data, v -> v.trWd) + def keys = ['su', 'tr', 'wi'] + def results = [:] - def wiSa = sumValues(data, v -> v.wiSa) - def wiSu = sumValues(data, v -> v.wiSu) - def wiWd = sumValues(data, v -> v.wiWd) + keys.each { + key -> + results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") + results["${key}Su"] = sumValues(data, v -> v."${key}Su") + results["${key}Wd"] = sumValues(data, v -> v."${key}Wd") + } then: - suSa == 9645.7d - suSu == 10408.9d - suWd == 10090.1d + results["suSa"] == 9645.7 + results["suSu"] == 10408.9 + results["suWd"] == 10090.1 - trSa == 10652.4d - trSu == 10980.3d - trWd == 10927.8d + results["trSa"] == 10652.4 + results["trSu"] == 10980.3 + results["trWd"] == 10927.8 - wiSa == 11326.9d - wiSu == 11908.2d - wiWd == 11847.5d + results["wiSa"] == 11326.9 + results["wiSu"] == 11908.2 + results["wiWd"] == 11847.5 } From ec5742e2c3848bbff92c60a54be912494815f218 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 09:42:57 +0100 Subject: [PATCH 303/310] Enhancing documentation. --- docs/readthedocs/io/csvfiles.md | 26 +++++++++++++++++-- .../models/input/additionaldata/timeseries.md | 5 ++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 3e96eb59d..7a29737d3 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -94,11 +94,13 @@ Csv id coordinate sources can have two different ways to represent their coordin * - Model - File Name * - individual time series - - *prefix_* its *_columnScheme_UUID_suffix* + - *prefix_* its *_columnScheme_UUID *_suffix* * - load profile input - - *prefix_* rts *_profileKey_UUID_suffix* + - *prefix_* lpts *_profileKey *_suffix* ``` +#### Individual Time Series + Let's spend a few more words on the individual time series: Those files are meant to carry different types of content - one might give information about wholesale market prices, the other is a record of power values provided by a real system. @@ -154,6 +156,26 @@ The following keys are supported until now: ``` + +##### Load Profile Time Series + +The following profiles are supported until now: +```{list-table} + :widths: auto + :class: wrapping + :header-rows: 1 + + * - Key + - Information and supported head line. + * - e.g.: H0 + - + Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour`` + * - random + - + Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour`` + +``` + ### Results ```{list-table} diff --git a/docs/readthedocs/models/input/additionaldata/timeseries.md b/docs/readthedocs/models/input/additionaldata/timeseries.md index 991568b4b..eb24eec12 100644 --- a/docs/readthedocs/models/input/additionaldata/timeseries.md +++ b/docs/readthedocs/models/input/additionaldata/timeseries.md @@ -55,4 +55,9 @@ The following different values are available: * - `WeatherValue` - Combination of irradiance, temperature and wind information + * - `BdewLoadValues` + - Values for combination of seasons and day types + + * - `RandomLoadValues` + - Parameters for a probability density function to draw random power consumptions ``` From af93e82d60551e402159fd36e30af65053b445c5 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 10:20:23 +0100 Subject: [PATCH 304/310] Refactoring `BdewLoadProfileTest`. --- .../resources/load/BdewLoadProfileTest.groovy | 43 +++---------------- 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy index 46bd5cdae..fdbffc4d3 100644 --- a/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy +++ b/src/test/groovy/edu/ie3/resources/load/BdewLoadProfileTest.groovy @@ -11,12 +11,10 @@ import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.profile.BdewStandardLoadProfile import edu.ie3.datamodel.models.value.load.BdewLoadValues -import edu.ie3.util.TimeUtil import spock.lang.Shared import spock.lang.Specification import java.nio.file.Path -import java.time.ZonedDateTime import java.util.function.Function class BdewLoadProfileTest extends Specification { @@ -27,6 +25,12 @@ class BdewLoadProfileTest extends Specification { @Shared private BdewLoadProfileFactory factory = new BdewLoadProfileFactory() + @Shared + private List keys = ['su', 'tr', 'wi'] + + @Shared + private Map results = [:] + def setupSpec() { Path resourcePath = Path.of(".", "src", "main", "resources", "load") source = new CsvDataSource(",", resourcePath, new FileNamingStrategy()) @@ -37,9 +41,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G0) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -66,9 +67,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G1) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -95,9 +93,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G2) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -124,9 +119,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G3) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -153,9 +145,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G4) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -182,9 +171,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G5) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -211,9 +197,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.G6) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -240,9 +223,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.H0) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -264,7 +244,7 @@ class BdewLoadProfileTest extends Specification { results["wiWd"] == 10223.7 } - def "The BDEW dynamization function for the profile H= should work as expected"() { + def "The BDEW dynamization function for the profile H0 should work as expected"() { when: def dynamizedValue = BdewLoadValues.dynamization(value, dayOfTheYear) @@ -283,9 +263,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.L0) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -312,9 +289,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.L1) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") @@ -341,9 +315,6 @@ class BdewLoadProfileTest extends Specification { def data = read(BdewStandardLoadProfile.L2) when: - def keys = ['su', 'tr', 'wi'] - def results = [:] - keys.each { key -> results["${key}Sa"] = sumValues(data, v -> v."${key}Sa") From d02ea9735c23d1b1663bee050a12da4849a2cf20 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 26 Feb 2025 10:46:11 +0100 Subject: [PATCH 305/310] Enhancing documentation. --- docs/readthedocs/io/csvfiles.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/readthedocs/io/csvfiles.md b/docs/readthedocs/io/csvfiles.md index 7a29737d3..67dadf6b3 100644 --- a/docs/readthedocs/io/csvfiles.md +++ b/docs/readthedocs/io/csvfiles.md @@ -94,9 +94,9 @@ Csv id coordinate sources can have two different ways to represent their coordin * - Model - File Name * - individual time series - - *prefix_* its *_columnScheme_UUID *_suffix* + - *prefix_* its *_columnScheme_UUID* *_suffix* * - load profile input - - *prefix_* lpts *_profileKey *_suffix* + - *prefix_* lpts *_profileKey* *_suffix* ``` #### Individual Time Series @@ -166,13 +166,14 @@ The following profiles are supported until now: :header-rows: 1 * - Key - - Information and supported head line. + - Information + - Supported head line. * - e.g.: H0 - - - Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour`` + - BDEW standard load profiles ([source](https://www.bdew.de/energie/standardlastprofile-strom/)) + - Permissible head line: ``SuSa,SuSu,SuWd,TrSa,TrSu,TrWd,WiSa,WiSu,WiWd,quarterHour`` * - random - - - Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour`` + - A random load proile based on: ``Kays - Agent-based simulation environment for improving the planning of distribution grids`` + - Permissible head line: ``kSa,kSu,kWd,mySa,mySu,myWd,sigmaSa,sigmaSu,sigmaWd,quarterHour`` ``` From 2f1799b3f30b07d381e47503a2312302de3a3062 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 09:25:06 +0000 Subject: [PATCH 306/310] Bump com.github.spotbugs from 6.1.5 to 6.1.6 (#1263) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4ec934847..4f24a0f7d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'signing' id 'pmd' // code check, working on source code id 'com.diffplug.spotless' version '7.0.2' //code format - id 'com.github.spotbugs' version '6.1.5' // code check, working on byte code + id 'com.github.spotbugs' version '6.1.6' // code check, working on byte code id 'de.undercouch.download' version '5.6.0' id 'kr.motd.sphinx' version '2.10.1' // documentation generation id 'jacoco' // java code coverage plugin From dfba4f14bd884dbc33fea92e38b40d0e311173a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 09:44:38 +0000 Subject: [PATCH 307/310] Bump org.junit.jupiter:junit-jupiter from 5.11.4 to 5.12.0 Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.11.4 to 5.12.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.11.4...r5.12.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 4f24a0f7d..977bc4c8d 100644 --- a/build.gradle +++ b/build.gradle @@ -74,7 +74,7 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.12.0' testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.17.1' // Mocks of classes From f32d427aaed3348c76eae8ba258fcfda10872a51 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Thu, 27 Feb 2025 11:53:45 +0100 Subject: [PATCH 308/310] Adding junit platform launcher --- build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 977bc4c8d..9a37144eb 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,8 @@ ext { javaVersion = JavaVersion.VERSION_17 groovyVersion = "4.0" groovyBinaryVersion = "4.0.25" + + junitVersion = '1.12.0' testcontainersVersion = '1.20.5' scriptsLocation = 'gradle' + File.separator + 'scripts' + File.separator //location of script plugins @@ -74,7 +76,8 @@ dependencies { // testing testImplementation "org.apache.groovy:groovy:$groovyBinaryVersion" - testImplementation 'org.junit.jupiter:junit-jupiter:5.12.0' + testImplementation "org.junit.platform:junit-platform-launcher:$junitVersion" + testImplementation "org.junit.jupiter:junit-jupiter:$junitVersion" testImplementation "org.spockframework:spock-core:2.3-groovy-$groovyVersion" testImplementation 'org.objenesis:objenesis:3.4' // Mock creation with constructor parameters testImplementation 'net.bytebuddy:byte-buddy:1.17.1' // Mocks of classes From 9a1b16e396dd0c525cbe504dbc6756c69dc00f46 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Thu, 27 Feb 2025 12:00:09 +0100 Subject: [PATCH 309/310] Updating gradle to v8.13 --- CHANGELOG.md | 3 +++ gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8f3b05fb..4a3dc2532 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Enhance `CsvDataSource` [#1246](https://github.com/ie3-institute/PowerSystemDataModel/issues/1246) - Updated `_joint_grid` csv files from simona [#750](https://github.com/ie3-institute/PowerSystemDataModel/issues/750) +### Updates +- Updated gradle to v8.13 [#1264](https://github.com/ie3-institute/PowerSystemDataModel/issues/1264) + ## [5.1.0] - 2024-06-24 ### Added diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 zcmY(qRX`kF)3u#IAjsf0xCD212@LM;?(PINyAue(f;$XO2=4Cg1P$=#e%|lo zKk1`B>Q#GH)wNd-&cJofz}3=WfYndTeo)CyX{fOHsQjGa<{e=jamMNwjdatD={CN3>GNchOE9OGPIqr)3v>RcKWR3Z zF-guIMjE2UF0Wqk1)21791y#}ciBI*bAenY*BMW_)AeSuM5}vz_~`+1i!Lo?XAEq{TlK5-efNFgHr6o zD>^vB&%3ZGEWMS>`?tu!@66|uiDvS5`?bF=gIq3rkK(j<_TybyoaDHg8;Y#`;>tXI z=tXo~e9{U!*hqTe#nZjW4z0mP8A9UUv1}C#R*@yu9G3k;`Me0-BA2&Aw6f`{Ozan2 z8c8Cs#dA-7V)ZwcGKH}jW!Ja&VaUc@mu5a@CObzNot?b{f+~+212lwF;!QKI16FDS zodx>XN$sk9;t;)maB^s6sr^L32EbMV(uvW%or=|0@U6cUkE`_!<=LHLlRGJx@gQI=B(nn z-GEjDE}*8>3U$n(t^(b^C$qSTI;}6q&ypp?-2rGpqg7b}pyT zOARu2x>0HB{&D(d3sp`+}ka+Pca5glh|c=M)Ujn_$ly^X6&u z%Q4Y*LtB_>i6(YR!?{Os-(^J`(70lZ&Hp1I^?t@~SFL1!m0x6j|NM!-JTDk)%Q^R< z@e?23FD&9_W{Bgtr&CG&*Oer3Z(Bu2EbV3T9FeQ|-vo5pwzwQ%g&=zFS7b{n6T2ZQ z*!H(=z<{D9@c`KmHO&DbUIzpg`+r5207}4D=_P$ONIc5lsFgn)UB-oUE#{r+|uHc^hzv_df zV`n8&qry%jXQ33}Bjqcim~BY1?KZ}x453Oh7G@fA(}+m(f$)TY%7n=MeLi{jJ7LMB zt(mE*vFnep?YpkT_&WPV9*f>uSi#n#@STJmV&SLZnlLsWYI@y+Bs=gzcqche=&cBH2WL)dkR!a95*Ri)JH_4c*- zl4pPLl^as5_y&6RDE@@7342DNyF&GLJez#eMJjI}#pZN{Y8io{l*D+|f_Y&RQPia@ zNDL;SBERA|B#cjlNC@VU{2csOvB8$HzU$01Q?y)KEfos>W46VMh>P~oQC8k=26-Ku)@C|n^zDP!hO}Y z_tF}0@*Ds!JMt>?4y|l3?`v#5*oV-=vL7}zehMON^=s1%q+n=^^Z{^mTs7}*->#YL z)x-~SWE{e?YCarwU$=cS>VzmUh?Q&7?#Xrcce+jeZ|%0!l|H_=D_`77hBfd4Zqk&! zq-Dnt_?5*$Wsw8zGd@?woEtfYZ2|9L8b>TO6>oMh%`B7iBb)-aCefM~q|S2Cc0t9T zlu-ZXmM0wd$!gd-dTtik{bqyx32%f;`XUvbUWWJmpHfk8^PQIEsByJm+@+-aj4J#D z4#Br3pO6z1eIC>X^yKk|PeVwX_4B+IYJyJyc3B`4 zPrM#raacGIzVOexcVB;fcsxS=s1e&V;Xe$tw&KQ`YaCkHTKe*Al#velxV{3wxx}`7@isG zp6{+s)CG%HF#JBAQ_jM%zCX5X;J%-*%&jVI?6KpYyzGbq7qf;&hFprh?E5Wyo=bZ) z8YNycvMNGp1836!-?nihm6jI`^C`EeGryoNZO1AFTQhzFJOA%Q{X(sMYlzABt!&f{ zoDENSuoJQIg5Q#@BUsNJX2h>jkdx4<+ipUymWKFr;w+s>$laIIkfP6nU}r+?J9bZg zUIxz>RX$kX=C4m(zh-Eg$BsJ4OL&_J38PbHW&7JmR27%efAkqqdvf)Am)VF$+U3WR z-E#I9H6^)zHLKCs7|Zs<7Bo9VCS3@CDQ;{UTczoEprCKL3ZZW!ffmZFkcWU-V|_M2 zUA9~8tE9<5`59W-UgUmDFp11YlORl3mS3*2#ZHjv{*-1#uMV_oVTy{PY(}AqZv#wF zJVks)%N6LaHF$$<6p8S8Lqn+5&t}DmLKiC~lE{jPZ39oj{wR&fe*LX-z0m}9ZnZ{U z>3-5Bh{KKN^n5i!M79Aw5eY=`6fG#aW1_ZG;fw7JM69qk^*(rmO{|Z6rXy?l=K=#_ zE-zd*P|(sskasO(cZ5L~_{Mz&Y@@@Q)5_8l<6vB$@226O+pDvkFaK8b>%2 zfMtgJ@+cN@w>3)(_uR;s8$sGONbYvoEZ3-)zZk4!`tNzd<0lwt{RAgplo*f@Z)uO` zzd`ljSqKfHJOLxya4_}T`k5Ok1Mpo#MSqf~&ia3uIy{zyuaF}pV6 z)@$ZG5LYh8Gge*LqM_|GiT1*J*uKes=Oku_gMj&;FS`*sfpM+ygN&yOla-^WtIU#$ zuw(_-?DS?6DY7IbON7J)p^IM?N>7x^3)(7wR4PZJu(teex%l>zKAUSNL@~{czc}bR z)I{XzXqZBU3a;7UQ~PvAx8g-3q-9AEd}1JrlfS8NdPc+!=HJ6Bs( zCG!0;e0z-22(Uzw>hkEmC&xj?{0p|kc zM}MMXCF%RLLa#5jG`+}{pDL3M&|%3BlwOi?dq!)KUdv5__zR>u^o|QkYiqr(m3HxF z6J*DyN#Jpooc$ok=b7{UAVM@nwGsr6kozSddwulf5g1{B=0#2)zv!zLXQup^BZ4sv*sEsn)+MA?t zEL)}3*R?4(J~CpeSJPM!oZ~8;8s_=@6o`IA%{aEA9!GELRvOuncE`s7sH91 zmF=+T!Q6%){?lJn3`5}oW31(^Of|$r%`~gT{eimT7R~*Mg@x+tWM3KE>=Q>nkMG$U za7r>Yz2LEaA|PsMafvJ(Y>Xzha?=>#B!sYfVob4k5Orb$INFdL@U0(J8Hj&kgWUlO zPm+R07E+oq^4f4#HvEPANGWLL_!uF{nkHYE&BCH%l1FL_r(Nj@M)*VOD5S42Gk-yT z^23oAMvpA57H(fkDGMx86Z}rtQhR^L!T2iS!788E z+^${W1V}J_NwdwdxpXAW8}#6o1(Uu|vhJvubFvQIH1bDl4J4iDJ+181KuDuHwvM?` z%1@Tnq+7>p{O&p=@QT}4wT;HCb@i)&7int<0#bj8j0sfN3s6|a(l7Bj#7$hxX@~iP z1HF8RFH}irky&eCN4T94VyKqGywEGY{Gt0Xl-`|dOU&{Q;Ao;sL>C6N zXx1y^RZSaL-pG|JN;j9ADjo^XR}gce#seM4QB1?S`L*aB&QlbBIRegMnTkTCks7JU z<0(b+^Q?HN1&$M1l&I@>HMS;!&bb()a}hhJzsmB?I`poqTrSoO>m_JE5U4=?o;OV6 zBZjt;*%1P>%2{UL=;a4(aI>PRk|mr&F^=v6Fr&xMj8fRCXE5Z2qdre&;$_RNid5!S zm^XiLK25G6_j4dWkFqjtU7#s;b8h?BYFxV?OE?c~&ME`n`$ix_`mb^AWr+{M9{^^Rl;~KREplwy2q;&xe zUR0SjHzKVYzuqQ84w$NKVPGVHL_4I)Uw<$uL2-Ml#+5r2X{LLqc*p13{;w#E*Kwb*1D|v?e;(<>vl@VjnFB^^Y;;b3 z=R@(uRj6D}-h6CCOxAdqn~_SG=bN%^9(Ac?zfRkO5x2VM0+@_qk?MDXvf=@q_* z3IM@)er6-OXyE1Z4sU3{8$Y$>8NcnU-nkyWD&2ZaqX1JF_JYL8y}>@V8A5%lX#U3E zet5PJM`z79q9u5v(OE~{by|Jzlw2<0h`hKpOefhw=fgLTY9M8h+?37k@TWpzAb2Fc zQMf^aVf!yXlK?@5d-re}!fuAWu0t57ZKSSacwRGJ$0uC}ZgxCTw>cjRk*xCt%w&hh zoeiIgdz__&u~8s|_TZsGvJ7sjvBW<(C@}Y%#l_ID2&C`0;Eg2Z+pk;IK}4T@W6X5H z`s?ayU-iF+aNr5--T-^~K~p;}D(*GWOAYDV9JEw!w8ZYzS3;W6*_`#aZw&9J ziXhBKU3~zd$kKzCAP-=t&cFDeQR*_e*(excIUxKuD@;-twSlP6>wWQU)$|H3Cy+`= z-#7OW!ZlYzZxkdQpfqVDFU3V2B_-eJS)Fi{fLtRz!K{~7TR~XilNCu=Z;{GIf9KYz zf3h=Jo+1#_s>z$lc~e)l93h&RqW1VHYN;Yjwg#Qi0yzjN^M4cuL>Ew`_-_wRhi*!f zLK6vTpgo^Bz?8AsU%#n}^EGigkG3FXen3M;hm#C38P@Zs4{!QZPAU=m7ZV&xKI_HWNt90Ef zxClm)ZY?S|n**2cNYy-xBlLAVZ=~+!|7y`(fh+M$#4zl&T^gV8ZaG(RBD!`3?9xcK zp2+aD(T%QIgrLx5au&TjG1AazI;`8m{K7^!@m>uGCSR;Ut{&?t%3AsF{>0Cm(Kf)2 z?4?|J+!BUg*P~C{?mwPQ#)gDMmro20YVNsVx5oWQMkzQ? zsQ%Y>%7_wkJqnSMuZjB9lBM(o zWut|B7w48cn}4buUBbdPBW_J@H7g=szrKEpb|aE>!4rLm+sO9K%iI75y~2HkUo^iw zJ3se$8$|W>3}?JU@3h@M^HEFNmvCp|+$-0M?RQ8SMoZ@38%!tz8f8-Ptb@106heiJ z^Bx!`0=Im z1!NUhO=9ICM*+||b3a7w*Y#5*Q}K^ar+oMMtekF0JnO>hzHqZKH0&PZ^^M(j;vwf_ z@^|VMBpcw8;4E-9J{(u7sHSyZpQbS&N{VQ%ZCh{c1UA5;?R} z+52*X_tkDQ(s~#-6`z4|Y}3N#a&dgP4S_^tsV=oZr4A1 zaSoPN1czE(UIBrC_r$0HM?RyBGe#lTBL4~JW#A`P^#0wuK)C-2$B6TvMi@@%K@JAT_IB^T7Zfqc8?{wHcSVG_?{(wUG%zhCm=%qP~EqeqKI$9UivF zv+5IUOs|%@ypo6b+i=xsZ=^G1yeWe)z6IX-EC`F=(|_GCNbHbNp(CZ*lpSu5n`FRA zhnrc4w+Vh?r>her@Ba_jv0Omp#-H7avZb=j_A~B%V0&FNi#!S8cwn0(Gg-Gi_LMI{ zCg=g@m{W@u?GQ|yp^yENd;M=W2s-k7Gw2Z(tsD5fTGF{iZ%Ccgjy6O!AB4x z%&=6jB7^}pyftW2YQpOY1w@%wZy%}-l0qJlOSKZXnN2wo3|hujU+-U~blRF!^;Tan z0w;Srh0|Q~6*tXf!5-rCD)OYE(%S|^WTpa1KHtpHZ{!;KdcM^#g8Z^+LkbiBHt85m z;2xv#83lWB(kplfgqv@ZNDcHizwi4-8+WHA$U-HBNqsZ`hKcUI3zV3d1ngJP-AMRET*A{> zb2A>Fk|L|WYV;Eu4>{a6ESi2r3aZL7x}eRc?cf|~bP)6b7%BnsR{Sa>K^0obn?yiJ zCVvaZ&;d_6WEk${F1SN0{_`(#TuOOH1as&#&xN~+JDzX(D-WU_nLEI}T_VaeLA=bc zl_UZS$nu#C1yH}YV>N2^9^zye{rDrn(rS99>Fh&jtNY7PP15q%g=RGnxACdCov47= zwf^9zfJaL{y`R#~tvVL#*<`=`Qe zj_@Me$6sIK=LMFbBrJps7vdaf_HeX?eC+P^{AgSvbEn?n<}NDWiQGQG4^ZOc|GskK z$Ve2_n8gQ-KZ=s(f`_X!+vM5)4+QmOP()2Fe#IL2toZBf+)8gTVgDSTN1CkP<}!j7 z0SEl>PBg{MnPHkj4wj$mZ?m5x!1ePVEYI(L_sb0OZ*=M%yQb?L{UL(2_*CTVbRxBe z@{)COwTK1}!*CK0Vi4~AB;HF(MmQf|dsoy(eiQ>WTKcEQlnKOri5xYsqi61Y=I4kzAjn5~{IWrz_l))|Ls zvq7xgQs?Xx@`N?f7+3XKLyD~6DRJw*uj*j?yvT3}a;(j_?YOe%hUFcPGWRVBXzpMJ zM43g6DLFqS9tcTLSg=^&N-y0dXL816v&-nqC0iXdg7kV|PY+js`F8dm z2PuHw&k+8*&9SPQ6f!^5q0&AH(i+z3I7a?8O+S5`g)>}fG|BM&ZnmL;rk)|u{1!aZ zEZHpAMmK_v$GbrrWNP|^2^s*!0waLW=-h5PZa-4jWYUt(Hr@EA(m3Mc3^uDxwt-me^55FMA9^>hpp26MhqjLg#^Y7OIJ5%ZLdNx&uDgIIqc zZRZl|n6TyV)0^DDyVtw*jlWkDY&Gw4q;k!UwqSL6&sW$B*5Rc?&)dt29bDB*b6IBY z6SY6Unsf6AOQdEf=P1inu6(6hVZ0~v-<>;LAlcQ2u?wRWj5VczBT$Op#8IhppP-1t zfz5H59Aa~yh7EN;BXJsLyjkjqARS5iIhDVPj<=4AJb}m6M@n{xYj3qsR*Q8;hVxDyC4vLI;;?^eENOb5QARj#nII5l$MtBCI@5u~(ylFi$ zw6-+$$XQ}Ca>FWT>q{k)g{Ml(Yv=6aDfe?m|5|kbGtWS}fKWI+})F6`x@||0oJ^(g|+xi zqlPdy5;`g*i*C=Q(aGeDw!eQg&w>UUj^{o?PrlFI=34qAU2u@BgwrBiaM8zoDTFJ< zh7nWpv>dr?q;4ZA?}V}|7qWz4W?6#S&m>hs4IwvCBe@-C>+oohsQZ^JC*RfDRm!?y zS4$7oxcI|##ga*y5hV>J4a%HHl^t$pjY%caL%-FlRb<$A$E!ws?8hf0@(4HdgQ!@> zds{&g$ocr9W4I84TMa9-(&^_B*&R%^=@?Ntxi|Ejnh;z=!|uVj&3fiTngDPg=0=P2 zB)3#%HetD84ayj??qrxsd9nqrBem(8^_u_UY{1@R_vK-0H9N7lBX5K(^O2=0#TtUUGSz{ z%g>qU8#a$DyZ~EMa|8*@`GOhCW3%DN%xuS91T7~iXRr)SG`%=Lfu%U~Z_`1b=lSi?qpD4$vLh$?HU6t0MydaowUpb zQr{>_${AMesCEffZo`}K0^~x>RY_ZIG{(r39MP>@=aiM@C;K)jUcfQV8#?SDvq>9D zI{XeKM%$$XP5`7p3K0T}x;qn)VMo>2t}Ib(6zui;k}<<~KibAb%p)**e>ln<=qyWU zrRDy|UXFi9y~PdEFIAXejLA{K)6<)Q`?;Q5!KsuEw({!#Rl8*5_F{TP?u|5(Hijv( ztAA^I5+$A*+*e0V0R~fc{ET-RAS3suZ}TRk3r)xqj~g_hxB`qIK5z(5wxYboz%46G zq{izIz^5xW1Vq#%lhXaZL&)FJWp0VZNO%2&ADd?+J%K$fM#T_Eke1{dQsx48dUPUY zLS+DWMJeUSjYL453f@HpRGU6Dv)rw+-c6xB>(=p4U%}_p>z^I@Ow9`nkUG21?cMIh9}hN?R-d)*6%pr6d@mcb*ixr7 z)>Lo<&2F}~>WT1ybm^9UO{6P9;m+fU^06_$o9gBWL9_}EMZFD=rLJ~&e?fhDnJNBI zKM=-WR6g7HY5tHf=V~6~QIQ~rakNvcsamU8m28YE=z8+G7K=h%)l6k zmCpiDInKL6*e#)#Pt;ANmjf`8h-nEt&d}(SBZMI_A{BI#ck-_V7nx)K9_D9K-p@?Zh81#b@{wS?wCcJ%og)8RF*-0z+~)6f#T` zWqF7_CBcnn=S-1QykC*F0YTsKMVG49BuKQBH%WuDkEy%E?*x&tt%0m>>5^HCOq|ux zuvFB)JPR-W|%$24eEC^AtG3Gp4qdK%pjRijF5Sg3X}uaKEE z-L5p5aVR!NTM8T`4|2QA@hXiLXRcJveWZ%YeFfV%mO5q#($TJ`*U>hicS+CMj%Ip# zivoL;dd*araeJK9EA<(tihD50FHWbITBgF9E<33A+eMr2;cgI3Gg6<-2o|_g9|> zv5}i932( zYfTE9?4#nQhP@a|zm#9FST2 z!y+p3B;p>KkUzH!K;GkBW}bWssz)9b>Ulg^)EDca;jDl+q=243BddS$hY^fC6lbpM z(q_bo4V8~eVeA?0LFD6ZtKcmOH^75#q$Eo%a&qvE8Zsqg=$p}u^|>DSWUP5i{6)LAYF4E2DfGZuMJ zMwxxmkxQf}Q$V3&2w|$`9_SQS^2NVbTHh;atB>=A%!}k-f4*i$X8m}Ni^ppZXk5_oYF>Gq(& z0wy{LjJOu}69}~#UFPc;$7ka+=gl(FZCy4xEsk);+he>Nnl>hb5Ud-lj!CNicgd^2 z_Qgr_-&S7*#nLAI7r()P$`x~fy)+y=W~6aNh_humoZr7MWGSWJPLk}$#w_1n%(@? z3FnHf1lbxKJbQ9c&i<$(wd{tUTX6DAKs@cXIOBv~!9i{wD@*|kwfX~sjKASrNFGvN zrFc=!0Bb^OhR2f`%hrp2ibv#KUxl)Np1aixD9{^o=)*U%n%rTHX?FSWL^UGpHpY@7 z74U}KoIRwxI#>)Pn4($A`nw1%-D}`sGRZD8Z#lF$6 zOeA5)+W2qvA%m^|$WluUU-O+KtMqd;Pd58?qZj})MbxYGO<{z9U&t4D{S2G>e+J9K ztFZ?}ya>SVOLp9hpW)}G%kTrg*KXXXsLkGdgHb+R-ZXqdkdQC0_)`?6mqo8(EU#d( zy;u&aVPe6C=YgCRPV!mJ6R6kdY*`e+VGM~`VtC>{k27!9vAZT)x2~AiX5|m1Rq}_= z;A9LX^nd$l-9&2%4s~p5r6ad-siV`HtxKF}l&xGSYJmP=z!?Mlwmwef$EQq~7;#OE z)U5eS6dB~~1pkj#9(}T3j!((8Uf%!W49FfUAozijoxInUE7z`~U3Y^}xc3xp){#9D z<^Tz2xw}@o@fdUZ@hnW#dX6gDOj4R8dV}Dw`u!h@*K)-NrxT8%2`T}EvOImNF_N1S zy?uo6_ZS>Qga4Xme3j#aX+1qdFFE{NT0Wfusa$^;eL5xGE_66!5_N8!Z~jCAH2=${ z*goHjl|z|kbmIE{cl-PloSTtD+2=CDm~ZHRgXJ8~1(g4W=1c3=2eF#3tah7ho`zm4 z05P&?nyqq$nC?iJ-nK_iBo=u5l#|Ka3H7{UZ&O`~t-=triw=SE7ynzMAE{Mv-{7E_ zViZtA(0^wD{iCCcg@c{54Ro@U5p1QZq_XlEGtdBAQ9@nT?(zLO0#)q55G8_Ug~Xnu zR-^1~hp|cy&52iogG@o?-^AD8Jb^;@&Ea5jEicDlze6%>?u$-eE};bQ`T6@(bED0J zKYtdc?%9*<<$2LCBzVx9CA4YV|q-qg*-{yQ;|0=KIgI6~z0DKTtajw2Oms3L zn{C%{P`duw!(F@*P)lFy11|Z&x`E2<=$Ln38>UR~z6~za(3r;45kQK_^QTX%!s zNzoIFFH8|Y>YVrUL5#mgA-Jh>j7)n)5}iVM4%_@^GSwEIBA2g-;43* z*)i7u*xc8jo2z8&=8t7qo|B-rsGw)b8UXnu`RgE4u!(J8yIJi(5m3~aYsADcfZ!GG zzqa7p=sg`V_KjiqI*LA-=T;uiNRB;BZZ)~88 z`C%p8%hIev2rxS12@doqsrjgMg3{A&N8A?%Ui5vSHh7!iC^ltF&HqG~;=16=h0{ygy^@HxixUb1XYcR36SB}}o3nxu z_IpEmGh_CK<+sUh@2zbK9MqO!S5cao=8LSQg0Zv4?ju%ww^mvc0WU$q@!oo#2bv24 z+?c}14L2vlDn%Y0!t*z=$*a!`*|uAVu&NO!z_arim$=btpUPR5XGCG0U3YU`v>yMr z^zmTdcEa!APX zYF>^Q-TP11;{VgtMqC}7>B^2gN-3KYl33gS-p%f!X<_Hr?`rG8{jb9jmuQA9U;BeG zHj6Pk(UB5c6zwX%SNi*Py*)gk^?+729$bAN-EUd*RKN7{CM4`Q65a1qF*-QWACA&m zrT)B(M}yih{2r!Tiv5Y&O&=H_OtaHUz96Npo_k0eN|!*s2mLe!Zkuv>^E8Xa43ZwH zOI058AZznYGrRJ+`*GmZzMi6yliFmGMge6^j?|PN%ARns!Eg$ufpcLc#1Ns!1@1 zvC7N8M$mRgnixwEtX{ypBS^n`k@t2cCh#_6L6WtQb8E~*Vu+Rr)YsKZRX~hzLG*BE zaeU#LPo?RLm(Wzltk79Jd1Y$|6aWz1)wf1K1RtqS;qyQMy@H@B805vQ%wfSJB?m&&=^m4i* zYVH`zTTFbFtNFkAI`Khe4e^CdGZw;O0 zqkQe2|NG_y6D%h(|EZNf&77_!NU%0y={^E=*gKGQ=)LdKPM3zUlM@otH2X07Awv8o zY8Y7a1^&Yy%b%m{mNQ5sWNMTIq96Wtr>a(hL>Qi&F(ckgKkyvM0IH<_}v~Fv-GqDapig=3*ZMOx!%cYY)SKzo7ECyem z9Mj3C)tCYM?C9YIlt1?zTJXNOo&oVxu&uXKJs7i+j8p*Qvu2PAnY}b`KStdpi`trk ztAO}T8eOC%x)mu+4ps8sYZ=vYJp16SVWEEgQyFKSfWQ@O5id6GfL`|2<}hMXLPszS zgK>NWOoR zBRyKeUPevpqKKShD|MZ`R;~#PdNMB3LWjqFKNvH9k+;(`;-pyXM55?qaji#nl~K8m z_MifoM*W*X9CQiXAOH{cZcP0;Bn10E1)T@62Um>et2ci!J2$5-_HPy(AGif+BJpJ^ ziHWynC_%-NlrFY+(f7HyVvbDIM$5ci_i3?22ZkF>Y8RPBhgx-7k3M2>6m5R24C|~I z&RPh9xpMGzhN4bii*ryWaN^d(`0 zTOADlU)g`1p+SVMNLztd)c+;XjXox(VHQwqzu>FROvf0`s&|NEv26}(TAe;@=FpZq zaVs6mp>W0rM3Qg*6x5f_bPJd!6dQGmh?&v0rpBNfS$DW-{4L7#_~-eA@7<2BsZV=X zow){3aATmLZOQrs>uzDkXOD=IiX;Ue*B(^4RF%H zeaZ^*MWn4tBDj(wj114r(`)P96EHq4th-;tWiHhkp2rDlrklX}I@ib-nel0slFoQO zOeTc;Rh7sMIebO`1%u)=GlEj+7HU;c|Nj>2j)J-kpR)s3#+9AiB zd$hAk6;3pu9(GCR#)#>aCGPYq%r&i02$0L9=7AlIGYdlUO5%eH&M!ZWD&6^NBAj0Y9ZDcPg@r@8Y&-}e!aq0S(`}NuQ({;aigCPnq75U9cBH&Y7 ze)W0aD>muAepOKgm7uPg3Dz7G%)nEqTUm_&^^3(>+eEI;$ia`m>m0QHEkTt^=cx^JsBC68#H(3zc~Z$E9I)oSrF$3 zUClHXhMBZ|^1ikm3nL$Z@v|JRhud*IhOvx!6X<(YSX(9LG#yYuZeB{=7-MyPF;?_8 zy2i3iVKG2q!=JHN>~!#Bl{cwa6-yB@b<;8LSj}`f9pw7#x3yTD>C=>1S@H)~(n_K4 z2-yr{2?|1b#lS`qG@+823j;&UE5|2+EdU4nVw5=m>o_gj#K>>(*t=xI7{R)lJhLU{ z4IO6!x@1f$aDVIE@1a0lraN9!(j~_uGlks)!&davUFRNYHflp<|ENwAxsp~4Hun$Q z$w>@YzXp#VX~)ZP8`_b_sTg(Gt7?oXJW%^Pf0UW%YM+OGjKS}X`yO~{7WH6nX8S6Z ztl!5AnM2Lo*_}ZLvo%?iV;D2z>#qdpMx*xY2*GGlRzmHCom`VedAoR=(A1nO)Y>;5 zCK-~a;#g5yDgf7_phlkM@)C8s!xOu)N2UnQhif-v5kL$*t=X}L9EyBRq$V(sI{90> z=ghTPGswRVbTW@dS2H|)QYTY&I$ljbpNPTc_T|FEJkSW7MV!JM4I(ksRqQ8)V5>}v z2Sf^Z9_v;dKSp_orZm09jb8;C(vzFFJgoYuWRc|Tt_&3k({wPKiD|*m!+za$(l*!gNRo{xtmqjy1=kGzFkTH=Nc>EL@1Um0BiN1)wBO$i z6rG={bRcT|%A3s3xh!Bw?=L&_-X+6}L9i~xRj2}-)7fsoq0|;;PS%mcn%_#oV#kAp zGw^23c8_0~ ze}v9(p};6HM0+qF5^^>BBEI3d=2DW&O#|(;wg}?3?uO=w+{*)+^l_-gE zSw8GV=4_%U4*OU^hibDV38{Qb7P#Y8zh@BM9pEM_o2FuFc2LWrW2jRRB<+IE)G=Vx zuu?cp2-`hgqlsn|$nx@I%TC!`>bX^G00_oKboOGGXLgyLKXoo$^@L7v;GWqfUFw3< zekKMWo0LR;TaFY}Tt4!O$3MU@pqcw!0w0 zA}SnJ6Lb597|P5W8$OsEHTku2Kw9y4V=hx*K%iSn!#LW9W#~OiWf^dXEP$^2 zaok=UyGwy3GRp)bm6Gqr>8-4h@3=2`Eto2|JE6Sufh?%U6;ut1v1d@#EfcQP2chCt z+mB{Bk5~()7G>wM3KYf7Xh?LGbwg1uWLotmc_}Z_o;XOUDyfU?{9atAT$={v82^w9 z(MW$gINHt4xB3{bdbhRR%T}L?McK?!zkLK3(e>zKyei(yq%Nsijm~LV|9mll-XHavFcc$teX7v);H>=oN-+E_Q{c|! zp
      JV~-9AH}jxf6IF!PxrB9is{_9s@PYth^`pb%DkwghLdAyDREz(csf9)HcVRq z+2Vn~>{(S&_;bq_qA{v7XbU?yR7;~JrLfo;g$Lkm#ufO1P`QW_`zWW+4+7xzQZnO$ z5&GyJs4-VGb5MEDBc5=zxZh9xEVoY(|2yRv&!T7LAlIs@tw+4n?v1T8M>;hBv}2n) zcqi+>M*U@uY>4N3eDSAH2Rg@dsl!1py>kO39GMP#qOHipL~*cCac2_vH^6x@xmO|E zkWeyvl@P$2Iy*mCgVF+b{&|FY*5Ygi8237i)9YW#Fp& z?TJTQW+7U)xCE*`Nsx^yaiJ0KSW}}jc-ub)8Z8x(|K7G>`&l{Y&~W=q#^4Gf{}aJ%6kLXsmv6cr=Hi*uB`V26;dr4C$WrPnHO>g zg1@A%DvIWPDtXzll39kY6#%j;aN7grYJP9AlJgs3FnC?crv$wC7S4_Z?<_s0j;MmE z75yQGul2=bY%`l__1X3jxju2$Ws%hNv75ywfAqjgFO7wFsFDOW^)q2%VIF~WhwEW0 z45z^+r+}sJ{q+>X-w(}OiD(!*&cy4X&yM`!L0Fe+_RUfs@=J{AH#K~gArqT=#DcGE z!FwY(h&+&811rVCVoOuK)Z<-$EX zp`TzcUQC256@YWZ*GkE@P_et4D@qpM92fWA6c$MV=^qTu7&g)U?O~-fUR&xFqNiY1 zRd=|zUs_rmFZhKI|H}dcKhy%Okl(#y#QuMi81zsY56Y@757xBQqDNkd+XhLQhp2BB zBF^aJ__D676wLu|yYo6jNJNw^B+Ce;DYK!f$!dNs1*?D^97u^jKS++7S z5qE%zG#HY-SMUn^_yru=T6v`)CM%K<>_Z>tPe|js`c<|y7?qol&)C=>uLWkg5 zmzNcSAG_sL)E9or;i+O}tY^70@h7+=bG1;YDlX{<4zF_?{)K5B&?^tKZ6<$SD%@>F zY0cl2H7)%zKeDX%Eo7`ky^mzS)s;842cP{_;dzFuyd~Npb4u!bwkkhf8-^C2e3`q8>MuPhgiv0VxHxvrN9_`rJv&GX0fWz-L-Jg^B zrTsm>)-~j0F1sV=^V?UUi{L2cp%YwpvHwwLaSsCIrGI#({{QfbgDxLKsUC6w@m?y} zg?l=7aMX-RnMxvLn_4oSB|9t;)Qf2%m-GKo_07?N1l^ahJ+Wf8C>h5~=-o1BJzV@5HBTB-ACNpsHnGt6_ku37M z{vIEB^tR=--4SEg{jfF=gEogtGwi&A$mwk7E+SV$$ZuU}#F3Y7t}o{!w4LJh8v4PW%8HfUK@dta#l*z@w*9Xzz(i)r#WXi`r1D#oBPtNM7M?Hkq zhhS1)ea5(6VY45|)tCTr*@yc$^Zc!zQzsNXU?aRN6mh7zVu~i=qTrX^>de+f6HYfDsW@6PBlw0CsDBcOWUmt&st>Z zYNJEsRCP1#g0+Htb=wITvexBY@fOpAmR7?szQNR~nM)?sPWIj)0)jG-EF8U@nnBaQZy z)ImpVYQL>lBejMDjlxA$#G4%y+^_>N;}r@Zoe2|u-9-x@vvD^ZWnV>Gm=pZa7REAf zOnomhCxBaGZgT+4kiE%aS&lH2sI1mSCM<%)Cr*Sli;#!aXcUb&@Z|Hj{VPsJyClqD%>hy`Y7z(GASs8Mqas3!D zSQE83*%uctlD|p%4)v`arra4y>yP5m25V*_+n)Ry1v>z_Fz!TV6t+N?x?#iH$q=m= z8&X{uW%LVRO87dVl=$Y*>dabJVq{o|Kx`7(D2$5DVX&}XGbg|Ua(*5b=;5qzW9;|w>m{hIO(Tu-z(ey8H=EMluJNyK4BJmGpX~ZM2O61 zk*O7js{-MBqwq>Urf0igN+6soGGc!Y?SP6hiXuJzZ1V4WZqE*?h;PG84gvG~dds6~484!kPM zMP87IP?dhdc;%|cS&LxY*Ib6P3%p|9)E3IgRmhhwtUR3eRK6iZ_6fiGW}jnL4(I|t ze`2yLvmuY42lNwO6>I#Son3$R4NOoP*WUm1R4jl#agtSLE}fSu-Z>{+*?pQIn7`s3LAzF#1pSxCAo?clr9 z9PUj#REq28*ZkJnxs$aK%8^5?P<_Q!#Z?%JH0FKVF;&zH3F#J^fz|ahl$Ycs~kFij_XP;U<`FcaDYyXYPM~&jEe1Xj1n;wyRdD;lmnq&FEro=;+Z$=v-&fYM9eK*S_D&oTXFW#b0 zRY}Y7R#bLzTfg9i7{s?=P9~qjA?$-U2p5;0?gPPu`1JY|*?*8IPO!eX>oiX=O#F!A zl`S%e5Y(csR1f)I(iKMf-;5%_rPP7h&}5Fc(8byKUH1*d7?9%QC|4aADj3L8yuo6GOv#%HDgU3bN(UHw1+(99&Om%f!DY(RYSf4&Uny% zH}*&rEXc$W5+eyeEg|I|E-HnkIO0!$1sV7Z&NXxiCZJ@`kH4eEi5}q~!Vv5qQq{MI zi4^`GYoUN-7Q(jy^SKXL4$G4K+FQXR)B}ee=pS0RyK=YC8c2bGnMA~rrOh&jd3_AT zxVaq37w^-;OU3+C`Kko-Z%l_2FC^maa=Ae0Fm@PEtXEg@cX*oka1Lt&h@jES<6?o1Oi1C9>}7+U(Ve zQ$=8RlzcnfCd59CsJ=gG^A!2Bb_PY~K2sSau{)?Ge03G7US&qrgV!3NUi>UHWZ*lo zS;~0--vn{ot+7UWMV{a(X3rZ8Z06Ps3$-sd|CWE(Y#l`swvcDbMjuReGsoA`rmZ`^ z=AaArdbeU0EtwnOuzq@u5P1rlZjH#gNgh6HIhG(>dX%4m{_!&DNTQE)8= zXD-vcpcSi|DSm3aUMnrV;DQY?svz?9*#GT$NXb~Hem=24iy>7xj367(!#RjnrHtrP-Q`T2W*PEvAR-=j ztY2|#<|JvHNVnM-tNdoS_yRSo=yFqukTZmB$|>Vclj)o=YzC9!ph8)ZOH5X=%Aq|9gNgc}^KFVLht!Lyw54v5u&D zW%vT%z`H{Ax>Ry+bD&QjHQke_wEA;oj(&E!s4|OURButQKSc7Ar-PzIiFa8F@ezkaY2J9&PH+VI1!G+{JgsQ7%da*_Gr!exT*OgJld)b-?cd)xI+|v_C`h(Cg`N~oj0`SQPTma z{@vc8L^D-rBXwS#00jT#@=-n1H-C3hvg61r2jx#ok&cr#BV~9JdPaVihyrGq*lb>bm$H6rIoc}ifaSn6mTD9% z$FRJxbNozOo6y}!OUci1VBv-7{TYZ4GkOM@46Y9?8%mSH9?l&lU59)T#Fjg(h%6I} z?ib zZ(xb8Rwr+vv>@$h{WglT2lL`#V=-9tP^c)cjvnz(g|VL^h8^CPVv12dE(o}WQ@0OP z^2-&ssBXP^#Oh`X5@F+~$PCB6kK-T7sFUK|>$lNDSkvAy%{y2qgq-&v zv}^&gm`wiYztWgMS<{^qQKYNV=>CQaOeglAY~EZvr}n~tW=yg)_+fzqF%~+*V_$3h z2hDW`e$qR;QMg?(wKE>%H_6ASS@6bkOi-m- zg6B7AzD;gBS1%OD7|47a%3BykN{w}P!Wn-nQOfpKUpx8Mk{$IO62D!%U9$kr!e%T> zlqQih?3(U&5%r!KZFZPdbwZ0laAJCj!c&pEFVzrH&_&i5m68Y_*J+-Qjlnz}Q{3oAD)`d14H zKUGmbwC|beC9Mtp>SbL~NVrlctU3WBpHz(UeIa~_{u^_4OaHs_LQt>bUwcyD`_Bbh zC=x|1vSjL)JvVHLw|xKynEvq2m)7O-6qdmjht7pZ*z|o%NA17v$9H*(5D5(MXiNo1 z72Tv}QASqr$!mY58s_Q{hHa9MY+QZ`2zX-FT@Kd?`8pczcV^9IeOKDG4WKqiP7N|S z+O977=VQTk8k5dafK`vd(4?_3pBdB?YG9*Z=R@y|$S+d%1sJf-Ka++I&v9hH)h#}} zw-MjQWJ?ME<7PR(G<1#*Z-&M?%=yzhQw$Lki(R+Pq$X~Q!9BO=fP9FyCIS8zE3n04 z8ScD%XmJnIv=pMTgt6VSxBXOZucndRE@7^aU0wefJYueY(Cb%?%0rz)zWEnsNsKhQ z+&o6d^x=R;Pt7fUa_`JVb1HPHYbXg{Jvux|atQ^bV#_|>7QZNC~P^IKUThB6{kvz2pr2*Cyxj zy37Nri8za8J!@Iw9rbt~#^<9zOaM8LOi$kPBcAGqPq-DB^-93Qeup{9@9&=zV6KQN zL)ic5S%n1!F(7b>MQ973$~<0|9MY-G!?wk?j-cQhMQlM2n{&7JoTBGsP;=fC6CBJn zxlpk^%x=B16rfb-W9pYV#9IRHQL9VG4?Uh>pN>2}0-MST2AB2pQjf*rT+TLCX-+&m z9I{ic2ogXoh=HwdI#igr(JC>>NUP|M>SA?-ux<2&>Jyx>Iko!B<3vS}{g*dKqxYW7 z0i`&U#*v)jot+keO#G&wowD!VvD(j`Z9a*-_RALKn0b(KnZ37d#Db7royLhBW~*7o zRa`=1fo9C4dgq;;R)JpP++a9^{xd)8``^fPW9!a%MCDYJc;3yicPs8IiQM>DhUX*; zeIrxE#JRrr|D$@bKgOm4C9D+e!_hQKj3LC`Js)|Aijx=J!rlgnpKeF>b+QlKhI^4* zf%Of^RmkW|xU|p#Lad44Y5LvIUIR>VGH8G zz7ZEIREG%UOy4)C!$muX6StM4@Fsh&Goa}cj10RL(#>oGtr6h~7tZDDQ_J>h)VmYlKK>9ns8w4tdx6LdN5xJQ9t-ABtTf_ zf1dKVv!mhhQFSN=ggf(#$)FtN-okyT&o6Ms+*u72Uf$5?4)78EErTECzweDUbbU)) zc*tt+9J~Pt%!M352Y5b`Mwrjn^Orp+)L_U1ORHJ}OUsB78YPcIRh4p5jzoDB7B*fb z4v`bouQeCAW#z9b1?4(M3dcwNn2F2plwC^RVHl#h&b-8n#5^o+Ll20OlJ^gOYiK2< z;MQuR!t!>`i}CAOa4a+Rh5IL|@kh4EdEL*O=3oGx4asg?XCTcUOQnmHs^6nLu6WcI zSt9q7nl*?2TIikKNb?3JZBo$cW6)b#;ZKzi+(~D-%0Ec+QW=bZZm@w|prGiThO3dy zU#TQ;RYQ+xU~*@Zj;Rf~z~iL8Da`RT!Z)b3ILBhnIl@VX9K0PSj5owH#*FJXX3vZ= zg_Zyn^G&l!WR6wN9GWvt)sM?g2^CA8&F#&t2z3_MiluRqvNbV{Me6yZ&X-_ zd6#Xdh%+6tCmSNTdCBusVkRwJ_A~<^Nd6~MNOvS;YDixM43`|8e_bmc*UWi7TLA})`T_F ztk&Nd=dgFUss#Ol$LXTRzP9l1JOSvAws~^X%(`ct$?2Im?UNpXjBec_-+8YK%rq#P zT9=h8&gCtgx?=Oj$Yr2jI3`VVuZ`lH>*N+*K11CD&>>F)?(`yr~54vHJftY*z?EorK zm`euBK<$(!XO%6-1=m>qqp6F`S@Pe3;pK5URT$8!Dd|;`eOWdmn916Ut5;iXWQoXE z0qtwxlH=m_NONP3EY2eW{Qwr-X1V3;5tV;g7tlL4BRilT#Y&~o_!f;*hWxWmvA;Pg zRb^Y$#PipnVlLXQIzKCuQP9IER0Ai4jZp+STb1Xq0w(nVn<3j(<#!vuc?7eJEZC<- zPhM7ObhgabN2`pm($tu^MaBkRLzx&jdh;>BP|^$TyD1UHt9Qvr{ZcBs^l!JI4~d-Py$P5QOYO&8eQOFe)&G zZm+?jOJioGs7MkkQBCzJSFJV6DiCav#kmdxc@IJ9j5m#&1)dhJt`y8{T!uxpBZ>&z zD^V~%GEaODak5qGj|@cA7HSH{#jHW;Q0KRdTp@PJO#Q1gGI=((a1o%X*{knz&_`ym zkRLikN^fQ%Gy1|~6%h^vx>ToJ(#aJDxoD8qyOD{CPbSvR*bC>Nm+mkw>6mD0mlD0X zGepCcS_x7+6X7dH;%e`aIfPr-NXSqlu&?$Br1R}3lSF2 zWOXDtG;v#EVLSQ!>4323VX-|E#qb+x%IxzUBDI~N23x? zXUHfTTV#_f9T$-2FPG@t)rpc9u9!@h^!4=fL^kg9 zVv%&KY3!?bU*V4X)wNT%Chr;YK()=~lc%$auOB_|oH`H)Xot@1cmk{^qdt&1C55>k zYnIkdoiAYW41zrRBfqR?9r^cpWIEqfS;|R#bIs4$cqA zoq~$yl8h{IXTSdSdH?;`ky6i%+Oc?HvwH+IS`%_a!d#CqQob9OTNIuhUnOQsX;nl_ z;1w99qO9lAb|guQ9?p4*9TmIZ5{su!h?v-jpOuShq!{AuHUYtmZ%brpgHl$BKLK_L z6q5vZodM$)RE^NNO>{ZWPb%Ce111V4wIX}?DHA=uzTu0$1h8zy!SID~m5t)(ov$!6 zB^@fP#vpx3enbrbX=vzol zj^Bg7V$Qa53#3Lptz<6Dz=!f+FvUBVIBtYPN{(%t(EcveSuxi3DI>XQ*$HX~O{KLK5Dh{H2ir87E^!(ye{9H&2U4kFxtKHkw zZPOTIa*29KbXx-U4hj&iH<9Z@0wh8B6+>qQJn{>F0mGnrj|0_{nwN}Vw_C!rm0!dC z>iRlEf}<+z&?Z4o3?C>QrLBhXP!MV0L#CgF{>;ydIBd5A{bd-S+VFn zLqq4a*HD%65IqQ5BxNz~vOGU=JJv|NG{OcW%2PU~MEfy6(bl#^TfT7+az5M-I`i&l z#g!HUfN}j#adA-21x7jbP6F;`99c8Qt|`_@u@fbhZF+Wkmr;IdVHj+F=pDb4MY?fU znDe##Hn){D}<>vVhYL#)+6p9eAT3T$?;-~bZU%l7MpPNh_mPc(h@79 z;LPOXk>e3nmIxl9lno5cI5G@Q!pE&hQ`s{$Ae4JhTebeTsj*|!6%0;g=wH?B1-p{P z`In#EP12q6=xXU)LiD+mLidPrYGHaKbe5%|vzApq9(PI6I5XjlGf<_uyy59iw8W;k zdLZ|8R8RWDc`#)n2?~}@5)vvksY9UaLW`FM=2s|vyg>Remm=QGthdNL87$nR&TKB*LB%*B}|HkG64 zZ|O4=Yq?Zwl>_KgIG@<8i{Zw#P3q_CVT7Dt zoMwoI)BkpQj8u(m!>1dfOwin(50}VNiLA>A2OG&TBXcP=H(3I;!WdPFe?r_e{%>bc6(Zk?6~Ew&;#ZxBJ| zAd1(sAHqlo_*rP;nTk)kAORe3cF&tj>m&LsvB)`-y9#$4XU=Dd^+CzvoAz%9216#f0cS`;kERxrtjbl^7pmO;_y zYBGOL7R1ne7%F9M2~0a7Srciz=MeaMU~ zV%Y#m_KV$XReYHtsraWLrdJItLtRiRo98T3J|x~(a>~)#>JHDJ z|4j!VO^qWQfCm9-$N29SpHUqvz62%#%98;2FNIF*?c9hZ7GAu$q>=0 zX_igPSK8Et(fmD)V=CvbtA-V(wS?z6WV|RX2`g=w=4D)+H|F_N(^ON!jHf72<2nCJ z^$hEygTAq7URR{Vq$)BsmFKTZ+i1i(D@SJuTGBN3W8{JpJ^J zkF=gBTz|P;Xxo1NIypGzJq8GK^#4tl)S%8$PP6E8c|GkkQ)vZ1OiB%mH#@hO1Z%Hp zv%2~Mlar^}7TRN-SscvQ*xVv+i1g8CwybQHCi3k;o$K@bmB%^-U8dILX)7b~#iPu@ z&D&W7YY2M3v`s(lNm2#^dCRFd;UYMUw1Rh2mto8laH1m`n0u;>okp5XmbsShOhQwo z@EYOehg-KNab)Rieib?m&NXls+&31)MB&H-zj_WmJsGjc1sCSOz0!2Cm1vV?y@kkQ z<1k6O$hvTQnGD*esux*aD3lEm$mUi0td0NiOtz3?7}h;Bt*vIC{tDBr@D)9rjhP^< zY*uKu^BiuSO%)&FL>C?Ng!HYZHLy`R>`rgq+lJhdXfo|df zmkzpQf{6o9%^|7Yb5v{Tu& zsP*Y~<#jK$S_}uEisRC;=y{zbq`4Owc@JyvB->nPzb#&vcMKi5n66PVV{Aub>*>q8 z=@u7jYA4Ziw2{fSED#t4QLD7Rt`au^y(Ggp3y(UcwIKtI(OMi@GHxs!bj$v~j(FZK zbdcP^gExtXQqQ8^Q#rHy1&W8q!@^aL>g1v2R45T(KErWB)1rB@rU`#n&-?g2Ti~xXCrexrLgajgzNy=N9|A6K=RZ zc3yk>w5sz1zsg~tO~-Ie?%Aplh#)l3`s632mi#CCl^75%i6IY;dzpuxu+2fliEjQn z&=~U+@fV4>{Fp=kk0oQIvBdqS#yY`Z+>Z|T&K{d;v3}=JqzKx05XU3M&@D5!uPTGydasyeZ5=1~IX-?HlM@AGB9|Mzb{{Dt@bUU8{KUPU@EX zv0fpQNvG~nD2WiOe{Vn=hE^rQD(5m+!$rs%s{w9;yg9oxRhqi0)rwsd245)igLmv* zJb@Xlet$+)oS1Ra#qTB@U|lix{Y4lGW-$5*4xOLY{9v9&RK<|K!fTd0wCKYZ)h&2f zEMcTCd+bj&YVmc#>&|?F!3?br3ChoMPTA{RH@NF(jmGMB2fMyW(<0jUT=8QFYD7-% zS0ydgp%;?W=>{V9>BOf=p$q5U511~Q0-|C!85)W0ov7eb35%XV;3mdUI@f5|x5C)R z$t?xLFZOv}A(ZjjSbF+8&%@RChpRvo>)sy>-IO8A@>i1A+8bZd^5J#(lgNH&A=V4V z*HUa0{zT{u-_FF$978RziwA@@*XkV{<-CE1N=Z!_!7;wq*xt3t((m+^$SZKaPim3K zO|Gq*w5r&7iqiQ!03SY{@*LKDkzhkHe*TzQaYAkz&jNxf^&A_-40(aGs53&}$dlKz zsel3=FvHqdeIf!UYwL&Mg3w_H?utbE_(PL9B|VAyaOo8k4qb>EvNYHrVmj^ocJQTf zL%4vl{qgmJf#@uWL@)WiB>Lm>?ivwB%uO|)i~;#--nFx4Kr6{TruZU0N_t_zqkg`? zwPFK|WiC4sI%o1H%$!1ANyq6_0OSPQJybh^vFriV=`S;kSsYkExZwB{68$dTODWJQ z@N57kBhwN(y~OHW_M}rX2W13cl@*i_tjW`TMfa~Y;I}1hzApXgWqag@(*@(|EMOg- z^qMk(s~dL#ps>>`oWZD=i1XI3(;gs7q#^Uj&L`gVu#4zn$i!BIHMoOZG!YoPO^=Gu z5`X-(KoSsHL77c<7^Y*IM2bI!dzg5j>;I@2-EeB$LgW|;csQTM&Z|R)q>yEjk@Sw% z6FQk*&zHWzcXalUJSoa&pgH24n`wKkg=2^ta$b1`(BBpBT2Ah9yQF&Kh+3jTaSE|=vChGz2_R^{$C;D`Ua(_=|OO11uLm;+3k%kO19EA`U065i;fRBoH z{Hq$cgHKRFPf0#%L?$*KeS@FDD;_TfJ#dwP7zzO5F>xntH(ONK{4)#jYUDQr6N(N< zp+fAS9l9)^c4Ss8628Zq5AzMq4zc(In_yJSXAT57Dtl}@= zvZoD7iq0cx7*#I{{r9m{%~g6@Hdr|*njKBb_5}mobCv=&X^`D9?;x6cHwRcwnlO^h zl;MiKr#LaoB*PELm8+8%btnC)b^E12!^ zMmVA!z>59e7n+^!P{PA?f9M^2FjKVw1%x~<`RY5FcXJE)AE}MTopGFDkyEjGiE|C6 z(ad%<3?v*?p;LJGopSEY18HPu2*}U!Nm|rfewc6(&y(&}B#j85d-5PeQ{}zg>>Rvl zDQ3H4E%q_P&kjuAQ>!0bqgAj){vzHpnn+h(AjQ6GO9v**l0|aCsCyXVE@uh?DU;Em zE*+7EU9tDH````D`|rM6WUlzBf1e{ht8$62#ilA6Dcw)qAzSRwu{czZJAcKv8w(Q6 zx)b$aq*=E=b5(UH-5*u)3iFlD;XQyklZrwHy}+=h6=aKtTriguHP@Inf+H@q32_LL z2tX|+X}4dMYB;*EW9~^5bydv)_!<%q#%Ocyh=1>FwL{rtZ?#2Scp{Q55%Fd-LgLU$ zM2u#|F{%vi%+O2^~uK3)?$6>9cc7_}F zWU72eFrzZ~x3ZIBH;~EMtD%51o*bnW;&QuzwWd$ds=O>Ev807cu%>Ac^ZK&7bCN;Ftk#eeQL4pG0p!W{Ri@tGw>nhIo`rC zi!Z6?70nYrNf92V{Y_i(a4DG=5>RktP=?%GcHEx?aKN$@{w{uj#Cqev$bXefo?yC6KI%Rol z%~$974WCymg;BBhd9Mv}_MeNro_8IB4!evgo*je4h?B-CAkEW-Wr-Q_V9~ef(znU& z{f-OHnj>@lZH(EcUb2TpOkc70@1BPiY0B#++1EPY5|UU?&^Vpw|C`k4ZWiB-3oAQM zgmG%M`2qDw5BMY|tG++34My2fE|^kvMSp(d+~P(Vk*d+RW1833i_bX^RYbg9tDtX` zox?y^YYfs-#fX|y7i(FN7js)66jN!`p9^r7oildEU#6J1(415H3h>W*p(p9@dI|c7 z&c*Aqzksg}o`D@i+o@WIw&jjvL!(`)JglV5zwMn)praO2M05H&CDeps0Wq8(8AkuE zPm|8MB6f0kOzg(gw}k>rzhQyo#<#sVdht~Wdk`y`=%0!jbd1&>Kxed8lS{Xq?Zw>* zU5;dM1tt``JH+A9@>H%-9f=EnW)UkRJe0+e^iqm0C5Z5?iEn#lbp}Xso ztleC}hl&*yPFcoCZ@sgvvjBA_Ew6msFml$cfLQY_(=h03WS_z+Leeh$M3#-?f9YT^Q($z z+pgaEv$rIa*9wST`WHASQio=9IaVS7l<87%;83~X*`{BX#@>>p=k`@FYo ze!K5_h8hOc`m0mK0p}LxsguM}w=9vw6Ku8y@RNrXSRPh&S`t4UQY=e-B8~3YCt1Fc zU$CtRW%hbcy{6K{>v0F*X<`rXVM3a{!muAeG$zBf`a(^l${EA9w3>J{aPwJT?mKVN2ba+v)Mp*~gQ_+Ws6= zy@D?85!U@VY0z9T=E9LMbe$?7_KIg)-R$tD)9NqIt84fb{B;f7C)n+B8)Cvo*F0t! zva6LeeC}AK4gL#d#N_HvvD& z0;mdU3@7%d5>h(xX-NBmJAOChtb(pX-qUtRLF5f$ z`X?Kpu?ENMc88>O&ym_$Jc7LZ> z#73|xJ|aa@l}PawS4Mpt9n)38w#q^P1w2N|rYKdcG;nb!_nHMZA_09L!j)pBK~e+j?tb-_A`wF8 zIyh>&%v=|n?+~h}%i1#^9UqZ?E9W!qJ0d0EHmioSt@%v7FzF`eM$X==#oaPESHBm@ zYzTXVo*y|C0~l_)|NF|F(If~YWJVkQAEMf5IbH{}#>PZpbXZU;+b^P8LWmlmDJ%Zu)4CajvRL!g_Faph`g0hpA2)D0|h zYy0h5+@4T81(s0D=crojdj|dYa{Y=<2zKp@xl&{sHO;#|!uTHtTey25f1U z#=Nyz{rJy#@SPk3_U|aALcg%vEjwIqSO$LZI59^;Mu~Swb53L+>oxWiN7J{;P*(2b@ao*aU~}-_j10 z@fQiaWnb}fRrHhNKrxKmi{aC#34BRP(a#0K>-J8D+v_2!~(V-6J%M@L{s?fU5ChwFfqn)2$siOUKw z?SmIRlbE8ot5P^z0J&G+rQ5}H=JE{FNsg`^jab7g-c}o`s{JS{-#}CRdW@hO`HfEp z1eR0DsN! zt5xmsYt{Uu;ZM`CgW)VYk=!$}N;w+Ct$Wf!*Z-7}@pA62F^1e$Ojz9O5H;TyT&rV( zr#IBM8te~-2t2;kv2xm&z%tt3pyt|s#vg2EOx1XkfsB*RM;D>ab$W-D6#Jdf zJ3{yD;P4=pFNk2GL$g~+5x;f9m*U2!ovWMK^U5`mAgBRhGpu)e`?#4vsE1aofu)iT zDm;aQIK6pNd8MMt@}h|t9c$)FT7PLDvu3e)y`otVe1SU4U=o@d!gn(DB9kC>Ac1wJ z?`{Hq$Q!rGb9h&VL#z+BKsLciCttdLJe9EmZF)J)c1MdVCrxg~EM80_b3k{ur=jVjrVhDK1GTjd3&t#ORvC0Q_&m|n>&TF1C_>k^8&ylR7oz#rG?mE%V| zepj0BlD|o?p8~LK_to`GINhGyW{{jZ{xqaO*SPvH)BYy1eH22DL_Kkn28N!0z3fzj z_+xZ3{ph_Tgkd)D$OjREak$O{F~mODA_D`5VsoobVnpxI zV0F_79%JB!?@jPs=cY73FhGuT!?fpVX1W=Wm zK5}i7(Pfh4o|Z{Ur=Y>bM1BDo2OdXBB(4Y#Z!61A8C6;7`6v-(P{ou1mAETEV?Nt< zMY&?ucJcJ$NyK0Zf@b;U#3ad?#dp`>zmNn=H1&-H`Y+)ai-TfyZJX@O&nRB*7j$ zDQF!q#a7VHL3z#Hc?Ca!MRbgL`daF zW#;L$yiQP|5VvgvRLluk3>-1cS+7MQ1)DC&DpYyS9j;!Rt$HdXK1}tG3G_)ZwXvGH zG;PB^f@CFrbEK4>3gTVj73~Tny+~k_pEHt|^eLw{?6NbG&`Ng9diB9XsMr(ztNC!{FhW8Hi!)TI`(Q|F*b z-z;#*c1T~kN67omP(l7)ZuTlxaC_XI(K8$VPfAzj?R**AMb0*p@$^PsN!LB@RYQ4U zA^xYY9sX4+;7gY%$i%ddfvneGfzbE4ZTJT5Vk3&1`?ULTy28&D#A&{dr5ZlZH&NTz zdfZr%Rw*Ukmgu@$C5$}QLOyb|PMA5syQns?iN@F|VFEvFPK321mTW^uv?GGNH6rnM zR9a2vB`}Y++T3Wumy$6`W)_c0PS*L;;0J^(T7<)`s{}lZVp`e)fM^?{$ zLbNw>N&6aw5Hlf_M)h8=)x0$*)V-w-Pw5Kh+EY{^$?#{v)_Y{9p5K{DjLnJ(ZUcyk*y(6D8wHB8=>Y)fb_Pw0v)Xybk`Sw@hNEaHP$-n`DtYP ziJyiauEXtuMpWyQjg$gdJR?e+=8w+=5GO-OT8pRaVFP1k^vI|I&agGjN-O*bJEK!M z`kt^POhUexh+PA&@And|vk-*MirW?>qB(f%y{ux z*d44UXxQOs+C`e-x4KSWhPg-!gO~kavIL8X3?!Ac2ih-dkK~Ua2qlcs1b-AIWg*8u z0QvL~51vS$LnmJSOnV4JUCUzg&4;bSsR5r_=FD@y|)Y2R_--e zMWJ;~*r=vJssF5_*n?wF0DO_>Mja=g+HvT=Yd^uBU|aw zRixHUQJX0Pgt-nFV+8&|;-n>!jNUj!8Y_YzH*%M!-_uWt6& z|Ec+lAD``i^do;u_?<(RpzsYZVJ8~}|NjUFgXltofbjhf!v&208g^#0h-x?`z8cInq!9kfVwJ|HQ;VK>p_-fn@(3q?e51Keq(=U-7C0#as-q z8Or}Ps07>O2@AAXz_%3bTOh{tKm#uRe}Sqr=w6-Wz$FCdfF3qNabEaj`-OfipxaL- zPh2R*l&%ZbcV?lv4C3+t2DAVSFaRo20^W_n4|0t(_*`?KmmUHG2sNZ*CRZlCFIyZbJqLdBCj)~%if)g|4NJr(8!R!E0iBbm$;`m;1n2@(8*E%B zH!g{hK|WK?1jUfM9zX?hlV#l%!6^p$$P+~rg}OdKg|d^Ed4WTY1$1J@WWHr$Os_(L z;-Zu1FJqhR4LrCUl)C~E7gA!^wtA6YIh10In9rX@LGSjnTPtLp+gPGp6u z3}{?J1!yT~?FwqT;O_-1%37f#4ek&DL){N}MX3RbNfRb-T;U^wXhx#De&QssA$lu~ mWkA_K7-+yz9tH*t6hj_Qg(_m7JaeTomk=)l!_+yTk^le-`GmOu delta 34176 zcmX7vV`H6d(}mmEwr$(CZQE$vU^m*aZQE(=WXEZ2+l}qF_w)XN>&rEBu9;)4>7EB0 zo(HR^Mh47P)@z^^pH!4#b(O8!;$>N+S+v5K5f8RrQ+Qv0_oH#e!pI2>yt4ij>fI9l zW&-hsVAQg%dpn3NRy$kb_vbM2sr`>bZ48b35m{D=OqX;p8A${^Dp|W&J5mXvUl#_I zN!~GCBUzj~C%K?<7+UZ_q|L)EGG#_*2Zzko-&Kck)Qd2%CpS3{P1co1?$|Sj1?E;PO z7alI9$X(MDly9AIEZ-vDLhpAKd1x4U#w$OvBtaA{fW9)iD#|AkMrsSaNz(69;h1iM1#_ z?u?O_aKa>vk=j;AR&*V-p3SY`CI}Uo%eRO(Dr-Te<99WQhi>y&l%UiS%W2m(d#woD zW?alFl75!1NiUzVqgqY98fSQNjhX3uZ&orB08Y*DFD;sjIddWoJF;S_@{Lx#SQk+9 zvSQ-620z0D7cy8-u_7u?PqYt?R0m2k%PWj%V(L|MCO(@3%l&pzEy7ijNv(VXU9byn z@6=4zL|qk*7!@QWd9imT9i%y}1#6+%w=s%WmsHbw@{UVc^?nL*GsnACaLnTbr9A>B zK)H-$tB`>jt9LSwaY+4!F1q(YO!E7@?SX3X-Ug4r($QrmJnM8m#;#LN`kE>?<{vbCZbhKOrMpux zTU=02hy${;n&ikcP8PqufhT9nJU>s;dyl;&~|Cs+o{9pCu{cRF+0{iyuH~6=tIZXVd zR~pJBC3Hf-g%Y|bhTuGyd~3-sm}kaX5=T?p$V?48h4{h2;_u{b}8s~Jar{39PnL7DsXpxcX#3zx@f9K zkkrw9s2*>)&=fLY{=xeIYVICff2Id5cc*~l7ztSsU@xuXYdV1(lLGZ5)?mXyIDf1- zA7j3P{C5s?$Y-kg60&XML*y93zrir8CNq*EMx)Kw)XA(N({9t-XAdX;rjxk`OF%4-0x?ne@LlBQMJe5+$Ir{Oj`@#qe+_-z!g5qQ2SxKQy1ex_x^Huj%u+S@EfEPP-70KeL@7@PBfadCUBt%`huTknOCj{ z;v?wZ2&wsL@-iBa(iFd)7duJTY8z-q5^HR-R9d*ex2m^A-~uCvz9B-1C$2xXL#>ow z!O<5&jhbM&@m=l_aW3F>vjJyy27gY}!9PSU3kITbrbs#Gm0gD?~Tub8ZFFK$X?pdv-%EeopaGB#$rDQHELW!8bVt`%?&>0 zrZUQ0!yP(uzVK?jWJ8^n915hO$v1SLV_&$-2y(iDIg}GDFRo!JzQF#gJoWu^UW0#? z*OC-SPMEY!LYY*OO95!sv{#-t!3Z!CfomqgzFJld>~CTFKGcr^sUai5s-y^vI5K={ z)cmQthQuKS07e8nLfaIYQ5f}PJQqcmokx?%yzFH*`%k}RyXCt1Chfv5KAeMWbq^2MNft;@`hMyhWg50(!jdAn;Jyx4Yt)^^DVCSu?xRu^$*&&=O6#JVShU_N3?D)|$5pyP8A!f)`| z>t0k&S66T*es5(_cs>0F=twYJUrQMqYa2HQvy)d+XW&rai?m;8nW9tL9Ivp9qi2-` zOQM<}D*g`28wJ54H~1U!+)vQh)(cpuf^&8uteU$G{9BUhOL| zBX{5E1**;hlc0ZAi(r@)IK{Y*ro_UL8Ztf8n{Xnwn=s=qH;fxkK+uL zY)0pvf6-iHfX+{F8&6LzG;&d%^5g`_&GEEx0GU=cJM*}RecV-AqHSK@{TMir1jaFf&R{@?|ieOUnmb?lQxCN!GnAqcii9$ z{a!Y{Vfz)xD!m2VfPH=`bk5m6dG{LfgtA4ITT?Sckn<92rt@pG+sk>3UhTQx9ywF3 z=$|RgTN<=6-B4+UbYWxfQUOe8cmEDY3QL$;mOw&X2;q9x9qNz3J97)3^jb zdlzkDYLKm^5?3IV>t3fdWwNpq3qY;hsj=pk9;P!wVmjP|6Dw^ez7_&DH9X33$T=Q{>Nl zv*a*QMM1-2XQ)O=3n@X+RO~S`N13QM81^ZzljPJIFBh%x<~No?@z_&LAl)ap!AflS zb{yFXU(Uw(dw%NR_l7%eN2VVX;^Ln{I1G+yPQr1AY+0MapBnJ3k1>Zdrw^3aUig*! z?xQe8C0LW;EDY(qe_P!Z#Q^jP3u$Z3hQpy^w7?jI;~XTz0ju$DQNc4LUyX}+S5zh> zGkB%~XU+L?3pw&j!i|x6C+RyP+_XYNm9`rtHpqxvoCdV_MXg847oHhYJqO+{t!xxdbsw4Ugn($Cwkm^+36&goy$vkaFs zrH6F29eMPXyoBha7X^b+N*a!>VZ<&Gf3eeE+Bgz7PB-6X7 z_%2M~{sTwC^iQVjH9#fVa3IO6E4b*S%M;#WhHa^L+=DP%arD_`eW5G0<9Tk=Ci?P@ z6tJXhej{ZWF=idj32x7dp{zmQY;;D2*11&-(~wifGXLmD6C-XR=K3c>S^_+x!3OuB z%D&!EOk;V4Sq6eQcE{UEDsPMtED*;qgcJU^UwLwjE-Ww54d73fQ`9Sv%^H>juEKmxN+*aD=0Q+ZFH1_J(*$~9&JyUJ6!>(Nj zi3Z6zWC%Yz0ZjX>thi~rH+lqv<9nkI3?Ghn7@!u3Ef){G(0Pvwnxc&(YeC=Kg2-7z zr>a^@b_QClXs?Obplq@Lq-l5>W);Y^JbCYk^n8G`8PzCH^rnY5Zk-AN6|7Pn=oF(H zxE#8LkI;;}K7I^UK55Z)c=zn7OX_XVgFlEGSO}~H^y|wd7piw*b1$kA!0*X*DQ~O` z*vFvc5Jy7(fFMRq>XA8Tq`E>EF35{?(_;yAdbO8rrmrlb&LceV%;U3haVV}Koh9C| zTZnR0a(*yN^Hp9u*h+eAdn)d}vPCo3k?GCz1w>OOeme(Mbo*A7)*nEmmUt?eN_vA; z=~2}K_}BtDXJM-y5fn^v>QQo+%*FdZQFNz^j&rYhmZHgDA-TH47#Wjn_@iH4?6R{J z%+C8LYIy>{3~A@|y4kN8YZZp72F8F@dOZWp>N0-DyVb4UQd_t^`P)zsCoygL_>>x| z2Hyu7;n(4G&?wCB4YVUIVg0K!CALjRsb}&4aLS|}0t`C}orYqhFe7N~h9XQ_bIW*f zGlDCIE`&wwyFX1U>}g#P0xRRn2q9%FPRfm{-M7;}6cS(V6;kn@6!$y06lO>8AE_!O z{|W{HEAbI0eD$z9tQvWth7y>qpTKQ0$EDsJkQxAaV2+gE28Al8W%t`Pbh zPl#%_S@a^6Y;lH6BfUfZNRKwS#x_keQ`;Rjg@qj zZRwQXZd-rWngbYC}r6X)VCJ-=D54A+81%(L*8?+&r7(wOxDSNn!t(U}!;5|sjq zc5yF5$V!;%C#T+T3*AD+A({T)#p$H_<$nDd#M)KOLbd*KoW~9E19BBd-UwBX1<0h9 z8lNI&7Z_r4bx;`%5&;ky+y7PD9F^;Qk{`J@z!jJKyJ|s@lY^y!r9p^75D)_TJ6S*T zLA7AA*m}Y|5~)-`cyB+lUE9CS_`iB;MM&0fX**f;$n($fQ1_Zo=u>|n~r$HvkOUK(gv_L&@DE0b4#ya{HN)8bNQMl9hCva zi~j0v&plRsp?_zR zA}uI4n;^_Ko5`N-HCw_1BMLd#OAmmIY#ol4M^UjLL-UAat+xA+zxrFqKc@V5Zqan_ z+LoVX-Ub2mT7Dk_ z<+_3?XWBEM84@J_F}FDe-hl@}x@v-s1AR{_YD!_fMgagH6s9uyi6pW3gdhauG>+H? zi<5^{dp*5-9v`|m*ceT&`Hqv77oBQ+Da!=?dDO&9jo;=JkzrQKx^o$RqAgzL{ zjK@n)JW~lzxB>(o(21ibI}i|r3e;17zTjdEl5c`Cn-KAlR7EPp84M@!8~CywES-`mxKJ@Dsf6B18_!XMIq$Q3rTDeIgJ3X zB1)voa#V{iY^ju>*Cdg&UCbx?d3UMArPRHZauE}c@Fdk;z85OcA&Th>ZN%}=VU%3b9={Q(@M4QaeuGE(BbZ{U z?WPDG+sjJSz1OYFpdImKYHUa@ELn%n&PR9&I7B$<-c3e|{tPH*u@hs)Ci>Z@5$M?lP(#d#QIz}~()P7mt`<2PT4oHH}R&#dIx4uq943D8gVbaa2&FygrSk3*whGr~Jn zR4QnS@83UZ_BUGw;?@T zo5jA#potERcBv+dd8V$xTh)COur`TQ^^Yb&cdBcesjHlA3O8SBeKrVj!-D3+_p6%P zP@e{|^-G-C(}g+=bAuAy8)wcS{$XB?I=|r=&=TvbqeyXiuG43RR>R72Ry7d6RS;n^ zO5J-QIc@)sz_l6%Lg5zA8cgNK^GK_b-Z+M{RLYk5=O|6c%!1u6YMm3jJg{TfS*L%2 zA<*7$@wgJ(M*gyTzz8+7{iRP_e~(CCbGB}FN-#`&1ntct@`5gB-u6oUp3#QDxyF8v zOjxr}pS{5RpK1l7+l(bC)0>M;%7L?@6t}S&a zx0gP8^sXi(g2_g8+8-1~hKO;9Nn%_S%9djd*;nCLadHpVx(S0tixw2{Q}vOPCWvZg zjYc6LQ~nIZ*b0m_uN~l{&2df2*ZmBU8dv`#o+^5p>D5l%9@(Y-g%`|$%nQ|SSRm0c zLZV)45DS8d#v(z6gj&6|ay@MP23leodS8-GWIMH8_YCScX#Xr)mbuvXqSHo*)cY9g z#Ea+NvHIA)@`L+)T|f$Etx;-vrE3;Gk^O@IN@1{lpg&XzU5Eh3!w;6l=Q$k|%7nj^ z|HGu}c59-Ilzu^w<93il$cRf@C(4Cr2S!!E&7#)GgUH@py?O;Vl&joXrep=2A|3Vn zH+e$Ctmdy3B^fh%12D$nQk^j|v=>_3JAdKPt2YVusbNW&CL?M*?`K1mK*!&-9Ecp~>V1w{EK(429OT>DJAV21fG z=XP=%m+0vV4LdIi#(~XpaUY$~fQ=xA#5?V%xGRr_|5WWV=uoG_Z&{fae)`2~u{6-p zG>E>8j({w7njU-5Lai|2HhDPntQ(X@yB z9l?NGoKB5N98fWrkdN3g8ox7Vic|gfTF~jIfXkm|9Yuu-p>v3d{5&hC+ZD%mh|_=* zD5v*u(SuLxzX~owH!mJQi%Z=ALvdjyt9U6baVY<88B>{HApAJ~>`buHVGQd%KUu(d z5#{NEKk6Vy08_8*E(?hqZe2L?P2$>!0~26N(rVzB9KbF&JQOIaU{SumX!TsYzR%wB z<5EgJXDJ=1L_SNCNZcBWBNeN+Y`)B%R(wEA?}Wi@mp(jcw9&^1EMSM58?68gwnXF` zzT0_7>)ep%6hid-*DZ42eU)tFcFz7@bo=<~CrLXpNDM}tv*-B(ZF`(9^RiM9W4xC%@ZHv=>w(&~$Wta%)Z;d!{J;e@z zX1Gkw^XrHOfYHR#hAU=G`v43E$Iq}*gwqm@-mPac0HOZ0 zVtfu7>CQYS_F@n6n#CGcC5R%4{+P4m7uVlg3axX}B(_kf((>W?EhIO&rQ{iUO$16X zv{Abj3ZApUrcar7Ck}B1%RvnR%uocMlKsRxV9Qqe^Y_5C$xQW@9QdCcF%W#!zj;!xWc+0#VQ*}u&rJ7)zc+{vpw+nV?{tdd&Xs`NV zKUp|dV98WbWl*_MoyzM0xv8tTNJChwifP!9WM^GD|Mkc75$F;j$K%Y8K@7?uJjq-w zz*|>EH5jH&oTKlIzueAN2926Uo1OryC|CmkyoQZABt#FtHz)QmQvSX35o`f z<^*5XXxexj+Q-a#2h4(?_*|!5Pjph@?Na8Z>K%AAjNr3T!7RN;7c)1SqAJfHY|xAV z1f;p%lSdE8I}E4~tRH(l*rK?OZ>mB4C{3e%E-bUng2ymerg8?M$rXC!D?3O}_mka? zm*Y~JMu+_F7O4T;#nFv)?Ru6 z92r|old*4ZB$*6M40B;V&2w->#>4DEu0;#vHSgXdEzm{+VS48 z7U1tVn#AnQ3z#gP26$!dmS5&JsXsrR>~rWA}%qd{92+j zu+wYAqrJYOA%WC9nZ>BKH&;9vMSW_59z5LtzS4Q@o5vcrWjg+28#&$*8SMYP z!l5=|p@x6YnmNq>23sQ(^du5K)TB&K8t{P`@T4J5cEFL@qwtsCmn~p>>*b=37y!kB zn6x{#KjM{S9O_otGQub*K)iIjtE2NfiV~zD2x{4r)IUD(Y8%r`n;#)ujIrl8Sa+L{ z>ixGoZJ1K@;wTUbRRFgnltN_U*^EOJS zRo4Y+S`cP}e-zNtdl^S5#%oN#HLjmq$W^(Y6=5tM#RBK-M14RO7X(8Gliy3+&9fO; zXn{60%0sWh1_g1Z2r0MuGwSGUE;l4TI*M!$5dm&v9pO7@KlW@j_QboeDd1k9!7S)jIwBza-V#1)(7ht|sjY}a19sO!T z2VEW7nB0!zP=Sx17-6S$r=A)MZikCjlQHE)%_Ka|OY4+jgGOw=I3CM`3ui^=o0p7u z?xujpg#dRVZCg|{%!^DvoR*~;QBH8ia6%4pOh<#t+e_u!8gjuk_Aic=|*H24Yq~Wup1dTRQs0nlZOy+30f16;f7EYh*^*i9hTZ`h`015%{i|4 z?$7qC3&kt#(jI#<76Biz=bl=k=&qyaH>foM#zA7}N`Ji~)-f-t&tR4^do)-5t?Hz_Q+X~S2bZx{t+MEjwy3kGfbv(ij^@;=?H_^FIIu*HP_7mpV)NS{MY-Rr7&rvWo@Wd~{Lt!8|66rq`GdGu% z@<(<7bYcZKCt%_RmTpAjx=TNvdh+ZiLkMN+hT;=tC?%vQQGc7WrCPIYZwYTW`;x|N zrlEz1yf95FiloUU^(onr3A3>+96;;6aL?($@!JwiQ2hO|^i)b4pCJ7-y&a~B#J`#FO!3uBp{5GBvM2U@K85&o0q~6#LtppE&cVY z3Bv{xQ-;i}LN-60B2*1suMd=Fi%Y|7@52axZ|b=Wiwk^5eg{9X4}(q%4D5N5_Gm)` zg~VyFCwfkIKW(@@ZGAlTra6CO$RA_b*yz#){B82N7AYpQ9)sLQfhOAOMUV7$0|d$=_y&jl>va$3u-H z_+H*|UXBPLe%N2Ukwu1*)kt!$Y>(IH3`YbEt; znb1uB*{UgwG{pQnh>h@vyCE!6B~!k}NxEai#iY{$!_w54s5!6jG9%pr=S~3Km^EEA z)sCnnau+ZY)(}IK#(3jGGADw8V7#v~<&y5cF=5_Ypkrs3&7{}%(4KM7) zuSHVqo~g#1kzNwXc39%hL8atpa1Wd#V^uL=W^&E)fvGivt)B!M)?)Y#Ze&zU6O_I?1wj)*M;b*dE zqlcwgX#eVuZj2GKgBu@QB(#LHMd`qk<08i$hG1@g1;zD*#(9PHjVWl*5!;ER{Q#A9 zyQ%fu<$U?dOW=&_#~{nrq{RRyD8upRi}c-m!n)DZw9P>WGs>o1vefI}ujt_`O@l#Z z%xnOt4&e}LlM1-0*dd?|EvrAO-$fX8i{aTP^2wsmSDd!Xc9DxJB=x1}6|yM~QQPbl z0xrJcQNtWHgt*MdGmtj%x6SWYd?uGnrx4{m{6A9bYx`m z$*UAs@9?3s;@Jl19%$!3TxPlCkawEk12FADYJClt0N@O@Pxxhj+Kk(1jK~laR0*KGAc7%C4nI^v2NShTc4#?!p{0@p0T#HSIRndH;#Ts0YECtlSR}~{Uck+keoJq6iH)(Zc~C!fBe2~4(Wd> zR<4I1zMeW$<0xww(@09!l?;oDiq zk8qjS9Lxv$<5m#j(?4VLDgLz;8b$B%XO|9i7^1M;V{aGC#JT)c+L=BgCfO5k>CTlI zOlf~DzcopV29Dajzt*OcYvaUH{UJPaD$;spv%>{y8goE+bDD$~HQbON>W*~JD`;`- zZEcCPSdlCvANe z=?|+e{6AW$f(H;BND>uy1MvQ`pri>SafK5bK!YAE>0URAW9RS8#LWUHBOc&BNQ9T+ zJpg~Eky!u!9WBk)!$Z?!^3M~o_VPERYnk1NmzVYaGH;1h+;st==-;jzF~2LTn+x*k zvywHZg7~=aiJe=OhS@U>1fYGvT1+jsAaiaM;) zay2xsMKhO+FIeK?|K{G4SJOEt*eX?!>K8jpsZWW8c!X|JR#v(1+Ey5NM^TB1n|_40 z@Db2gH}PNT+3YEyqXP8U@)`E|Xat<{K5K;eK7O0yV72m|b!o43!e-!P>iW>7-9HN7 zmmc7)JX0^lPzF#>$#D~nU^3f!~Q zQWly&oZEb1847&czU;dg?=dS>z3lJkADL1innNtE(f?~OxM`%A_PBp?Lj;zDDomf$ z;|P=FTmqX|!sHO6uIfCmh4Fbgw@`DOn#`qAPEsYUiBvUlw zevH{)YWQu>FPXU$%1!h*2rtk_J}qNkkq+StX8Wc*KgG$yH#p-kcD&)%>)Yctb^JDB zJe>=!)5nc~?6hrE_3n^_BE<^;2{}&Z>Dr)bX>H{?kK{@R)`R5lnlO6yU&UmWy=d03 z*(jJIwU3l0HRW1PvReOb|MyZT^700rg8eFp#p<3Et%9msiCxR+jefK%x81+iN0=hG z;<`^RUVU+S)Iv-*5y^MqD@=cp{_cP4`s=z)Ti3!Bf@zCmfpZTwf|>|0t^E8R^s`ad z5~tA?0x7OM{*D;zb6bvPu|F5XpF11`U5;b*$p zNAq7E6c=aUnq>}$JAYsO&=L^`M|DdSSp5O4LA{|tO5^8%Hf1lqqo)sj=!aLNKn9(3 zvKk($N`p`f&u+8e^Z-?uc2GZ_6-HDQs@l%+pWh!|S9+y3!jrr3V%cr{FNe&U6(tYs zLto$0D+2}K_9kuxgFSeQ!EOXjJtZ$Pyl_|$mPQ9#fES=Sw8L% zO7Jij9cscU)@W+$jeGpx&vWP9ZN3fLDTp zaYM$gJD8ccf&g>n?a56X=y zec%nLN`(dVCpSl9&pJLf2BN;cR5F0Nn{(LjGe7RjFe7efp3R_2JmHOY#nWEc2TMhMSj5tBf-L zlxP3sV`!?@!mRnDTac{35I7h@WTfRjRiFw*Q*aD8)n)jdkJC@)jD-&mzAdK6Kqdct8P}~dqixq;n zjnX!pb^;5*Rr?5ycT7>AB9)RED^x+DVDmIbHKjcDv2lHK;apZOc=O@`4nJ;k|iikKk66v4{zN#lmSn$lh z_-Y3FC)iV$rFJH!#mNqWHF-DtSNbI)84+VLDWg$ph_tkKn_6+M1RZ!)EKaRhY={el zG-i@H!fvpH&4~$5Q+zHU(Ub=;Lzcrc3;4Cqqbr$O`c5M#UMtslK$3r+Cuz>xKl+xW?`t2o=q`1djXC=Q6`3C${*>dm~I{ z(aQH&Qd{{X+&+-4{epSL;q%n$)NOQ7kM}ea9bA++*F+t$2$%F!U!U}(&y7Sd0jQMV zkOhuJ$+g7^kb<`jqFiq(y1-~JjP13J&uB=hfjH5yAArMZx?VzW1~>tln~d5pt$uWR~TM!lIg+D)prR zocU0N2}_WTYpU`@Bsi1z{$le`dO{-pHFQr{M}%iEkX@0fv!AGCTcB90@e|slf#unz z*w4Cf>(^XI64l|MmWih1g!kwMJiifdt4C<5BHtaS%Ra>~3IFwjdu;_v*7BL|fPu+c zNp687`{}e@|%)5g4U*i=0zlSWXzz=YcZ*&Bg zr$r(SH0V5a%oHh*t&0y%R8&jDI=6VTWS_kJ!^WN!ET@XfEHYG-T1jJsDd`yEgh!^* z+!P62=v`R2=TBVjt=h}|JIg7N^RevZuyxyS+jsk>=iLA52Ak+7L?2$ZDUaWdi1PgB z_;*Uae_n&7o27ewV*y(wwK~8~tU<#Np6UUIx}zW6fR&dKiPq|$A{BwG_-wVfkm+EP zxHU@m`im3cD#fH63>_X`Il-HjZN_hqOVMG;(#7RmI13D-s_>41l|vDH1BglPsNJ+p zTniY{Hwoief+h%C^|@Syep#722=wmcTR7awIzimAcye?@F~f|n<$%=rM+Jkz9m>PF70$)AK@|h_^(zn?!;={;9Zo7{ zBI7O?6!J2Ixxk;XzS~ScO9{K1U9swGvR_d+SkromF040|Slk%$)M;9O_8h0@WPe4= z%iWM^ust8w$(NhO)7*8uq+9CycO$3m-l}O70sBi<4=j0CeE_&3iRUWJkDM$FIfrkR zHG2|hVh3?Nt$fdI$W?<|Qq@#hjDijk@7eUr1&JHYI>(_Q4^3$+Zz&R)Z`WqhBIvjo zX#EbA8P0Qla-yACvt)%oAVHa#kZi3Y8|(IOp_Z6J-t{)98*OXQ#8^>vTENsV@(M}^ z(>8BXw`{+)BfyZB!&85hT0!$>7$uLgp9hP9M7v=5@H`atsri1^{1VDxDqizj46-2^ z?&eA9udH#BD|QY2B7Zr$l;NJ-$L!u8G{MZoX)~bua5J=0p_JnM`$(D4S!uF}4smWq zVo%kQ~C~X?cWCH zo4s#FqJ)k|D{c_ok+sZ8`m2#-Uk8*o)io`B+WTD0PDA!G`DjtibftJXhPVjLZj~g& z=MM9nF$7}xvILx}BhM;J-Xnz0=^m1N2`Mhn6@ct+-!ijIcgi6FZ*oIPH(tGYJ2EQ0 z{;cjcc>_GkAlWEZ2zZLA_oa-(vYBp7XLPbHCBcGH$K9AK6nx}}ya%QB2=r$A;11*~ z_wfru1SkIQ0&QUqd)%eAY^FL!G;t@7-prQ|drDn#yDf%Uz8&kGtrPxKv?*TqkC(}g zUx10<;3Vhnx{gpWXM8H zKc0kkM~gIAts$E!X-?3DWG&^knj4h(q5(L;V81VWyC@_71oIpXfsb0S(^Js#N_0E} zJ%|XX&EeVPyu}? zz~(%slTw+tcY3ZMG$+diC8zed=CTN}1fB`RXD_v2;{evY z@MCG$l9Az+F()8*SqFyrg3jrN7k^x3?;A?L&>y{ZUi$T8!F7Dv8s}}4r9+Wo0h^m= zAob@CnJ;IR-{|_D;_w)? zcH@~&V^(}Ag}%A90);X2AhDj(-YB>$>GrW1F4C*1S5`u@N{T|;pYX1;E?gtBbPvS* zlv3r#rw2KCmLqX0kGT8&%#A6Sc(S>apOHtfn+UdYiN4qPawcL{Sb$>&I)Ie>Xs~ej z7)a=-92!sv-A{-7sqiG-ysG0k&beq6^nX1L!Fs$JU#fsV*CbsZqBQ|y z{)}zvtEwO%(&mIG|L?qs2Ou1rqTZHV@H+sm8Nth(+#dp0DW4VXG;;tCh`{BpY)THY z_10NNWpJuzCG%Q@#Aj>!v7Eq8eI6_JK3g2CsB2jz)2^bWiM{&U8clnV7<2?Qx5*k_ zl9B$P@LV7Sani>Xum{^yJ6uYxM4UHnw4zbPdM|PeppudXe}+OcX z!nr!xaUA|xYtA~jE|436iL&L={H3e}H`M1;2|pLG)Z~~Ug9X%_#D!DW>w}Es!D{=4 zxRPBf5UWm2{}D>Em;v43miQ~2{>%>O*`wA{7j;yh;*DV=C-bs;3p{AD;>VPcn>E;V zLgtw|Y{|Beo+_ABz`lofH+cdf33LjIf!RdcW~wWgmsE%2yCQGbst4TS_t%6nS8a+m zFEr<|9TQzQC@<(yNN9GR4S$H-SA?xiLIK2O2>*w-?cdzNPsG4D3&%$QOK{w)@Dk}W z|3_Z>U`XBu7j6Vc=es(tz}c7k4al1$cqDW4a~|xgE9zPX(C`IsN(QwNomzsBOHqjd zi{D|jYSv5 zC>6#uB~%#!!*?zXW`!yHWjbjwm!#eo3hm;>nJ!<`ZkJamE6i>>WqkoTpbm(~b%G_v z`t3Z#ERips;EoA_0c?r@WjEP|ulD+hue5r8946Sd0kuBD$A!=dxigTZn)u3>U;Y8l zX9j(R*(;;i&HrB&M|Xnitzf@><3#)aKy=bFCf5Hz@_);{nlL?J!U>%fL$Fk~Ocs3& zB@-Ek%W>h9#$QIYg07&lS_CG3d~LrygXclO!Ws-|PxMsn@n{?77wCaq?uj`dd7lllDCGd?ed&%5k{RqUhiN1u&?uz@Fq zNkv_4xmFcl?vs>;emR1R<$tg;*Ayp@rl=ik z=x2Hk zJqsM%++e|*+#camAiem6f;3-khtIgjYmNL0x|Mz|y{r{6<@_&a7^1XDyE>v*uo!qF zBq^I8PiF#w<-lFvFx9xKoi&0j)4LX~rWsK$%3hr@ebDv^($$T^4m4h#Q-(u*Mbt6F zE%y0Fvozv=WAaTj6EWZ)cX{|9=AZDvPQuq>2fUkU(!j1GmdgeYLX`B0BbGK(331ME zu3yZ3jQ@2)WW5!C#~y}=q5Av=_;+hNi!%gmY;}~~e!S&&^{4eJuNQ2kud%Olf8TRI zW-Dze987Il<^!hCO{AR5tLW{F1WLuZ>nhPjke@CSnN zzoW{m!+PSCb7byUf-1b;`{0GU^zg7b9c!7ueJF`>L;|akVzb&IzoLNNEfxp7b7xMN zKs9QG6v@t7X)yYN9}3d4>*ROMiK-Ig8(Do$3UI&E}z!vcH2t(VIk-cLyC-Y%`)~>Ce23A=dQsc<( ziy;8MmHki+5-(CR8$=lRt{(9B9W59Pz|z0^;`C!q<^PyE$KXt!KibFH*xcB9V%xTD zn;YlZ*tTukwr$(mWMka@|8CW-J8!zCXI{P1-&=wSvZf&%9SZ7m`1&2^nV#D z6T*)`Mz3wGUC69Fg0Xk!hwY}ykk!TE%mr57TLX*U4ygwvM^!#G`HYKLIN>gT;?mo% zAxGgzSnm{}vRG}K)8n(XjG#d+IyAFnozhk|uwiey(p@ zu>j#n4C|Mhtd=0G?Qn5OGh{{^MWR)V*geNY8d)py)@5a85G&_&OSCx4ASW8g&AEXa zC}^ET`eORgG*$$Q1L=9_8MCUO4Mr^1IA{^nsB$>#Bi(vN$l8+p(U^0dvN_{Cu-UUm zQyJc!8>RWp;C3*2dGp49QVW`CRR@no(t+D|@nl138lu@%c1VCy3|v4VoKZ4AwnnjF z__8f$usTzF)TQ$sQ^|#(M}-#0^3Ag%A0%5vA=KK$37I`RY({kF-z$(P50pf3_20YTr%G@w+bxE_V+Tt^YHgrlu$#wjp7igF!=o8e2rqCs|>XM9+M7~TqI&fcx z=pcX6_MQQ{TIR6a0*~xdgFvs<2!yaA1F*4IZgI!)xnzJCwsG&EElg_IpFbrT}nr)UQy}GiK;( zDlG$cksync34R3J^FqJ=={_y9x_pcd%$B*u&vr7^ItxqWFIAkJgaAQiA)pioK1JQ| zYB_6IUKc$UM*~f9{Xzw*tY$pUglV*?BDQuhsca*Fx!sm`9y`V&?lVTH%%1eJ74#D_ z7W+@8@7LAu{aq)sPys{MM~;`k>T%-wPA)E2QH7(Z4XEUrQ5YstG`Uf@w{n_Oc!wem z7=8z;k$N{T74B*zVyJI~4d60M09FYG`33;Wxh=^Ixhs69U_SG_deO~_OUO1s9K-8p z5{HmcXAaKqHrQ@(t?d@;63;Pnj2Kk<;Hx=kr>*Ko`F*l){%GVDj5nkohSU)B&5Vrc zo0u%|b%|VITSB)BXTRPQC=Bv=qplloSI#iKV#~z#t#q*jcS`3s&w-z^m--CYDI7n2 z%{LHFZ*(1u4DvhES|Dc*n%JL8%8?h7boNf|qxl8D)np@5t~VORwQn)TuSI07b-T=_ zo8qh+0yf|-6=x;Ra$w&WeVZhUO%3v6Ni*}i&sby3s_(?l5Er{K9%0_dE<`7^>8mLr zZ|~l#Bi@5}8{iZ$(d9)!`}@2~#sA~?uH|EbrJQcTw|ssG)MSJJIF96-_gf&* zy~I&$m6e0nnLz^M2;G|IeUk?s+afSZ){10*P~9W%RtYeSg{Nv5FG<2QaWpj?d`;}<4( z>V1i|wNTpH`jJtvTD0C3CTws410U9HS_%Ti2HaB~%^h6{+$@5`K9}T=eQL;dMZ?=Y zX^z?B3ZU_!E^OW%Z*-+t&B-(kLmDwikb9+F9bj;NFq-XHRB=+L)Rew{w|7p~7ph{#fRT}}K zWA)F7;kJBCk^aFILnkV^EMs=B~#qh*RG2&@F|x2$?7QTX_T6qL?i$c6J*-cNQC~E6dro zR)CGIoz;~V?=>;(NF4dihkz~Koqu}VNPE9^R{L@e6WkL{fK84H?C*uvKkO(!H-&y( zq|@B~juu*x#J_i3gBrS0*5U*%NDg+Ur9euL*5QaF^?-pxxieMM6k_xAP;S}sfKmIa zj(T6o{4RfARHz25YWzv=QaJ4P!O$LHE(L~6fB89$`6+olZR!#%y?_v+Cf+g)5#!ZM zkabT-y%v|ihYuV}Y%-B%pxL264?K%CXlbd_s<GY5BG*`kYQjao$QHiC_qPk5uE~AO+F=eOtTWJ1vm*cU(D5kvs3kity z$IYG{$L<8|&I>|WwpCWo5K3!On`)9PIx(uWAq>bSQTvSW`NqgprBIuV^V>C~?+d(w$ZXb39Vs`R=BX;4HISfN^qW!{4 z^amy@Nqw6oqqobiNlxzxU*z2>2Q;9$Cr{K;*&l!;Y??vi^)G|tefJG9utf|~4xh=r3UjmRlADyLC*i`r+m;$7?7*bL!oR4=yU<8<-3XVA z%sAb`xe&4RV(2vj+1*ktLs<&m~mGJ@RuJ)1c zLxZyjg~*PfOeAm8R>7e&#FXBsfU_?azU=uxBm=E6z7FSr7J>{XY z1qUT>dh`X(zHRML_H-7He^P_?148AkDqrb>;~1M-k+xHVy>;D7p!z=XBgxMGQX2{* z-xMCOwS33&K^~3%#k`eIjKWvNe1f3y#}U4;J+#-{;=Xne^6+eH@eGJK#i|`~dgV5S zdn%`RHBsC!=9Q=&=wNbV#pDv6rgl?k1wM03*mN`dQBT4K%uRoyoH{e=ZL5E*`~X|T zbKG9aWI}7NGTQtjc3BYDTY3LbkgBNSHG$5xVx8gc@dEuJqT~QPBD=Scf53#kZzZ6W zM^$vkvMx+-0$6R^{{hZ2qLju~e85Em>1nDcRN3-Mm7x;87W#@RSIW9G>TT6Q{4e~b z8DN%n83FvXWdpr|I_8TaMv~MCqq0TA{AXYO-(~l=ug42gpMUvOjG_pWSEdDJ2Bxqz z!em;9=7y3HW*XUtK+M^)fycd8A6Q@B<4biGAR)r%gQf>lWI%WmMbij;un)qhk$bff zQxb{&L;`-1uvaCE7Fm*83^0;!QA5-zeSvKY}WjbwE68)jqnOmj^CTBHaD zvK6}Mc$a39b~Y(AoS|$%ePoHgMjIIux?;*;=Y|3zyfo)^fM=1GBbn7NCuKSxp1J|z zC>n4!X_w*R8es1ofcPrD>%e=E*@^)7gc?+JC@mJAYsXP;10~gZv0!Egi~){3mjVzs z^PrgddFewu>Ax_G&tj-!L=TuRl0FAh#X0gtQE#~}(dSyPO=@7yd zNC6l_?zs_u5&x8O zQ|_JvKf!WHf43F0R%NQwGQi-Dy7~PGZ@KRKMp?kxlaLAV=X{UkKgaTu2!qzPi8aJ z-;n$}unR?%uzCkMHwb56T%IUV)h>qS(XiuRLh3fdlr!Cri|{fZf0x9GVYUOlsKgxLA7vHrkpQddcSsg4JfibzpB zwR!vYiL)7%u8JG7^x@^px(t-c_Xt|9Dm)C@_zGeW_3nMLZBA*9*!fLTV$Uf1a0rDt zJI@Z6pdB9J(a|&T_&AocM2WLNB;fpLnlOFtC9yE6cb39?*1@wy8UgruTtX?@=<6YW zF%82|(F7ANWQ`#HPyPqG6~ggFlhJW#R>%p@fzrpL^K)Kbwj(@#7s97r`)iJ{&-ToR z$7(mQI@~;lwY+8dSKP~0G|#sjL2lS0LQP3Oe=>#NZ|JKKYd6s6qwe#_6Xz_^L4PJ5TM_|#&~zy= zabr|kkr3Osj;bPz`B0s;c&kzzQ2C8|tC9tz;es~zr{hom8bT?t$c|t;M0t2F{xI;G z`0`ADc_nJSdT`#PYCWu4R0Rmbk#PARx(NBfdU>8wxzE(`jA}atMEsaG6zy8^^nCu| z9_tLj90r-&Xc~+p%1vyt>=q_hQsDYB&-hPj(-OGxFpesWm;A(Lh>UWy4SH9&+mB(A z2jkTQ2C&o(Q4wC_>|c()M8_kF?qKhNB+PW6__;U+?ZUoDp2GNr<|*j(CC*#v0{L2E zgVBw6|3c(~V4N*WgJsO(I3o>8)EO5;p7Xg8yU&%rZ3QSRB6Ig6MK7Wn5r+xo2V}fM z0QpfDB9^xJEi}W*Fv6>=p4%@eP`K5k%kCE0YF2Eu5L!DM1ZY7wh`kghC^NwxrL}90dRXjQx=H>8 zOWP@<+C!tcw8EL8aCt9{|4aT+x|70i6m*LP*lhp;kGr5f#OwRy`(60LK@rd=to5yk^%N z6MTSk)7)#!cGDV@pbQ>$N8i2rAD$f{8T{QM+|gaj^sBt%24UJGF4ufrG1_Ag$Rn?c zzICg9`ICT>9N_2vqvVG#_lf9IEd%G5gJ_!j)1X#d^KUJBkE9?|K03AEe zo>5Rql|WuUU=LhLRkd&0rH4#!!>sMg@4Wr=z2|}dpOa`4c;_DqN{3Pj`AgSnc;h%# z{ny1lK%7?@rwZO(ZACq#8mL)|vy8tO0d1^4l;^e?hU+zuH%-8Y^5YqM9}sRzr-XC0 zPzY1l($LC-yyy*1@eoEANoTLQAZ2lVto2r7$|?;PPQX`}rbxPDH-a$8ez@J#v0R5n z7P*qT3aHj02*cK)WzZmoXkw?e3XNu&DkElGZ0Nk~wBti%yLh+l2DYx&U1lD_NW_Yt zGN>yOF?u%ksMW?^+~2&p@NoPzk`T)8qifG_owD>@iwI3@u^Y;Mqaa!2DGUKi{?U3d z|Efe=CBc!_ZDoa~LzZr}%;J|I$dntN24m4|1(#&Tw0R}lP`a`?uT;>szf^0mDJx3u z6IJvpeOpS$OV!Xw21p>Xu~MZ(Nas5Iim-#QSLIYSNhYgx1V!AR>b zf5b7O`ITTvW5z%X8|7>&BeEs8~J1i47l;`7Y#MUMReQ4z!IL1rh8UauKNPG?7rV_;#Y zG*6Vrt^SsTMOpV7mkui}l_S8UNOBcYi+DzcMF>YKrs3*(q5fwVCr;_zO?gpGx*@%O zl`KOwYMSUs4e&}eM#FhB3(RIDJ9ZRn6NN{2Nf+ z2jcz%-u6IPq{n7N3wLH{9c+}4G(NyZa`UmDr5c-SPgj0Sy$VN#Vxxr;kF>-P;5k!w zuAdrP(H+v{Dybn78xM6^*Ym@UGxx?L)m}WY#R>6M2zXnPL_M9#h($ECz^+(4HmKN7 zA>E;`AEqouHJd7pegrq4zkk>kHh`TEb`^(_ea;v{?MW3Sr^FXegkqAQPM-h^)$#Jn z?bKbnXR@k~%*?q`TPL=sD8C+n^I#08(}d$H(@Y;3*{~nv4RLZLw`v=1M0-%j>CtT( zTp#U03GAv{RFAtj4vln4#E4eLOvt zs;=`m&{S@AJbcl1q^39VOtmN^Zm(*x(`(SUgF(=6#&^7oA8T_ojX>V5sJx@*cV|29 z)6_%P6}e}`58Sd;LY2cWv~w}fer&_c1&mlY0`YNNk9q=TRg@Khc5E$N`aYng=!afD z@ewAv^jl$`U5;q4OxFM4ab%X_Jv>V!98w$8ZN*`D-)0S7Y^6xW$pQ%g3_lEmW9Ef^ zGmFsQw`E!ATjDvy@%mdcqrD-uiKB}!)ZRwpZRmyu+x|RUXS+oQ*_jIZKAD~U=3B|t zz>9QQr91qJihg9j9rWHww{v@+SYBzCfc0kI=4Gr{ZLcC~mft^EkJ`CMl?8fZ z3G4ix71=2dQ`5QuTOYA0(}f`@`@U<#K?1TI(XO9c*()q!Hf}JUCaUmg#y?ffT9w1g zc)e=JcF-9J`hK{0##K#A>m^@ZFx!$g09WSBdc8O^IdP&JE@O{i0&G!Ztvt{L4q%x& zGE2s!RVi6ZN9)E*(c33HuMf7#X2*VPVThdmrVz-Fyqxcs&aI4DvP#bfW={h$9>K0HsBTUf z2&!G;( z^oOVIYJv~OM=-i`6=r4Z1*hC8Fcf3rI9?;a_rL*nr@zxwKNlxf(-#Kgn@C~4?BdKk zYvL?QcQeDwwR5_S(`sn&{PL6FYxwb-qSh_rUUo{Yi-GZz5rZotG4R<+!PfsGg`MVtomw z5kzOZJrh(#rMR_87KeP0Q=#^5~r_?y1*kN?3Fq% zvnzHw$r!w|Soxz8Nbx2d&{!#w$^Hua%fx!xUbc2SI-<{h>e2I;$rJL)4)hnT5cx^* zIq#+{3;Leun3Xo=C(XVjt_z)F#PIoAw%SqJ=~DMQeB zNWQ={d|1qtlDS3xFik}#j*8%DG0<^6fW~|NGL#P_weHnJ(cYEdJtI9#1-Pa8M}(r{ zwnPJB_qB?IqZw5h!hRwW2WIEb?&F<52Ruxpr77O2K>=t*3&Z@=5(c^Uy&JSph}{Q^ z0Tl|}gt=&vK;Rb9Tx{{jUvhtmF>;~k$8T7kp;EV`C!~FKW|r$n^d6=thh`)^uYgBd zydgnY9&mm$?B@pKK+_QreOm?wnl5l}-wA$RZCZukfC$slxbqv9uKq0o^QeSID96{Rm^084kZ)*`P zk))V~+<4-_7d6<~)PL%!+%JP`Dn23vUpH47h~xnA=B_a}rLy|7U-f0W+fH`{wnyh2 zD$JYdXuygeP5&OAqpl2)BZ|X){~G;E|7{liYf%AZFmXXyA@32qLA)tuuQz`n^iH1Y z=)pAzxK$jw0Xq?7`M`=kN2WeQFhz)p;QhjbKg#SB zP~_Vqo0SGbc5Q;v4Q7vm6_#iT+p9B>%{s`8H}r|hAL5I8Q|ceJAL*eruzD8~_m>fg26HvLpik&#{3Zd#|1C_>l&-RW2nBBzSO zQ3%G{nI*T}jBjr%3fjG*&G#ruH^ioDM>0 zb0vSM8ML?tPU*y%aoCq;V%x%~!W*HaebuDn9qeT*vk0%X>fq-4zrrQf{Uq5zI1rEy zjQ@V|Cp~$AoBu=VgnVl@Yiro>ZF{uB=5)~i1rZzmDTIzLBy`8Too!#Z4nE$Z{~uB( z_=o=gKuhVpy&`}-c&f%**M&(|;2iy+nZy2Su}GOAH_GT9z`!ogwn$+Bi&1ZhtPF zVS&LO5#Bq}cew$kvE7*t8W^{{7&7WaF{upy0mj*K&xbnXvSP9V$6m6cesHGC!&Us36ld9f*Pn8gbJb3`PPT|ZG zri2?uIu09i>6Y-0-8sREOU?WaGke0+rHPb^sp;*E{Z5P7kFJ@RiLZTO`cN2mRR#Nz zxjJ##Nk+Uy-2N-8K_@576L(kJ>$UhP+)|w!SQHkkz+e62*hpzyfmY4eQLZtZUhEdG zIZluDOoPDlt5#iw+2epC3vEATfok^?SDT`TzBwtgKjY z>ZImbO)i~T=IYAfw$3j2mF1Cj*_yqK(qw(U^r-!gcUKvWQrDG@E{lEyWDWOPtA9v{ z5($&mxw{nZWo_Ov??S#Bo1;+YwVfx%M23|o$24Hdf^&4hQeV=Cffa5MMYOu2NZLSC zQ4UxWvn+8%YVGDg(Y*1iHbUyT^=gP*COcE~QkU|&6_3h z-GOS6-@o9+Vd(D7x#NYt{Bvx2`P&ZuCx#^l0bR89Hr6Vm<||c3Waq(KO0eZ zH(|B;X}{FaZ8_4yyWLdK!G_q9AYZcoOY}Jlf3R;%oR5dwR(rk7NqyF%{r>F4s^>li z`R~-fh>YIAC1?%!O?mxLx!dq*=%IRCj;vXX628aZ;+^M0CDFUY0Rc<1P5e(OVX8n- z*1UOrX{J}b2N)6m5&_xw^WSN=Lp$I$T>f8K6|J_bj%ZsIYKNs1$TFt!RuCWF48;98`7D(XPVnk+~~i=U$} zR#;!ZRo4eVqlDxjDeE^3+8)bzG_o~VRwdxqvD^HNh#@o>1My$0*Y_`wfQ$y}az|Uz zM47oEaYNTH?J^w9EVNnvfmmbV+GHDe)Kf;$^@6?9DrSHnk@*{PuJ>ra|9KO!qQ-Fp zNNcZB4ZdAI>jEh@3Mt(E1Fy!^gH-Zx6&lr8%=duIgI^~gC{Q;4yoe;#F7B`w9daIe z{(I;y)=)anc;C;)#P`8H6~iAG_q-4rPJb(6rn4pjclGi6$_L79sFAj#CTv;t@94S6 zz`Id7?k!#3JItckcwOf?sj=Xr6oKvAyt1=jiWN@XBFoW6dw_+c9O9x2i4or?*~8f& zm<>yzc6Aw_E-gsGAa`6`cjK~k^TJt(^`E1^_h)5(8)1kzAsBxjd4+!hJ&&T!qklDN z`?j#za=(^wRCvEI75uE^K#IBe5!5g2XW}|lUqAmdmIQb7xJtP}G9^(=!V`ZS_7#RZ zjXq#Cekw>fE*YS-?Qea|7~H?)bbLK;G&(~%!B@H`o#LYAuu6;-c~jFfjY7GKZ|9~{ zE!`!d@@rhY_@5fDbuQ8gRI~R_vs4%fR5$?yot4hDPJ28k_Wzmc^0yzwMr#*(OXq@g zRUgQmJA?E>3GO=5N8iWIfBP{&QM%!Oa*iwTlbd0Fbm*QCX>oRb*2XfG-=Bz1Qz0$v zn#X!2C!LqE601LEMq;X7`P*5nurdKZAmmsI-zZ|rTH;AFxNDyZ_#hN2m4W(|YB64E z470#yh$;8QzsdA;6vbNvc95HLvZvyT4{C>F(fwy&izvNDuvfO1Z;`Ss#4a_c6pm*{0t|_i9z{@84^lffQa5zG4<{(+p5-S z^>lG-^GJR#V>;5f3~y%n=`U_jBp~WgB0cp;Lx5VZYPYCH&(evw#}AYRlGJ>vcoeVr z3%#-QUBgeH!GB>XLw;rT&oMI9ynP;leDwh4O2uM!oIWo&Qxk{^9#nX&^3GJ z(U~5{S9aw@yHH^yuQGso=~*JOC9Zdi6(TFP+IddkfK5Eu9q;+F9?PPNAe-O;;P_Aa zPJ{Dqa1gQb%dZ|0I{#B0(z|r(qq!A4CxlW92-LwXFjYfOzAT1DDK`9rm4AB~l&oVv zi6_{)M9L1%JP}i52y@`!T9RB~!CRel53wl?amNHqcuElq%hn)|#BPvW5_m51RVb|? zXQ&B*eAD}}QamG>o{?i~usG5X6IDa3+Xkb8w%7;C8|Cln70biA+ZH}fxkH^Wei$vZPnuqIT!Mmy26;mLfU z3Bbv4M^vvMlz-I+46=g>0^wWkmA!hlYj*I!%it^x9Kx(d{L|+L{rW?Y#hLHWJfd5X z>B=Swk8=;mRtIz}Hr3NE_garb5W*!7fnNM{+m2_>!cHZZlNEeof~7M#FBEQ+f&gJ3 z^zv*t?XV)jQi%0-Ra|ISiW-fx)DsK-> zI}Fv%uee$#-1PKJwr=lU89eh=M{>Nk7IlJ)U33U)lLW+OOU%A|9-Lf;`@c*+vX{W2 z{{?0QoP!#?8=5%yL=fP%iF+?n$0#iHz`P;1{Ra6iwr=V7v^8;NoLJ5)QxIyIx>ur?lMwV=mBo0BA?28kMow8SX=Ax5L%S~x4+EQi#Ig`(ht%)D(F#Pa!)SiHy&PvUp32=VtAsR|6|NZR@jkad zX^aEgojf9(-)rNOZ=NVA&a;6Cljkb=H-bY9m^_I)`pBHB16QW)sU27zF13ypefeATJc1Wzy39GrKF{UntHsIU59AdXp?j{eh2R)IbU&omd zk6(qzvE@hve1yM6dgkbz>5HDR&MD~yi$yymQ}?b;RfL$N-#l7(u?T^Wlu+Q;fo|jd zBe^jzGMHY(2=5l?bEIh+zgE$1TEQ&!p3fH;AW`P?W5Hkj3eJnT>dqg! zf~}A*SZU5HHDCbdywQ^l_PqssHRlrySYN=`hAv2sVrtcF!`kyEu%XeeRUTJU7vB%h zY0*)N$mLo6d=tJfe}IPIeiH~>AKwCpkn&WEfYgl?3anq5#-F$6$v-(G_j0*S9mdsn zg@ek_ut4(?+JP_9-n`YqoD(gAz+Ttm1#t za96D}oQR(o=e8wwes19_(p4g(A1vSGwPAp~Hh3hh!fc>u{1E^+^}AzwilFVf6^vbL zc&NnRs`u)N-P|Cu4()yTiuE{j_V&=K?iP!IUBf~ei2}~_KBvUAlXa;R#Wl`gOBtJ$Y5(L))@`riLB)v*r>9*8VfmQt<72?+fdwP{BA@?_qo>mN7yzICUCaeG(+>Rb~8wg~6U(P)NlDLuhQgjbC}=)HuZgC}0Z-qLX4lJ7^)8~!!*qP0=~`Y_(A z{@15*ZevZSI^s|OnpCeCwLXf#tgbq8y~R*GB5anmZ;_N!+-3>!wu@NBFCNJ$#y?{? zMI!?s*=_xA;V&aX)ROxzVW8*de+&P#2zucA|8mksdgCXBsZ*TM=%{L1Tk5LB_*^@&S?O=ot{h)1xRVSn27&Tk8>rF|6ruzYb;Nq) z;qvlmrP^SL$mhe4Ai)xpl6Wx&y;z8o!7-+6$qj;ZLXvfR71I@w(R|6lyuP6v-lP&r z@KK-TEmGQfMmk1c0^fd7!^si}T%b5a2%>T-Drh|^Cf z$}qxIv@zxbmJ#qjK6Q_aGDe{ciVT20V1lW52Xs!}x(4_j)sUXYdm4 zwYC9FOa;X*c*LxL;xE5ov?|?^7gWXyALy_D2GvDo-8%0-Y%9TkkO_Tcr2qIUg3(OC z%3wt?hyn*+e^z%(~2#!2dvMFa$mzgwk1I1X;naFMjXSbnmZ!zd%7u)=cgi z*0&@Scrl&BDfU(9Pks8#;!~v~r7~DN{G6WE&_;7i{{a*?oiCao(l%2ruxX0fAt69e2vLgL%Mf_)!*(Tz zNKW>sW@YB2vBfP>C&L|-pq)Uq^PsG_THu;8iEcqafO?0k$IQp1KyWyOoTxwmKvlc^ zO9$%Tt8;%qQxwy5;CsJ)V}a7I6}SvQ%0_H53Kcqx=m83fIzpLSGgfVe^SPdc*xPdciI5dg}#{Etv$e<)gGD=qm0v=!aN@*?$s zLhzD%4w{vf-g6FHQjG9XyC+4=bewb?Mz%!u8%oP{G9{UJFTLTcCi3R(=Nm&t&Sl(? zr>pj?=ECdDVa}-g%`LF^1EY@>7d}%VhYpKFSDPH)D(zB+gPe1m7E}W>TiW=8L0&(D&YG=0<&7G4Bu{;-#Ud;-1%Ta9V}U6fyK1YX z`Rq|i-X(loPZ)M$H%m@j7bGx>uj~y=0)!t#dc|c}+hT%~Sq>fefez0Ul|jOJHta~u zx7*mV6~Jpt(FkY(pQN91>aFk7VS%Sa^oLaq$*)W?fy`xuFJgH<2s=!Rz}_(qdmdF~ zlr2f=)q_vpi8X;Jq>5^$GweJ{iS`Khw2f)fsvKpgh;U~13a+9 zfaw}UuGiBy;q10pI^Avb#X3D=k_r(T{N;-xA)OM}2Py5L##<96NU*Sr7GQqhfrPej z?;B$Bt_sTxuSAPXfTSC{zr?@$$0iHxC@z*5F52j*PG87hh`0w3At8jPf*rjNE~_Gj z2)fjeUFJ(#l9uWuw&5#@13|AQ1;pdA?EL4YKq0JDR5T8I?aWGxI=J9}vdyH;gQ@iE z>+UnC2iwT0f80-VuE^bY!N@(}9?bOXyy%rTqSNDN4rO4Zt#(kZwcGgTp&3((F+nsd ze~B)%K6oP4WX_w1>|QImC;9q zy}4p+s%^Too2(gE>yo%+yY#F{)phtmNqsJPVQQ0lGR|H9q>aA&AtU4M+EZ%`xvQLb zbigBOc`dL}&j3er?EOI`!W)N#>+uwp_!h^5FspaEylq!e(FPY-6T3~WeNmZ<$?Y6y z-!bM1kD7ZF8xl+Pi6fiv1?)q%`aNxn#pK%)ct||L&Xnf8Gu&3g;Of{B8Pt=u`e+Mn zA(DmU#3cF#Nr7W;X0V4ksFHMcNDAf4G&D8VjLeZ^|5-f$>_|71>P3xuu)?4NJed*w z6GR_RB5HQLzT(h+`Y?-3esxeue{-Q%b+!&o>IJ!#=}#_&q+hwJga>fkt(*(WdoN5vSta z#$mMN6}YzYRpaBZ)j)EL91-oL1(|d(>%UclsTUOyXyWM&(hNqLwqtn`!E>HJM{ zh>M~xa1@*U^cwx-k5QjePr5=B6u*jpJ)C0{C?f7Yga+I^4$TleyX$x&jm9z@c!?cC z<2kY7)p^+W{AXd@l1C09_yB*TG|yzb96BYk z8Wpj81vB>zcR+qM4m~A44w1n7$fxB$-?MV}S?Fh}c_|2FXg`cZ?750i;Cdl-_nGK# zta)h)6!*AsQ-z8caSh)%5JY>_yCeJs~FpAzdY8 zF@SU_hN#~ip5I;UACFzx1v0yf{j97l&)e-=`d#1Kp6A(Kj&HC!%vK!wEdK3HFJ?|6 za;WwUczZ+&<$g!Td^48@lJtfW@doXL#jY6)dK_RDCQAZ}l&OdD+?Yl5-bqpsHZR^( zF{u_cR(x>u(c4i5f(^8!h6CV0#ZxRFhLlunWiGDLO6yoRb(wV<(P^8=fOU7Hp{AHE z;Yg%kg@6&tL3Z*IrbkDeQ$%rbalVP39D@LVrC2xSavnTp%PorXPf1DVzHyqjDsDnS zL=mv0a2s60bHKGQM)ue>npH0SCp;XtZFUzm?R-x7D*(PxMmuJ4J*K2eY&ebe0yQHe zVG&*qe{pot{PM^xQv`H_rn2FcYOrEN+I#uX^1`Id%J$;Hi2cNCU!0Hlc0TjxLzkss zHxmC;hQBu5U4J0XflWM;{uH`_47Sg)QyZ{8D&T0;bdc3{^^<=q7P?C_2E-}PQn>*= z2T5q^J|Q_2+x%Qt`i3m6=6V$)BxIx{2KAFkMb#q`iMCD|L>+}_dYVA$wBr1Zr}YOF z^MMGO@PHGGh>g|^yF`PvvtDwN@kxt?ClLcG<+murHMz1Asj!$l=b)4{d}SqOJ}>Y< zSeAyP@ZEcpx`ayIdp>{--UVLYC_cZZURh_!4u2(*#x@Tk(QJa}4BqqZ$6%LhF-HB~ zAcc?$I6KP}IxANcAteEBX$Ys?T=JB|Fnd3*UAO0mYAXCgWf~?7Z_G7G5`H4;S^QKK zG*2l75vI@DHQC*es>6&|r^#RHKRQ5rwv_l4`!(!I3%)Z$P1fnZ8N@27zyg}54ElO%SjQ_4uujX)4ta@Gz2)_>4b~vX|rhRIH-eqdD zL)xaEpW3K|a>daQRRR*_$W>rWOsW-IE4VQl3L$3}=-PFU)s@XG&9+DFivH-;2&w~$ES_nJZJH!?1mO!CnP)Jb{mW9=f`bDpo^PI6i4|YurK)Q1 z^Ys1oHRdr!$X4RuyR%kgp!a*Lz*_AAoJ$EVAdsNCoPA^VZE1pGO@D3UStACE+%vs6 z$io@E>DmB|3VV~GbOt2oc+K;t zdn3gaFvYz;vRN-+2+Qk{8|O}e86nVck)fZn3sg$j#dLVham{yGkc$I#!HF7mRS%f* z!+NdzG49K(qaO^SBlp@K@D?|^rAq;8{*@kRc4sYSNQmoy7@_RS_ksWl2T_38h2A)# ziU2WXWD03(NqS&Mu*?0-iK8X_Z3w`}c7MPv0qZ7iM|L3xdTnR{y!7{#82$}uJCiGT zqa=8<9L05hu6 z1N+2n7OzT{NEf?gS@eq7@buCDFe9mAxY%THo^b@BHckKK>jg6{@)>n z43cPs%$Qi0iwyZ+{C491>FRu5+6baJ{&XXXC@Sp+b!QE|{7_d?lm5K=B z)myKEcxjFm74+drF|JCYcxdY%ASig#YoRBRUV7An7f-%rqj%PHECbxh#5476cEq@NQL?dI6gUqvS@w zq!WmD(aR0{NxItAZCKDCVw=Zu{9WGDu^i?2g zLerPiOU*HSaXg^3CdOX^F6c9MiHINP339N%)a96`^Z-c#&EogcxMSYo0Cb4{-}q1( zRrJine`P|6WRkm8u4Ja1QRYq$AR>b7tugd#EsT-VmXN-t!TYjZy}i!uKi6$u>EJ?w zvdHZg+hp+5ree?>fdJAX)5#Wtm#2M-{~2jfX2{G`)?D6UD1MevdeeU;;HCi}AtJr( SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4413138c..37f853b1c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a426..b740cf133 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. From 785f7ef7fc75d9133ba88f7fcaa385970b40c65d Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Thu, 27 Feb 2025 12:11:19 +0100 Subject: [PATCH 310/310] Adapting changelog to release --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8f3b05fb..3d62f6fd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased/Snapshot] +## [6.0.0] - 2025-02-27 + ### Added - Enhance `TimeSeriesSource` with method to retrieve all time keys after a given key [#543](https://github.com/ie3-institute/PowerSystemDataModel/issues/543) - Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) @@ -331,7 +333,8 @@ coordinates or multiple exactly equal coordinates possible - CsvDataSource now stops trying to get an operator for empty operator uuid field in entities - CsvDataSource now parsing multiple geoJson strings correctly -[Unreleased/Snapshot]: https://github.com/ie3-institute/powersystemdatamodel/compare/5.1.0...HEAD +[Unreleased/Snapshot]: https://github.com/ie3-institute/powersystemdatamodel/compare/6.0.0...HEAD +[6.0.0]: https://github.com/ie3-institute/powersystemdatamodel/compare/5.1.0...6.0.0 [5.1.0]: https://github.com/ie3-institute/powersystemdatamodel/compare/5.0.1...5.1.0 [5.0.1]: https://github.com/ie3-institute/powersystemdatamodel/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/ie3-institute/powersystemdatamodel/compare/4.1.0...5.0.0