+ LOG.debug("In PceLink {} no OMS present, assume G.652 fiber, calculation based on fiber length of {} km",
+ link.getLinkId(), this.length);
+ return calcCDandPMDfromLength();
+ }
+ Map<LinkConcatenationKey, LinkConcatenation> linkConcatenationMap =
+ this.omsAttributesSpan.nonnullLinkConcatenation();
+ for (Map.Entry<LinkConcatenationKey, LinkConcatenation> entry : linkConcatenationMap.entrySet()) {
+ // If the link-concatenation list is not populated or partially populated CD &
+ // PMD shall be derived from link-length (expressed in km in OR topology)
+ if (entry == null || entry.getValue() == null || entry.getValue().getSRLGLength() == null
+ || entry.getValue().augmentation(LinkConcatenation1.class).getFiberType() == null) {
+ if (this.length > 0.0) {
+ LOG.debug("In PceLink: no OMS present; cd and PMD for the link {} extrapolated from link length {}"
+ + "assuming SMF fiber type", link.getLinkId().getValue(), this.length);
+ return calcCDandPMDfromLength();
+ }
+ // If Link-length upper attributes not present or incorrectly populated, no way
+ // to calculate CD & PMD
+ LOG.error("In PceLink: no Link length declared and no OMS present for the link {}."
+ + " No Way to compute CD and PMD", link.getLinkId().getValue());
+ return Map.of();
+ }
+ // SRLG length is expressed in OR topology in meter
+ var entryAug = entry.getValue().augmentation(LinkConcatenation1.class);
+ linkCd += entry.getValue().getSRLGLength().doubleValue() / 1000.0
+ * retrieveCdFromFiberType(entryAug.getFiberType());
+ if (entryAug.getPmd() == null
+ || entryAug.getPmd().getValue().doubleValue() == 0.0
+ || entryAug.getPmd().getValue().toString().isEmpty()) {
+ linkPmd2 += Math.pow(
+ entry.getValue().getSRLGLength().doubleValue() / 1000.0
+ * retrievePmdFromFiberType(entryAug.getFiberType()),
+ 2);
+ } else {
+ linkPmd2 += Math.pow(entryAug.getPmd().getValue().doubleValue(), 2);
+ }
+ }
+ LOG.debug("In PceLink: The CD and PMD2 of link {} are respectively {} ps and {} ps",
+ link.getLinkId(), linkCd, linkPmd2);
+ return Map.of("CD", linkCd, "PMD2", linkPmd2);
+ }
+
+ // compute default spanLoss and power correction from fiber length
+ // when no OMS attribute defined
+ private Map<String, Double> calcDefaultSpanLoss(Link link) {
+ var augLinkLength = link.augmentation(Link1.class).getLinkLength();
+ if (augLinkLength == null || augLinkLength.doubleValue() == 0) {
+ LOG.error("In PceLink, no link length present or length declared = 0,"
+ + " unable to calculate default span Loss ");
+ return new HashMap<>();
+ }
+ long linkLength = augLinkLength.longValue();
+ LOG.warn("In PceLink {}, assume G.652 fiber, calculation "
+ + "based on fiber length of {} km and typical loss of 0.25dB per Km ",
+ link.getLinkId(), linkLength);
+ return new HashMap<>(
+ Map.of(
+ "SpanLoss", linkLength * 0.25,
+ "PoutCorrection", retrievePower(FiberType.Smf)
+ ));
+ }
+
+ // Compute the attenuation of a span from OMS attribute
+ private Map<String, Double> calcSpanLoss(Link link) {
+ if (this.omsAttributesSpan == null) {
+ return calcDefaultSpanLoss(link);