void GaussianEdgeCalculator::getPartnerLengthRange(const AlignmentRecord& ap, unsigned int *min, unsigned int *max) const {
    if ((unsigned)allowable_insert_size_diff > ap.getInsertLength()) {
		*min = 0;
	} else {
		*min = ap.getInsertLength() - allowable_insert_size_diff;
	}
	*max = ap.getInsertLength() + allowable_insert_size_diff;
}
void AnyDistributionEdgeCalculator::getPartnerLengthRange(const AlignmentRecord& ap, unsigned int *min, unsigned int *max) const {
	if (allowable_insert_size_diff > (int)ap.getInsertLength()) {
		*min = 0;
	} else {
		*min = ap.getInsertLength() - allowable_insert_size_diff;
	}
	*max = ap.getInsertLength() + allowable_insert_size_diff;
}
bool AnyDistributionEdgeCalculator::edgeBetween(const AlignmentRecord & ap1, const AlignmentRecord & ap2) const {
	double insert_length_diff = abs(((int)ap1.getInsertLength()) - ((int)ap2.getInsertLength()));
// 	// double meanedge = 2.0 * sf( insert_length_diff / (sqrt2*insert_size_popstddev) );
	if (insert_length_diff > allowable_insert_size_diff) {
		return false;
	}
	size_t intersection_length = ap1.intersectionLength(ap2);
	if (intersection_length == 0) return false;
	int insert_length_sum = ap1.getInsertLength() + ap2.getInsertLength() - 2*intersection_length;
	double intersection_pvalue = insertSizeSumRightTail(insert_length_sum);
	return intersection_pvalue >= significance_level;
}
bool GaussianEdgeCalculator::edgeBetween(const AlignmentRecord & ap1, const AlignmentRecord & ap2, int numGCAllowedPos, int ct) const {
	if (ap1.isSingleEnd() || ap2.isSingleEnd()) {
		throw runtime_error("Cannot process single-end reads in GaussianEdgeCalculator!");
	}
	double insert_length_diff = abs(((int)ap1.getInsertLength()) - ((int)ap2.getInsertLength()));
	// double meanedge = 2.0 * sf( insert_length_diff / (sqrt2*insert_size_popstddev) );
	if (insert_length_diff > allowable_insert_size_diff) {
		return false;
	}
	size_t intersection_length = ap1.internalSegmentIntersectionLength(ap2);
	if (intersection_length == 0) return false;
	double mean_insert_length = (ap1.getInsertLength() + ap2.getInsertLength()) / 2.0;
	double interedge = min(1.0, 2.0 * sf(sqrt2*(mean_insert_length - intersection_length - insert_size_popmean) / insert_size_popstddev) );
	return interedge >= significance_level;
}