private void preProcessTimeRef(final Collection<TypedCircularMessage> typedCircularMessages) {
   ticksPerNano = -1;
   long timeClock1 = -1;
   long timeClock2 = -1;
   long timeTicks1 = -1;
   long timeTicks2 = -1;
   long timeClocksPerSec = -1;
   for (final TypedCircularMessage msg : typedCircularMessages) {
     if (msg.getStruct().getId() != Message.TIME_REF.srlTypeId()) {
       continue;
     }
     final Long secondsSince1970 = (Long) msg.getValue("secondsSince1970");
     if (secondsSince1970 != null) {
       // TODO: save timebase in header?
     }
     final Long clock = (Long) msg.getValue("clock");
     if (clock == null) {
       continue;
     }
     final Long clocksPerSec = (Long) msg.getValue("clocksPerSec");
     if (clocksPerSec == null || clocksPerSec < 1) {
       continue;
     }
     if (timeClock1 == -1) {
       timeClock1 = clock;
       timeTicks1 = ((CircularMessage) msg.getMessage()).getTs();
       timeClock2 = -1;
       continue;
     }
     if (timeClock2 == -1) {
       timeClock2 = clock;
       timeTicks2 = ((CircularMessage) msg.getMessage()).getTs();
       timeClocksPerSec = clocksPerSec;
       break;
     }
   }
   if (timeClock1 == -1 || timeClock2 == -1) {
     return;
   }
   if (timeTicks1 == -1 || timeTicks2 == -1) {
     return;
   }
   if (timeClock1 > timeClock2) {
     long temp = timeClock2;
     timeClock2 = timeClock1;
     timeClock1 = temp;
     temp = timeTicks2;
     timeTicks2 = timeTicks1;
     timeTicks1 = temp;
   }
   if (timeClock1 >= timeClock2 || timeTicks1 >= timeTicks2) {
     return;
   }
   final double temp1 = timeClocksPerSec * (timeTicks2 - timeTicks1);
   final double temp2 = NANO_PER_SEC * (timeClock2 - timeClock1);
   ticksPerNano = temp1 / temp2;
 }
  private void getEvents(final Collection<TypedCircularMessage> events) {
    final List<TypedCircularMessage> cmList = new ArrayList<TypedCircularMessage>(events);
    sort(cmList);
    boolean isFirstFunction = true;
    int functionIndex = 0;
    for (int i = 0; i < cmList.size(); i++) {
      final TypedCircularMessage message = cmList.get(i);
      final long ts = resolveTimeStamp(((CircularMessage) message.getMessage()).getTs());
      final int id = message.getStruct().getId();
      if (dummyRun && (id >= 0)) {
        continue;
      }
      if (id == Message.ROSE_RECEIVE.srlTypeId()) {
        getRoseReceive(message, ts);
      } else if (id == Message.ROSE_SEND.srlTypeId()) {
        final long receivedAt = findReceiveTime(message, cmList, i);
        getRoseSend(message, receivedAt, ts);
      } else if (id == Message.TASK_SWITCH.srlTypeId()) {
        getTaskSwitch(message, ts);
      } else if (id == Message.INT_BEGIN.srlTypeId()) {
        handleInterruptBegin(message, ts);
      } else if (id == Message.INT_END.srlTypeId()) {
        handleInterruptEnd(message, ts);
      } else if (id == Message.TASK_COMPLETE.srlTypeId()) {
        if (getTaskCompletion(message, ts)) {}
      } else if (id == Message.TASK_RELEASE.srlTypeId()) {
        if (getTaskRelease(message, cmList, i, ts)) {}
      } else if (id == Message.TIME_REF.srlTypeId()) {
        // nothing todo
      } else if (id == Message.UML_SEND.srlTypeId()) {
        final long receivedAt = findReceiveTime(message, cmList, i);
        getUMLSend(message, receivedAt, ts);
      } else if (id == Message.UML_RECEIVE.srlTypeId()) {
        getUMLreceive(message, ts);
      } else if (id == Message.FUNCTION_ENTER.srlTypeId()) {
        long endTime = -1;
        if (isFirstRun) {
          if (!isFirstFunction) {
            functionTimestamps.add(ts);
          } else {
            isFirstFunction = false;
          }
        } else {
          if (functionIndex < functionTimestamps.size()) {
            endTime = functionTimestamps.get(functionIndex++);
          }
        }
        getFunctionEnter(message, endTime, ts);
      } else if (id == Message.FUNCTION_EXIT.srlTypeId()) {
        long endTime = -1;
        if (isFirstRun) {
          if (!isFirstFunction) {
            functionTimestamps.add(ts);
          } else {
            isFirstFunction = false;
          }
        } else {
          if (functionIndex < functionTimestamps.size()) {
            endTime = functionTimestamps.get(functionIndex++);
          }
        }
        getFunctionExit(message, endTime, ts);
      } else if (id == Message.UML_EXAMPLE_DATA.srlTypeId()) {

      } else if (id < 0) {
        getUserEvent(message, ts);
      } else {
        throw new UnsupportedOperationException("Can not handle id = " + id);
      }
    }
  }