コード例 #1
0
void MedianReductionPop(WiggleIterator * wi) {
	int i;

	if (wi->done)
		return;

	MedianWiggleReducerData * data = (MedianWiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	for (i = 0; i < multi->count; i++) {
		if (multi->inplay[i])
			data->vals[i] = multi->values[i];
		else
			data->vals[i] = multi->default_values[i];

		if (isnan(data->vals[i])) {
			wi->value = NAN;
			popMultiplexer(multi);
			return;
		}
	}
	qsort(data->vals, multi->count, sizeof(double), &compDoubles);
	wi->value = data->vals[multi->count / 2];
	
	popMultiplexer(multi);
}
コード例 #2
0
void SelectReductionPop(WiggleIterator * wi) {
	if (wi->done)
		return;

	WiggleSelectData * data = (WiggleSelectData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	while (!multi->inplay[data->index]) {
		popMultiplexer(multi);
		if (multi->done) {
			wi->done = true;
			return;
		}
	}

	wi->value = multi->values[data->index];
	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	popMultiplexer(multi);
}
コード例 #3
0
void CVReductionPop(WiggleIterator * wi) {
	int i;
	double mean, diff;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	mean = 0;
	for (i = 0; i < multi->count; i++) {
		float value;
		if (multi->inplay[i])
			value = multi->values[i];
		else
			value = multi->default_values[i];

		if (isnan(value)) {
			wi->value = NAN;
			popMultiplexer(multi);
			return;
		}
	}
	mean /= multi->count;

	if (mean == 0) {
		wi->value = NAN;
		popMultiplexer(multi);
		return;
	}
	
	wi->value = 0;
	for (i = 0; i < multi->count; i++) {
		if (multi->inplay[i])
			diff = mean - multi->values[i];
		else
			diff = mean - multi->default_values[i];
		wi->value += diff * diff;
	}
	wi->value /= multi->count;
	wi->value = sqrt(wi->value) / mean;
	
	popMultiplexer(multi);
}
コード例 #4
0
void ProductReductionPop(WiggleIterator * wi) {
	int i;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	wi->value = 1;
	for (i = 0; i < multi->count; i++) {
		double value;
		if (multi->inplay[i])
			value = multi->values[i];
		else
			value = multi->default_values[i];

		if (isnan(value)) {
			wi->value = NAN;
			break;
		}

		wi->value *= value;
	}
	popMultiplexer(multi);
}
コード例 #5
0
void MaxReductionPop(WiggleIterator * wi) {
	int i;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	if (multi->inplay[0])
		wi->value = multi->iters[0]->value;
	else
		wi->value = 0;

	for (i = 1; i < multi->count; i++) {
		double value;
		if (multi->inplay[i])
			value = multi->values[i];
		else
			value = multi->iters[i]->default_value;
		if (wi->value < value)
			wi->value = value;
	}
	popMultiplexer(multi);
}
コード例 #6
0
void EntropyReductionPop(WiggleIterator * wi) {
	int i;
	float count = 0;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;

	for (i = 0; i < multi->count; i++)
		if ((multi->inplay[i] && multi->values[i] != 0) || (!multi->inplay[i] && multi->iters[i]->default_value != 0))
			count++;

	if (count == 0 || count == multi->count)
		wi->value = 0;
	else {
		double p = count / multi->count;
		wi->value = - p * log(p) - (1-p) * log(1 - p);
	}
	
	popMultiplexer(multi);
}
コード例 #7
0
void MeanReductionPop(WiggleIterator * wi) {
	int i;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	wi->value = 0;
	for (i = 0; i < multi->count; i++)
		if (multi->inplay[i])
			wi->value += multi->values[i];
		else
			wi->value += multi->iters[i]->default_value;
	wi->value /= multi->count;
	popMultiplexer(multi);
}
コード例 #8
0
static void TeeMultiplexerSeek(Multiplexer * multi, const char * chrom, int start, int finish) {
	TeeMultiplexerData * data = (TeeMultiplexerData *) multi->data;
	killWriter(data);
	fflush(data->outfile);
	seekMultiplexer(data->in, chrom, start, finish);
	multi->done = false;
	launchWriter(data, multi->count);
	popMultiplexer(multi);
}
コード例 #9
0
void EntropyReductionPop(WiggleIterator * wi) {
	int i;
	float count = 0;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;

	for (i = 0; i < multi->count; i++) {
		double value;
		if (multi->inplay[i]) 
			value = multi->values[i]; 
		else 
			value = multi->default_values[i];

		if (isnan(value)) {
			wi->value = NAN;
			popMultiplexer(multi);
			return;
		} else if (value > 0)
			count++;
	}

	if (count == 0 || count == multi->count)
		wi->value = 0;
	else {
		double p = count / multi->count;
		wi->value = - p * log(p) - (1-p) * log(1 - p);
	}
	
	popMultiplexer(multi);
}
コード例 #10
0
bool CVReductionPop2(WiggleIterator * wi) {
	int i;
	double mean, diff;

	if (wi->done)
		return true;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return false;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	mean = 0;
	for (i = 0; i < multi->count; i++)
		if (multi->inplay[i])
			mean += multi->values[i];
	mean /= multi->count;

	if (mean == 0) {
		popMultiplexer(multi);
		return true;
	}
	
	wi->value = 0;
	for (i = 0; i < multi->count; i++) {
		if (multi->inplay[i])
			diff = mean - multi->values[i];
		else
			diff = mean - multi->iters[i]->default_value;
		wi->value += diff * diff;
	}
	wi->value /= multi->count;
	wi->value = sqrt(wi->value) / mean;
	
	popMultiplexer(multi);
	return false;
}
コード例 #11
0
ファイル: multiplexer.c プロジェクト: Ensembl/WiggleTools
static void seekCoreMultiplexer(Multiplexer * multi, const char * chrom, int start, int finish) {
	int i;
	multi->done = false;
	for (i=0; i<multi->count; i++)
		seek(multi->iters[i], chrom, start, finish);
	fh_deleteheap(multi->starts);
	fh_deleteheap(multi->finishes);
	multi->starts = fh_makeheap();
	multi->finishes = fh_makeheap();
	multi->inplay_count = 0;
	popMultiplexer(multi);
}
コード例 #12
0
void VarianceReductionPop(WiggleIterator * wi) {
	int i;

	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;

	double mean = 0;
	double count = 0;
	for (i = 0; i < multi->count; i++) {
		float value;

		if (multi->inplay[i])
			value = multi->values[i];
		else 	
			value = multi->default_values[i];

		if (isnan(value)) {
			mean = NAN;
			break;
		}
		mean += value;
		count++;
	}

	if (count < 2 || isnan(mean)) {
		wi->value = NAN;
	} else {
		mean /= count;
		
		wi->value = 0;
		for (i = 0; i < multi->count; i++) {
			if (multi->inplay[i]) {
				double diff = mean - multi->values[i];
				wi->value += diff * diff;
			}
		}
		wi->value /= count;
	}
	popMultiplexer(multi);
}
コード例 #13
0
Multiplexer * TeeMultiplexer(Multiplexer * in, FILE * outfile, bool bedGraph, bool holdFire) {
	TeeMultiplexerData * data = (TeeMultiplexerData *) calloc(1, sizeof(TeeMultiplexerData));
	data->in = in;
	data->outfile = outfile;
	data->bedGraph = bedGraph;
	// Hold fire means that you wait for the first seek before doing any writing
	if (!holdFire)
		launchWriter(data, in->count);

	Multiplexer * res = newCoreMultiplexer(data, in->count, &TeeMultiplexerPop, &TeeMultiplexerSeek);
	res->values = in->values;
	res->inplay = in->inplay;
	res->default_values = in->default_values;
	popMultiplexer(res);
	return res;
}
コード例 #14
0
static void TeeMultiplexerPop(Multiplexer * multi) {
	TeeMultiplexerData * data = (TeeMultiplexerData *) multi->data;
	Multiplexer * in = data->in;
	if (!data->in->done) {
		multi->chrom = in->chrom;
		multi->start = in->start;
		multi->finish = in->finish;
		// No need to copy values, pointer points to the source multipliexers values' array
		//multi->value = in->value;

		if (data->threadID) {
			int index = data->lastBlock->count;
			data->lastBlock->chroms[index] =  in->chrom;
			data->lastBlock->starts[index] =  in->start;
			data->lastBlock->finishes[index] =  in->finish;
			int i;
			double * ptr = data->lastBlock->values + (index * multi->count);
			for (i = 0; i < multi->count; i++)
				*(ptr++) = in->values[i];

			if (++data->lastBlock->count >= BLOCK_LENGTH) {
				// Communications
				pthread_mutex_lock(&data->continue_mutex);
				data->count++;
				pthread_cond_signal(&data->continue_cond);
				if (data->count > MAX_OUT_BLOCKS)
					pthread_cond_wait(&data->continue_cond, &data->continue_mutex);
				pthread_mutex_unlock(&data->continue_mutex);

				data->lastBlock->next = (BlockData*) calloc(1, sizeof(BlockData));
				data->lastBlock->next->values = (double*) calloc(BLOCK_LENGTH * multi->count, sizeof(double));
				data->lastBlock->next->width = in->count;
				data->lastBlock = data->lastBlock->next;
				data->lastBlock->bedGraph = data->bedGraph;
			}
		}
		popMultiplexer(in);
	} else if (data->threadID) {
		pthread_mutex_lock(&data->continue_mutex);
		data->count++;
		data->done = true;
		pthread_cond_signal(&data->continue_cond);
		pthread_mutex_unlock(&data->continue_mutex);
		multi->done = true;
		pthread_join(data->threadID, NULL);
	}
}
コード例 #15
0
void FillInReductionPop(WiggleIterator * wi) {
	if (wi->done)
		return;

	WiggleReducerData * data = (WiggleReducerData *) wi->data;
	Multiplexer * multi = data->multi;

	if (multi->done) {
		wi->done = true;
		return;
	}

	wi->chrom = multi->chrom;
	wi->start = multi->start;
	wi->finish = multi->finish;
	if (multi->inplay[1])
		wi->value = multi->values[1];
	else
		wi->value = multi->default_values[1];
	popMultiplexer(multi);
}