Esempio n. 1
0
  private void simulatePropagation(Molecule molecule, FileWriter... writer) {
    String newline = "";
    long time = System.nanoTime();
    long elapsed = 0;
    double runStep = maxSimulationTime;
    //		boolean reachFlag = false;
    boolean onRailFlag = false;
    // double distance = distSendReciever!=0?distSendReciever:;
    if (maxSimulationStep > 0) {
      runStep = maxSimulationStep;
    }
    try {
      Position curpos = molecule.getPosition();
      if (probDrail != 0) {
        if (!onRailFlag) {
          for (MicroTubule mt : listOfMicroTubule) {
            Position p = getInitPointOnMicrotubule(mt, curpos);
            if (p != null) {
              molecule.setCurrentMicrotubule(mt);
              molecule.setPosition(p);
              onRailFlag = true;
              break;
            }
          }
        }
      }
      while ((elapsed = (maxSimulationStep <= 0) ? (System.nanoTime() - time) : (elapsed + 1))
          < (long) runStep) {
        curpos = molecule.getPosition();
        if (generateOutputFile) {
          writer[1].write(newline + curpos.getX() + delim + curpos.getY() + delim + curpos.getZ());
          newline = "\n";
        }

        if (hasReachDestination(curpos)) {
          if (maxSimulationStep <= 0) {
            molecule.setReachTime(System.nanoTime() - time);
          } else {
            molecule.setReachTime(elapsed);
          }
          molecule.setReachFlag(true);
          break;
        }
        if (probDrail != 0) {
          if (onRailFlag) {
            if (hasDRailed()) {
              onRailFlag = false;
              System.out.println("off rail");
              molecule.setCurrentMicrotubule(null);
              Position newPos = new Position();
              newPos.setX(
                  curpos.getX() + molecule.getStepLengthX() * steparr[(int) (Math.random() * 3)]);
              newPos.setY(
                  curpos.getY() + molecule.getStepLengthY() * steparr[(int) (Math.random() * 3)]);
              newPos.setZ(
                  curpos.getZ() + molecule.getStepLengthZ() * steparr[(int) (Math.random() * 3)]);
              checkBoundary(newPos);
              Position nextPos = checkRailPos(curpos, newPos, molecule);
              if (nextPos != null) {
                // distance = curpos.getDistance(reciever);
                molecule.setPosition(nextPos);
                onRailFlag = true;
                System.out.println("On Rail");
              } else {
                molecule.setPosition(newPos);
              }
            } else {
              Position plusend = molecule.getCurrentMicrotubule().getPlusEndCentre();
              Position minusend = molecule.getCurrentMicrotubule().getMinusEndCentre();
              Position newPos = new Position();
              Position perp = new Position();
              double x2 = plusend.getX();
              double y2 = plusend.getY();
              double z2 = plusend.getZ();
              double x1 = minusend.getX();
              double y1 = minusend.getY();
              double z1 = minusend.getZ();
              double d = curpos.getX();
              double e = curpos.getY();
              double f = curpos.getZ();

              double t =
                  ((x2 - d) * (x2 - x1) + (y2 - e) * (y2 - y1) + (z2 - f) * (z2 - z1))
                      / ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1));
              perp.setX(d + (x2 - x1) * t);
              perp.setY(e + (y2 - y1) * t);
              perp.setZ(f + (z2 - z1) * t);
              double distance = perp.getDistance(curpos);
              curpos.setX(
                  (velRail * perp.getX() + (distance - velRail) * curpos.getX()) / distance);
              curpos.setY(
                  (velRail * perp.getY() + (distance - velRail) * curpos.getY()) / distance);
              curpos.setZ(
                  (velRail * perp.getZ() + (distance - velRail) * curpos.getZ()) / distance);
              // System.out.println(curpos.getX()+","+curpos.getY()+","+curpos.getZ());
              // molecule.setPosition(curpos);
            }
          } else {
            Position newPos = new Position();
            newPos.setX(
                curpos.getX() + molecule.getStepLengthX() * steparr[(int) (Math.random() * 3)]);
            newPos.setY(
                curpos.getY() + molecule.getStepLengthY() * steparr[(int) (Math.random() * 3)]);
            newPos.setZ(
                curpos.getZ() + molecule.getStepLengthZ() * steparr[(int) (Math.random() * 3)]);
            checkBoundary(newPos);
            Position nextPos = checkRailPos(curpos, newPos, molecule);
            if (nextPos != null) {
              // distance = curpos.getDistance(reciever);
              molecule.setPosition(nextPos);
              onRailFlag = true;
              System.out.println("Gets on Rail");
            } else {
              molecule.setPosition(newPos);
            }
          }
        } else {
          curpos.setX(
              curpos.getX() + molecule.getStepLengthX() * steparr[(int) (Math.random() * 3)]);
          curpos.setY(
              curpos.getY() + molecule.getStepLengthY() * steparr[(int) (Math.random() * 3)]);
          curpos.setZ(
              curpos.getZ() + molecule.getStepLengthZ() * steparr[(int) (Math.random() * 3)]);
          checkBoundary(curpos);
        }
        if (generateOutputFile) {
          writer[1].flush();
        }
      }
      if (generateOutputFile) {
        writer[1].flush();
        writer[1].close();
      }
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    if (molecule.isReachFlag()) {
      System.out.println(":) Hooray this molecule reached to destination");
      try {
        writer[0].write(molecule.getReachTime() + "\n");
        writer[0].flush();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    } else System.out.println(":( This molecule couldn't reach its destination");
  }