From 2c7bc3c8b5a623ea24491814e8218f04f7109130 Mon Sep 17 00:00:00 2001 From: ryans Date: Mon, 3 Nov 2025 15:45:43 -0500 Subject: [PATCH 1/8] Compute Delivered with Physics Up and DTM Tuning Fixes #37 --- .../business/service/CcSignatureService.java | 8 +++++- .../btm/business/service/DowntimeService.java | 10 +++++--- .../WEB-INF/includes/cross-check-panel.jsp | 25 ++++++++++++++++--- src/main/webapp/WEB-INF/tags/cc-timesheet.tag | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java index fdac325..638c3d5 100644 --- a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java +++ b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java @@ -8,6 +8,7 @@ import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.servlet.http.HttpServletRequest; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -345,7 +346,11 @@ public void populateRequestAttributes( multiplicityAvailability.getShiftTotals()); // Downtime check - DowntimeSummaryTotals dtmTotals = downService.reportTotals(startHour, startOfNextShift); + DowntimeSummaryTotals dtmTotals = + downService.reportTotals(startHour, startOfNextShift, BigInteger.ONE); + + DowntimeSummaryTotals tuningHours = + downService.reportTotals(startHour, startOfNextShift, BigInteger.valueOf(9L)); CcDowntimeCrossCheck downCrossCheck = new CcDowntimeCrossCheck(accAvailability.getShiftTotals(), dtmTotals.getEventSeconds()); @@ -368,6 +373,7 @@ public void populateRequestAttributes( request.setAttribute("multiCrossCheck", multiCrossCheck); request.setAttribute("downCrossCheck", downCrossCheck); request.setAttribute("dtmTotals", dtmTotals); + request.setAttribute("tuningHours", tuningHours); request.setAttribute("hallAHourCrossCheckList", hallAHourCrossCheckList); request.setAttribute("hallBHourCrossCheckList", hallBHourCrossCheckList); request.setAttribute("hallCHourCrossCheckList", hallCHourCrossCheckList); diff --git a/src/main/java/org/jlab/btm/business/service/DowntimeService.java b/src/main/java/org/jlab/btm/business/service/DowntimeService.java index 8535a99..3f579b9 100644 --- a/src/main/java/org/jlab/btm/business/service/DowntimeService.java +++ b/src/main/java/org/jlab/btm/business/service/DowntimeService.java @@ -5,6 +5,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -37,18 +38,19 @@ protected EntityManager getEntityManager() { } @PermitAll - public DowntimeSummaryTotals reportTotals(Date start, Date end) { + public DowntimeSummaryTotals reportTotals(Date start, Date end, BigInteger eventTypeId) { Query q = em.createNativeQuery( "select sum(downtime_seconds) as downtime_seconds " + "from (select " + "btm_owner.interval_to_seconds(least(nvl(a.time_up, sysdate), :end) - greatest(a.time_down, :start)) as downtime_seconds " + "from btm_owner.event_first_incident a " - + "where a.event_type_id = 1 " + + "where a.event_type_id = :typeId " + "and a.time_down < :end " + "and nvl(a.time_up, sysdate) >= :start " + "union all (select 0 from dual))"); + q.setParameter("typeId", eventTypeId); q.setParameter("start", start); q.setParameter("end", end); @@ -88,7 +90,7 @@ public List dayTotals(Date start, Date end) { Date realStart = (startDayHourZero.getTime() == day.getTime()) ? start : startOfDay; Date realEnd = iterator.hasNext() ? startOfNextDay : end; - DowntimeSummaryTotals totals = this.reportTotals(realStart, realEnd); + DowntimeSummaryTotals totals = this.reportTotals(realStart, realEnd, BigInteger.ONE); DayTotals mt = new DayTotals(); mt.day = startOfDay; mt.totals = totals; @@ -123,7 +125,7 @@ public List monthTotals(Date start, Date end) { Date realStart = (startMonthDayOne.getTime() == month.getTime()) ? start : startOfMonth; Date realEnd = iterator.hasNext() ? startOfNextMonth : end; - DowntimeSummaryTotals totals = this.reportTotals(realStart, realEnd); + DowntimeSummaryTotals totals = this.reportTotals(realStart, realEnd, BigInteger.ONE); MonthTotals mt = new MonthTotals(); mt.month = startOfMonth; mt.totals = totals; diff --git a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp index 5c820d2..7fea60e 100644 --- a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp +++ b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp @@ -12,12 +12,12 @@
-
BTM vs DTM
+
BTM vs DTM Blocked Program Downtime
- - + + @@ -29,6 +29,25 @@
BTM Possible DowntimeDTM Event DowntimeBTM Possible Downtime (Physics + Internal Down)DTM Blocked Event Downtime ⮺ Cross Check Status
+
BTM vs DTM Tuning Downtime
+ + + + + + + + + + + + + + + + + +
BTM Physics TotalDTM Tuning Downtime ⮺Computed Delivered PhysicsCross Check Status
${btm:formatDurationLossy(accAvailability.shiftTotals.getUpSeconds(), durationUnits)}${btm:formatDurationLossy(tuningHours.eventSeconds, durationUnits)}${btm:formatDurationLossy(accAvailability.shiftTotals.getUpSeconds() - tuningHours.eventSeconds, durationUnits)}${tuneCrossCheck.isPassed() ? '✔' : 'X'}
  • diff --git a/src/main/webapp/WEB-INF/tags/cc-timesheet.tag b/src/main/webapp/WEB-INF/tags/cc-timesheet.tag index f379b54..1f1aadb 100644 --- a/src/main/webapp/WEB-INF/tags/cc-timesheet.tag +++ b/src/main/webapp/WEB-INF/tags/cc-timesheet.tag @@ -20,6 +20,7 @@ PHYSICS + (Delivered + Tuning + Down) INTERNAL Date: Mon, 3 Nov 2025 15:58:46 -0500 Subject: [PATCH 2/8] Compute Delivered with Physics Up and DTM Tuning --- .../business/service/CcSignatureService.java | 5 ++- .../projection/CcDowntimeCrossCheck.java | 30 +++++++++++++++-- .../WEB-INF/includes/cross-check-panel.jsp | 33 +++++++++++++++---- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java index 638c3d5..041914d 100644 --- a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java +++ b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java @@ -353,7 +353,10 @@ public void populateRequestAttributes( downService.reportTotals(startHour, startOfNextShift, BigInteger.valueOf(9L)); CcDowntimeCrossCheck downCrossCheck = - new CcDowntimeCrossCheck(accAvailability.getShiftTotals(), dtmTotals.getEventSeconds()); + new CcDowntimeCrossCheck( + accAvailability.getShiftTotals(), + dtmTotals.getEventSeconds(), + tuningHours.getEventSeconds()); request.setAttribute("plan", plan); request.setAttribute("accAvailability", accAvailability); diff --git a/src/main/java/org/jlab/btm/persistence/projection/CcDowntimeCrossCheck.java b/src/main/java/org/jlab/btm/persistence/projection/CcDowntimeCrossCheck.java index 2e3c1f2..9a25bd2 100644 --- a/src/main/java/org/jlab/btm/persistence/projection/CcDowntimeCrossCheck.java +++ b/src/main/java/org/jlab/btm/persistence/projection/CcDowntimeCrossCheck.java @@ -12,29 +12,53 @@ public class CcDowntimeCrossCheck { private final boolean passed; private final boolean lowProgramPassed; + private final boolean highTuningPassed; private final String lowProgramMessage; + private final String highTuningMessage; - public CcDowntimeCrossCheck(CcAccShiftTotals acc, long dtmEventDownSeconds) { + public CcDowntimeCrossCheck(CcAccShiftTotals acc, long dtmEventDownSeconds, long tuningSeconds) { int possibleDowntimeSeconds = acc.calculatePossibleDowntimeSeconds(); + int upSeconds = acc.getUpSeconds(); lowProgramMessage = - "DTM event down (" + "DTM blocked event down (" + BtmFunctions.formatDuration((int) dtmEventDownSeconds, DurationUnits.HOURS) + " hours) is significantly greater than BTM possible down time [PHYSICS + INTERNAL DOWN] (" + BtmFunctions.formatDuration(possibleDowntimeSeconds, DurationUnits.HOURS) + " hours)"; + highTuningMessage = + "DTM tuning event down (" + + BtmFunctions.formatDuration((int) tuningSeconds, DurationUnits.HOURS) + + " hours) is significantly greater than BTM possible Tuning [PHYSICS] (" + + BtmFunctions.formatDuration(upSeconds, DurationUnits.HOURS) + + " hours)"; + lowProgramPassed = possibleDowntimeSeconds >= dtmEventDownSeconds - TEN_MINUTES_OF_SECONDS; - passed = lowProgramPassed; + highTuningPassed = upSeconds >= tuningSeconds - TEN_MINUTES_OF_SECONDS; + + passed = lowProgramPassed && highTuningPassed; } public boolean isPassed() { return passed; } + public boolean isLowProgramPassed() { + return lowProgramPassed; + } + + public boolean isHighTuningPassed() { + return highTuningPassed; + } + + public String getHighTuningMessage() { + return highTuningMessage; + } + public String getLowProgramMessage() { return lowProgramMessage; } diff --git a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp index 7fea60e..1652674 100644 --- a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp +++ b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp @@ -17,7 +17,14 @@ BTM Possible Downtime (Physics + Internal Down) - DTM Blocked Event Downtime ⮺ + + + + + + + DTM Blocked Event Downtime ⮺ + Cross Check Status @@ -25,16 +32,30 @@ ${btm:formatDurationLossy(accAvailability.shiftTotals.calculatePossibleDowntimeSeconds(), durationUnits)} ${btm:formatDurationLossy(dtmTotals.eventSeconds, durationUnits)} - ${downCrossCheck.isPassed() ? '✔' : 'X'} + ${downCrossCheck.isLowProgramPassed() ? '✔' : 'X'} +
      + +
    • + +
    • +
      +
    BTM vs DTM Tuning Downtime
    - + @@ -44,14 +65,14 @@ - +
    BTM Physics TotalDTM Tuning Downtime ⮺ + + + + + + DTM Tuning Downtime ⮺ + Computed Delivered Physics Cross Check Status
    ${btm:formatDurationLossy(accAvailability.shiftTotals.getUpSeconds(), durationUnits)} ${btm:formatDurationLossy(tuningHours.eventSeconds, durationUnits)} ${btm:formatDurationLossy(accAvailability.shiftTotals.getUpSeconds() - tuningHours.eventSeconds, durationUnits)}${tuneCrossCheck.isPassed() ? '✔' : 'X'}${downCrossCheck.isHighTuningPassed() ? '✔' : 'X'}
      - +
    • - +
    From 39a954d8032b5f1b0e9634c1720423e9007a36bb Mon Sep 17 00:00:00 2001 From: ryans Date: Mon, 3 Nov 2025 17:32:55 -0500 Subject: [PATCH 3/8] Compute Delivered with Physics Up and DTM Tuning --- src/main/webapp/WEB-INF/includes/cross-check-panel.jsp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp index 1652674..1c76b33 100644 --- a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp +++ b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp @@ -18,7 +18,7 @@ BTM Possible Downtime (Physics + Internal Down) - + @@ -49,7 +49,7 @@ BTM Physics Total - + From 640617c8d9869de19e128fe3cc2a3f9dc6b2b01b Mon Sep 17 00:00:00 2001 From: Ryan Slominski Date: Tue, 4 Nov 2025 16:38:58 -0500 Subject: [PATCH 4/8] style --- src/main/webapp/resources/css/timesheet.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/webapp/resources/css/timesheet.css b/src/main/webapp/resources/css/timesheet.css index fc1a8ac..8e64202 100644 --- a/src/main/webapp/resources/css/timesheet.css +++ b/src/main/webapp/resources/css/timesheet.css @@ -246,6 +246,7 @@ table.editable-table tbody td span { #exp-avail-panel th.mirror-th, #exp-avail-panel td input, #exp-reasons-panel td, +#tune-check-table td, #dtm-btm-table td { text-align: right; } @@ -347,6 +348,7 @@ table.editable-table tbody td span { #comparison-table td:last-child, .cross-check-details td, +#tune-check-table td:last-child, #dtm-btm-table td:last-child { text-align: center; } From b0c966c1ad0b3e3d5c1c1eb6f72af25a74d28e1e Mon Sep 17 00:00:00 2001 From: Ryan Slominski Date: Tue, 4 Nov 2025 16:39:06 -0500 Subject: [PATCH 5/8] test data --- container/oracle/initdb.d/05_test_data.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/container/oracle/initdb.d/05_test_data.sql b/container/oracle/initdb.d/05_test_data.sql index 80e6532..314322a 100644 --- a/container/oracle/initdb.d/05_test_data.sql +++ b/container/oracle/initdb.d/05_test_data.sql @@ -32,4 +32,8 @@ CREATE SEQUENCE BTM_OWNER.RUN_ID START WITH 2 NOCYCLE NOCACHE - ORDER; \ No newline at end of file + ORDER; + +-- Event First Incident +insert into BTM_OWNER.EVENT_FIRST_INCIDENT values (1, 'Testing Blocked', null, 1, 1, 'Testing Blocked', sysdate, 1); +insert into BTM_OWNER.EVENT_FIRST_INCIDENT values (2, 'Testing Tuning', null, 9, 2, 'Testing Tuning', sysdate, 1); \ No newline at end of file From 4e901e66a953c7bfda89ce9b9effa7ad0286f447 Mon Sep 17 00:00:00 2001 From: Ryan Slominski Date: Thu, 6 Nov 2025 10:41:35 -0500 Subject: [PATCH 6/8] Hourly cross-check --- .../business/service/CcSignatureService.java | 8 ++ .../btm/business/service/DowntimeService.java | 40 ++++++++- .../projection/DowntimeHourCrossCheck.java | 23 +++++ .../btm/persistence/projection/DtmHour.java | 65 ++++++++++++++ .../WEB-INF/includes/cross-check-panel.jsp | 3 + .../WEB-INF/tags/dtm-hourly-cross-check.tag | 90 +++++++++++++++++++ 6 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java create mode 100644 src/main/java/org/jlab/btm/persistence/projection/DtmHour.java create mode 100644 src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag diff --git a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java index 041914d..6a581bd 100644 --- a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java +++ b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java @@ -358,6 +358,11 @@ public void populateRequestAttributes( dtmTotals.getEventSeconds(), tuningHours.getEventSeconds()); + List dtmHourList = downService.getDtmHourList(startHour, startOfNextShift); + + List downHourlyCrossCheckList = + downService.getCrossCheckHourList(accAvailability, dtmHourList); + request.setAttribute("plan", plan); request.setAttribute("accAvailability", accAvailability); request.setAttribute("hallAvailabilityList", hallAvailabilityList); @@ -382,6 +387,9 @@ public void populateRequestAttributes( request.setAttribute("hallCHourCrossCheckList", hallCHourCrossCheckList); request.setAttribute("hallDHourCrossCheckList", hallDHourCrossCheckList); + request.setAttribute("dtmHourList", dtmHourList); + request.setAttribute("downHourlyCrossCheckList", downHourlyCrossCheckList); + // DEBUG /*for(int i = 0; i < hallAvailabilityList.size(); i++) { CcHallShiftAvailability ha = hallAvailabilityList.get(i); diff --git a/src/main/java/org/jlab/btm/business/service/DowntimeService.java b/src/main/java/org/jlab/btm/business/service/DowntimeService.java index 3f579b9..3faf23c 100644 --- a/src/main/java/org/jlab/btm/business/service/DowntimeService.java +++ b/src/main/java/org/jlab/btm/business/service/DowntimeService.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.logging.Logger; import org.jlab.btm.persistence.entity.CcAccHour; -import org.jlab.btm.persistence.projection.DowntimeSummaryTotals; +import org.jlab.btm.persistence.projection.*; import org.jlab.smoothness.business.util.DateIterator; import org.jlab.smoothness.business.util.TimeUtil; import org.jlab.smoothness.persistence.util.JPAUtil; @@ -135,6 +135,44 @@ public List monthTotals(Date start, Date end) { return monthTotals; } + @PermitAll + public List getCrossCheckHourList( + AcceleratorShiftAvailability accAvailability, List dtmHourList) { + List checkList = new ArrayList<>(); + + List ccAccHourList = accAvailability.getHourList(); + + for (int i = 0; i < ccAccHourList.size(); i++) { + CcAccHour ccAccHour = ccAccHourList.get(i); + DtmHour dtmHour = dtmHourList.get(i); + + DowntimeHourCrossCheck checkHour = + new DowntimeHourCrossCheck(ccAccHour.getDayAndHour(), ccAccHour, dtmHour); + checkList.add(checkHour); + } + + return checkList; + } + + @PermitAll + public List getDtmHourList(Date startHour, Date endHour) { + List dtmHourList = new ArrayList<>(); + DateIterator iterator = new DateIterator(startHour, endHour, Calendar.HOUR_OF_DAY); + + while (iterator.hasNext()) { + Date hour = iterator.next(); + + short blockedSeconds = 0; + short tuneSeconds = 0; + + DtmHour dtmHour = new DtmHour(hour, blockedSeconds, tuneSeconds); + + dtmHourList.add(dtmHour); + } + + return dtmHourList; + } + public class DayTotals { Date day; diff --git a/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java b/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java new file mode 100644 index 0000000..e92c60f --- /dev/null +++ b/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java @@ -0,0 +1,23 @@ +package org.jlab.btm.persistence.projection; + +import java.util.Date; +import org.jlab.btm.persistence.entity.CcAccHour; + +/** + * @author ryans + */ +public class DowntimeHourCrossCheck { + + private static final int HALF_HOUR_OF_SECONDS = 1800; + private static final int TEN_MINUTES_OF_SECONDS = 600; + + private final Date dayAndHour; + + public DowntimeHourCrossCheck(Date dayAndHour, CcAccHour ccAccHour, DtmHour dtmHour) { + this.dayAndHour = dayAndHour; + } + + public Date getDayAndHour() { + return dayAndHour; + } +} diff --git a/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java b/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java new file mode 100644 index 0000000..022eca3 --- /dev/null +++ b/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java @@ -0,0 +1,65 @@ +package org.jlab.btm.persistence.projection; + +import java.util.Date; + +/** + * @author ryans + */ +public class DtmHour extends Hour { + private Date dayAndHour; + + private short blockedSeconds; + + private short tuneSeconds; + + public DtmHour() {} + + public DtmHour(Date dayAndHour, short blockedSeconds, short tuneSeconds) { + this.dayAndHour = dayAndHour; + this.blockedSeconds = blockedSeconds; + this.tuneSeconds = tuneSeconds; + } + + @Override + public Date getDayAndHour() { + return dayAndHour; + } + + @Override + public void setDayAndHour(Date dayAndHour) { + this.dayAndHour = dayAndHour; + } + + public short getBlockedSeconds() { + return blockedSeconds; + } + + public void setBlockedSeconds(short blockedSeconds) { + this.blockedSeconds = blockedSeconds; + } + + public short getTuneSeconds() { + return tuneSeconds; + } + + public void setTuneSeconds(short tuneSeconds) { + this.tuneSeconds = tuneSeconds; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.getDayAndHour() != null ? this.getDayAndHour().hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof DtmHour)) { + return false; + } + DtmHour other = (DtmHour) object; + return (this.getDayAndHour() != null || other.getDayAndHour() == null) + && (this.getDayAndHour() == null || this.getDayAndHour().equals(other.getDayAndHour())); + } +} diff --git a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp index 1c76b33..534abdb 100644 --- a/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp +++ b/src/main/webapp/WEB-INF/includes/cross-check-panel.jsp @@ -128,6 +128,9 @@
+
+ +
diff --git a/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag b/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag new file mode 100644 index 0000000..753a3e7 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag @@ -0,0 +1,90 @@ +<%@tag description="Hall Hourly Availability Tag" pageEncoding="UTF-8" %> +<%@taglib prefix="c" uri="jakarta.tags.core" %> +<%@taglib prefix="fn" uri="jakarta.tags.functions" %> +<%@taglib prefix="fmt" uri="jakarta.tags.fmt" %> +<%@taglib prefix="btm" uri="jlab.tags.btm" %> +<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> +<%@attribute name="hourCrossCheckList" required="true" type="java.util.List" %> +<%@attribute name="dtmHourList" required="true" type="java.util.List" %> +<%@attribute name="btmHourList" required="true" type="java.util.List" %> +

BTM vs DTM

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BTMDTMCOMPUTED
{DELIVERED,BLOCKED,TUNING}{BLOCKED}{PHYSICS, INTERNAL DOWN}{PHYSICS}{PHYSICS-TUNING}
PHYSICSINTERNAL DOWNBLOCKEDTUNINGDELIVERED
+
    + + +
  • + [] +
  • +
    + +
  • + [] +
  • +
    + +
  • + [] +
  • +
    + +
  • + [] +
  • +
    + +
  • + [] +
  • +
    +
    +
+
\ No newline at end of file From 6cc2e71e82e9a93f1cb674e6a18bb67156b86da2 Mon Sep 17 00:00:00 2001 From: ryans Date: Mon, 10 Nov 2025 09:42:33 -0500 Subject: [PATCH 7/8] Compute Delivered with Physics Up and DTM Tuning --- .../business/service/CcSignatureService.java | 2 +- .../btm/business/service/DowntimeService.java | 19 +++++-- .../projection/DowntimeHourCrossCheck.java | 53 ++++++++++++++++++- .../btm/persistence/projection/DtmHour.java | 3 +- .../WEB-INF/tags/dtm-hourly-cross-check.tag | 26 ++------- 5 files changed, 72 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java index 6a581bd..28e54fd 100644 --- a/src/main/java/org/jlab/btm/business/service/CcSignatureService.java +++ b/src/main/java/org/jlab/btm/business/service/CcSignatureService.java @@ -361,7 +361,7 @@ public void populateRequestAttributes( List dtmHourList = downService.getDtmHourList(startHour, startOfNextShift); List downHourlyCrossCheckList = - downService.getCrossCheckHourList(accAvailability, dtmHourList); + downService.getCrossCheckHourList(accAvailability.getDbHourList(), dtmHourList); request.setAttribute("plan", plan); request.setAttribute("accAvailability", accAvailability); diff --git a/src/main/java/org/jlab/btm/business/service/DowntimeService.java b/src/main/java/org/jlab/btm/business/service/DowntimeService.java index 3faf23c..3968575 100644 --- a/src/main/java/org/jlab/btm/business/service/DowntimeService.java +++ b/src/main/java/org/jlab/btm/business/service/DowntimeService.java @@ -137,11 +137,9 @@ public List monthTotals(Date start, Date end) { @PermitAll public List getCrossCheckHourList( - AcceleratorShiftAvailability accAvailability, List dtmHourList) { + List ccAccHourList, List dtmHourList) { List checkList = new ArrayList<>(); - List ccAccHourList = accAvailability.getHourList(); - for (int i = 0; i < ccAccHourList.size(); i++) { CcAccHour ccAccHour = ccAccHourList.get(i); DtmHour dtmHour = dtmHourList.get(i); @@ -162,10 +160,21 @@ public List getDtmHourList(Date startHour, Date endHour) { while (iterator.hasNext()) { Date hour = iterator.next(); + Date startOfNextHour = TimeUtil.addHours(hour, Calendar.HOUR_OF_DAY); + short blockedSeconds = 0; - short tuneSeconds = 0; + short tuningSeconds = 0; + + DowntimeSummaryTotals blockedTotals = + this.reportTotals(hour, startOfNextHour, BigInteger.ONE); + + DowntimeSummaryTotals tuningTotals = + this.reportTotals(hour, startOfNextHour, BigInteger.valueOf(9L)); + + blockedSeconds = (short) blockedTotals.getEventSeconds(); + tuningSeconds = (short) tuningTotals.getEventSeconds(); - DtmHour dtmHour = new DtmHour(hour, blockedSeconds, tuneSeconds); + DtmHour dtmHour = new DtmHour(hour, blockedSeconds, tuningSeconds); dtmHourList.add(dtmHour); } diff --git a/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java b/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java index e92c60f..3252f59 100644 --- a/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java +++ b/src/main/java/org/jlab/btm/persistence/projection/DowntimeHourCrossCheck.java @@ -2,6 +2,8 @@ import java.util.Date; import org.jlab.btm.persistence.entity.CcAccHour; +import org.jlab.btm.persistence.enumeration.DurationUnits; +import org.jlab.btm.presentation.util.BtmFunctions; /** * @author ryans @@ -11,13 +13,62 @@ public class DowntimeHourCrossCheck { private static final int HALF_HOUR_OF_SECONDS = 1800; private static final int TEN_MINUTES_OF_SECONDS = 600; + private final boolean passed; + private final boolean lowProgramPassed; + private final boolean highTuningPassed; + + private final String lowProgramMessage; + private final String highTuningMessage; + private final Date dayAndHour; - public DowntimeHourCrossCheck(Date dayAndHour, CcAccHour ccAccHour, DtmHour dtmHour) { + public DowntimeHourCrossCheck(Date dayAndHour, CcAccHour accHour, DtmHour dtmHour) { this.dayAndHour = dayAndHour; + + int possibleDowntimeSeconds = accHour.getUpSeconds() + accHour.getDownSeconds(); + int upSeconds = accHour.getUpSeconds(); + + int blockedSeconds = dtmHour.getBlockedSeconds(); + int tuneSeconds = dtmHour.getTuneSeconds(); + + lowProgramMessage = + "DTM blocked event down (" + + BtmFunctions.formatDuration((int) blockedSeconds, DurationUnits.HOURS) + + " hours) is significantly greater than BTM possible down time [PHYSICS + INTERNAL DOWN] (" + + BtmFunctions.formatDuration(possibleDowntimeSeconds, DurationUnits.HOURS) + + " hours)"; + + highTuningMessage = + "DTM tuning event down (" + + BtmFunctions.formatDuration((int) tuneSeconds, DurationUnits.HOURS) + + " hours) is significantly greater than BTM possible Tuning [PHYSICS] (" + + BtmFunctions.formatDuration(upSeconds, DurationUnits.HOURS) + + " hours)"; + + lowProgramPassed = possibleDowntimeSeconds >= blockedSeconds - TEN_MINUTES_OF_SECONDS; + + highTuningPassed = upSeconds >= tuneSeconds - TEN_MINUTES_OF_SECONDS; + + passed = lowProgramPassed && highTuningPassed; } public Date getDayAndHour() { return dayAndHour; } + + public boolean isLowProgramPassed() { + return lowProgramPassed; + } + + public boolean isHighTuningPassed() { + return highTuningPassed; + } + + public String getHighTuningMessage() { + return highTuningMessage; + } + + public String getLowProgramMessage() { + return lowProgramMessage; + } } diff --git a/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java b/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java index 022eca3..11b9c9c 100644 --- a/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java +++ b/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java @@ -6,14 +6,13 @@ * @author ryans */ public class DtmHour extends Hour { + private Date dayAndHour; private short blockedSeconds; private short tuneSeconds; - public DtmHour() {} - public DtmHour(Date dayAndHour, short blockedSeconds, short tuneSeconds) { this.dayAndHour = dayAndHour; this.blockedSeconds = blockedSeconds; diff --git a/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag b/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag index 753a3e7..792e28b 100644 --- a/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag +++ b/src/main/webapp/WEB-INF/tags/dtm-hourly-cross-check.tag @@ -55,34 +55,16 @@
    - +
  • [] + value="${hour.lowProgramMessage}"/>
  • - +
  • [] -
  • -
    - -
  • - [] -
  • -
    - -
  • - [] -
  • -
    - -
  • - [] + value="${hour.highTuningMessage}"/>
  • From 15d3e4b7d2019ce4819d7835b511c8b730288182 Mon Sep 17 00:00:00 2001 From: ryans Date: Mon, 10 Nov 2025 10:46:04 -0500 Subject: [PATCH 8/8] Compute Delivered with Physics Up and DTM Tuning --- .../jlab/btm/business/service/DowntimeService.java | 14 +++++++++++--- .../org/jlab/btm/persistence/entity/CcAccHour.java | 2 +- .../jlab/btm/persistence/projection/DtmHour.java | 12 ++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jlab/btm/business/service/DowntimeService.java b/src/main/java/org/jlab/btm/business/service/DowntimeService.java index 3968575..0a2bfd0 100644 --- a/src/main/java/org/jlab/btm/business/service/DowntimeService.java +++ b/src/main/java/org/jlab/btm/business/service/DowntimeService.java @@ -144,6 +144,8 @@ public List getCrossCheckHourList( CcAccHour ccAccHour = ccAccHourList.get(i); DtmHour dtmHour = dtmHourList.get(i); + // System.err.println(ccAccHour + " " + dtmHour); + DowntimeHourCrossCheck checkHour = new DowntimeHourCrossCheck(ccAccHour.getDayAndHour(), ccAccHour, dtmHour); checkList.add(checkHour); @@ -153,14 +155,17 @@ public List getCrossCheckHourList( } @PermitAll - public List getDtmHourList(Date startHour, Date endHour) { + public List getDtmHourList(Date startHour, Date endHourExclusive) { + + Date endHourInclusive = TimeUtil.addHours(endHourExclusive, -1); + List dtmHourList = new ArrayList<>(); - DateIterator iterator = new DateIterator(startHour, endHour, Calendar.HOUR_OF_DAY); + DateIterator iterator = new DateIterator(startHour, endHourInclusive, Calendar.HOUR_OF_DAY); while (iterator.hasNext()) { Date hour = iterator.next(); - Date startOfNextHour = TimeUtil.addHours(hour, Calendar.HOUR_OF_DAY); + Date startOfNextHour = TimeUtil.addHours(hour, 1); short blockedSeconds = 0; short tuningSeconds = 0; @@ -174,6 +179,9 @@ public List getDtmHourList(Date startHour, Date endHour) { blockedSeconds = (short) blockedTotals.getEventSeconds(); tuningSeconds = (short) tuningTotals.getEventSeconds(); + // System.out.println(hour + " - " + startOfNextHour + " blockedSeconds: " + blockedSeconds + + // " tuningSeconds: " + tuningSeconds); + DtmHour dtmHour = new DtmHour(hour, blockedSeconds, tuningSeconds); dtmHourList.add(dtmHour); diff --git a/src/main/java/org/jlab/btm/persistence/entity/CcAccHour.java b/src/main/java/org/jlab/btm/persistence/entity/CcAccHour.java index 4644f34..b79eb06 100644 --- a/src/main/java/org/jlab/btm/persistence/entity/CcAccHour.java +++ b/src/main/java/org/jlab/btm/persistence/entity/CcAccHour.java @@ -198,6 +198,6 @@ public boolean equals(Object object) { @Override public String toString() { - return "org.jlab.btm.persistence.entity.CcAccHour[ ccAccHourId=" + ccAccHourId + " ]"; + return "CcAccHour{" + "dayAndHour=" + dayAndHour + '}'; } } diff --git a/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java b/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java index 11b9c9c..6fb43b8 100644 --- a/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java +++ b/src/main/java/org/jlab/btm/persistence/projection/DtmHour.java @@ -61,4 +61,16 @@ public boolean equals(Object object) { return (this.getDayAndHour() != null || other.getDayAndHour() == null) && (this.getDayAndHour() == null || this.getDayAndHour().equals(other.getDayAndHour())); } + + @Override + public String toString() { + return "DtmHour{" + + "dayAndHour=" + + dayAndHour + + ", blockedSeconds=" + + blockedSeconds + + ", tuneSeconds=" + + tuneSeconds + + '}'; + } }