public void writeDemandsAndSplitRatiosToSpreadSheet(String outFilename) throws BiffException, IOException, RowsExceededException, WriteException, IndexOutOfBoundsException { Workbook existingWorkbook = Workbook.getWorkbook(new File(outFilename)); WritableWorkbook workbookCopy = Workbook.createWorkbook(new File("Aimsun\\output.xls"), existingWorkbook); // add labels first row workbookCopy.getSheet(0).addCell(new Label(15, 0, "Split Ratios")); workbookCopy.getSheet(0).addCell(new Label(16, 0, "Offramp Flows")); workbookCopy.getSheet(0).addCell(new Label(17, 0, "Demands")); workbookCopy.getSheet(0).addCell(new Label(18, 0, "Flows")); workbookCopy.getSheet(0).addCell(new Label(19, 0, "Speeds")); int rowIndex = 1; for (Cell c : splitCells) { // find row index while (true) { NumberCell nc2 = (NumberCell) workbookCopy.getSheet(0).getCell(0, rowIndex); if (nc2.getValue() == c.getDetectorML().getSensorID()) { break; } rowIndex++; } // fill in mainline data columns for (int k = rowIndex; k < rowIndex + totalTimeInHours * 60 / 5; k++) { workbookCopy.getSheet(0).addCell(new Number(18, k, c.getFlowCompare().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(19, k, c.getVelocity().get(k - rowIndex))); } rowIndex = 1; // if the cell has onramp, find the detector id and fill corresponding columns (assumption: // cells have at most one on-ramp or off-ramp) int onrampLinkID = 0; if (c.getLinks().getFirst().getUpLinks().size() > 1) { // By our assumption (above), there are at most 2 upstream links for each mainline link onrampLinkID = c.getLinks().getFirst().getUpLinks().get(0); for (Link mlLink : mainlineLinks) { if (mlLink.getLinkID() == onrampLinkID) { onrampLinkID = c.getLinks().getFirst().getUpLinks().get(1); break; } } // find associated detector int onrampDetId = 0; for (int key : detectors.keySet()) { if (detectors.get(key).getLinkAssoc() == onrampLinkID) { onrampDetId = detectors.get(key).getSensorID(); } } if (onrampDetId == 0) continue; // find row index while (true) { NumberCell nc2 = (NumberCell) workbookCopy.getSheet(0).getCell(0, rowIndex); if (nc2.getValue() == onrampDetId) { break; } rowIndex++; } for (int k = rowIndex; k < rowIndex + totalTimeInHours * 60 / 5; k++) { workbookCopy.getSheet(0).addCell(new Number(17, k, c.getOnRampInput().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(18, k, c.getOnRampInput().get(k - rowIndex))); } rowIndex = 1; } // if the cell has offramp, find the detector id and fill corresponding columns (assumption: // cells have at most one on-ramp or off-ramp) int offrampLinkID = 0; if (c.getLinks().getLast().getDownLinks().size() > 1) { // By our assumption (above), there are at most 2 upstream links for each mainline link offrampLinkID = c.getLinks().getLast().getDownLinks().get(0); for (Link mlLink : mainlineLinks) { if (mlLink.getLinkID() == offrampLinkID) { offrampLinkID = c.getLinks().getLast().getDownLinks().get(1); break; } } // find associated detector int offrampDetId = 0; for (int key : detectors.keySet()) { if (detectors.get(key).getLinkAssoc() == offrampLinkID) { offrampDetId = detectors.get(key).getSensorID(); } } if (offrampDetId == 0) continue; // find row index while (true) { NumberCell nc2 = (NumberCell) workbookCopy.getSheet(0).getCell(0, rowIndex); if (nc2.getValue() == offrampDetId) { break; } rowIndex++; } for (int k = rowIndex; k < rowIndex + totalTimeInHours * 60 / 5; k++) { workbookCopy.getSheet(0).addCell(new Number(15, k, c.getBeta().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(16, k, c.getOffRampFlow().get(k - rowIndex))); workbookCopy.getSheet(0).addCell(new Number(18, k, c.getOffRampFlow().get(k - rowIndex))); } rowIndex = 1; } // rowIndex += totalTimeInHours*60/5; rowIndex = 1; } workbookCopy.write(); workbookCopy.close(); existingWorkbook.close(); }
/** * Translates the link structure into the cell structure depending on healthy detector locations */ public void createCellStructure() { int i = 0; while (i < mainlineLinks.size() - 1) { if (mainlineLinks.get(i).isHasDetector() & mainlineLinks.get(i).getDetectorML().getHealthStatus() == 100) { Cell c = new Cell((int) totalTimeInHours * 60 / 5); c.addLink(mainlineLinks.get(i)); c.setDetectorML(mainlineLinks.get(i).getDetectorML()); c.setDetectorHOV(mainlineLinks.get(i).getDetectorHOV()); while (!mainlineLinks.get(i + 1).isHasDetector() & i < mainlineLinks.size() - 2 | (mainlineLinks.get(i + 1).isHasDetector() & mainlineLinks.get(i + 1).getDetectorML().getHealthStatus() != 100)) { c.addLink(mainlineLinks.get(i + 1)); i++; } // Onramps and Offramps in the Cell for (Link l : c.getLinks()) { c.addToOnrampPerLink(l.getUpNode().getInLinks().size() - 1); c.addToOfframpPerLink(l.getDownNode().getOutLinks().size() - 1); for (int linkID : l.getUpNode().getInLinks()) { if (links.get(linkID).getLinkType().equals("onramp")) { if (links.get(linkID).getDetectorML().getFlowData().isEmpty() | links.get(linkID).getDetectorML().getHealthStatus() != 100) { c.addToImputeOR(true); c.appendZeroColumnToMeasuredOnrampFlow(); } else { c.appendColumnToMeasuredOnrampFlow( links.get(linkID).getDetectorML().getFlowDataArray()); c.addToImputeOR(false); } } } for (int linkID : l.getDownNode().getOutLinks()) { if (links.get(linkID).getLinkType().equals("offramp")) { if (links.get(linkID).getDetectorML().getFlowData().isEmpty() | links.get(linkID).getDetectorML().getHealthStatus() != 100) { c.addToImputeFR(true); c.appendZeroColumnToMeasuredOfframpFlow(); } else { c.appendColumnToMeasuredOfframpFlow( links.get(linkID).getDetectorML().getFlowDataArray()); c.addToImputeFR(false); } } } } cells.add(c); } i++; } i = 0; }