// File: /workspace/github_cpp_makefile_star2_O3/gersteinlab[P]MUSIC/src/ms_signal_track_tools.cpp
// Function: get_valleys_per_per_nucleotide_signal_profile(double*, char*, int, double, double)
vector<t_annot_region*>** get_valleys_per_per_nucleotide_signal_profile(double* signal_profile, char* chrom, int l_data, double min_thresh, double max_thresh)
{
	// Allocate the states of peaks at each position.
	vector<t_annot_region*>** valleys_per_threshes = new vector<t_annot_region*>*[(int)max_thresh-(int)min_thresh+1];
	int* valley_starts = new int[(int)max_thresh-(int)min_thresh+1];
	for(int thresh = (int)min_thresh; thresh <= (int)max_thresh; thresh++)
	{
		valleys_per_threshes[thresh-(int)min_thresh] = new vector<t_annot_region*>();
		valley_starts[thresh-(int)min_thresh] = 0;
	} // thresh loop.

	for(int i = 1; i <= l_data; i++)
	{
		for(int thresh = (int)min_thresh; thresh <= (int)max_thresh; thresh++)
		{
			if(signal_profile[i] <= thresh)
			{
				// The signal is below the threshold.
				if(valley_starts[thresh-(int)min_thresh] == 0)
				{
					// Set a new peak start.
					valley_starts[thresh-(int)min_thresh] = i;
				}
				else
				{
					// This was a peak already.
				}
			}
			else
			{
				// The signal is above the threshold.
				if(valley_starts[thresh-(int)min_thresh] != 0)
				{
					// Add this as a valley.
					t_annot_region* new_valley = get_empty_region();
					new_valley->chrom = t_string::copy_me_str(chrom);
					new_valley->start = valley_starts[thresh-(int)min_thresh];
					new_valley->end = i-1;
					new_valley->strand = '+';

					// Set the current start at this threshold to 0; no peak.
					valley_starts[thresh-(int)min_thresh] = 0;

					// Add the new peak.
					valleys_per_threshes[thresh-(int)min_thresh]->push_back(new_valley);
				}
				else
				{
					// This was not a valley already.
				}
			}
		} // thresh loop.
	} // i loop.

	delete [] valley_starts;

	return(valleys_per_threshes);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rdx, 0x8(%rsp)
movq %rsi, 0x30(%rsp)
cvttsd2si %xmm1, %ebx
cvttsd2si %xmm0, %ebp
movq %rdi, 0x28(%rsp)
movl %ebx, %eax
subl %ebp, %eax
cltq
cmpl $-0x1, %eax
leaq 0x8(,%rax,8), %rdi
movq $-0x1, %rcx
cmovlq %rcx, %rdi
leaq 0x4(,%rax,4), %r13
cmovlq %rcx, %r13
callq 0x2040
movq %rax, %r15
movq %r13, %rdi
callq 0x2040
movq %rax, %r13
movl %ebx, 0x4(%rsp)
movl %ebp, (%rsp)
subl %ebp, %ebx
jl 0x1d951
incl %ebx
xorl %r14d, %r14d
movl $0x18, %edi
callq 0x2180
xorpd %xmm0, %xmm0
movupd %xmm0, (%rax)
movq $0x0, 0x10(%rax)
movq %rax, (%r15,%r14,8)
movl $0x0, (%r13,%r14,4)
incq %r14
cmpl %r14d, %ebx
jne 0x1d922
movq %r15, 0x20(%rsp)
cmpl $0x0, 0x8(%rsp)
movq 0x28(%rsp), %rcx
jle 0x1da48
movq 0x8(%rsp), %rax
incl %eax
movq %rax, 0x8(%rsp)
movl (%rsp), %ebx
movl 0x4(%rsp), %eax
movl %eax, %ebp
notl %ebp
addq %rbx, %rbp
movl $0x1, %r14d
movl (%rsp), %eax
cmpl %eax, 0x4(%rsp)
jl 0x1da3a
leal -0x1(%r14), %eax
movl %eax, 0x1c(%rsp)
xorl %r12d, %r12d
leal (%rbx,%r12), %eax
xorps %xmm0, %xmm0
cvtsi2sd %eax, %xmm0
ucomisd (%rcx,%r14,8), %xmm0
movl (%r13,%r12,4), %r15d
jae 0x1da11
testl %r15d, %r15d
je 0x1da2c
callq 0x15644
movq %rax, 0x10(%rsp)
movq 0x30(%rsp), %rdi
callq 0x26db4
movq 0x10(%rsp), %rcx
movq %rax, (%rcx)
movq 0x10(%rsp), %rax
movl %r15d, 0xc(%rax)
movl 0x1c(%rsp), %ecx
movl %ecx, 0x20(%rax)
movb $0x2b, 0x8(%rax)
movl $0x0, (%r13,%r12,4)
movq 0x20(%rsp), %rcx
movq (%rcx,%r12,8), %rdi
movq 0x8(%rdi), %rsi
cmpq 0x10(%rdi), %rsi
je 0x1da1d
movq %rax, (%rsi)
addq $0x8, 0x8(%rdi)
jmp 0x1da27
testl %r15d, %r15d
jne 0x1da2c
movl %r14d, (%r13,%r12,4)
jmp 0x1da2c
leaq 0x10(%rsp), %rdx
callq 0xb74c
movq 0x28(%rsp), %rcx
incq %r12
movl %ebp, %eax
addl %r12d, %eax
jne 0x1d99e
incq %r14
cmpq 0x8(%rsp), %r14
jne 0x1d986
movq %r13, %rdi
callq 0x2220
movq 0x20(%rsp), %rax
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq