code: public static double probabilityTruncZero(double a, double b, double mu, double sigma) {
          // clip at zero
          a = Math.max(a, 0.0);
          b = Math.max(b, 0.0);
          final double denom = sigma * SQRT2;
          final double scaledSDA = (a - mu) / denom; 
          final double scaledSDB = (b - mu) / denom; 
          // compute prob 
          final double probNormTimes2 = Erf.erf(scaledSDA, scaledSDB); 
          // renormalize
          final double scaledSD0 = -mu / denom; 
          final double reZTimes2 = Erf.erfc(scaledSD0);
          return probNormTimes2 / reZTimes2; 
      }
docs: returns the probability of x falling within the range of a to b
  under a normal distribution with mean mu and standard deviation sigma
  if the distribution is truncated below 0 and renormalized
  
  a and b should both be greater than or equal to 0 but this is not checked