AIDA GELINA BRIKEN nToF CRIB ISOLDE CIRCE nTOFCapture DESPEC DTAS EDI_PSA 179Ta CARME StellarModelling DCF K40
  EDI_PSA  ELOG logo
Message ID: 5     Entry time: Wed Jun 26 14:15:43 2019
Author: CB 
Subject: Waves to histogram program 
Wrote simple program to convert from waves to amplitude/energy histogram.
Program uses semi-gaussian filtering with RC=RC, simple pole zero correction and baseline restoration.

Compile with g++ WavesToHisto.cpp -o WavesToHisto.x
Usage: ./WavesToHisto.x Sorted_run_file > histogram.dat
Attachment 1: WavesToHisto.cpp  2 kB  Uploaded Wed Jun 26 15:18:37 2019  | Hide | Hide all
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

#include <math.h> // exp

#define TOT_SAMPLES 8192
#define B_SAMPLES 400


#define GAIN 6.22575 //1/(POW(POLES,POLES)*EXP(-POLES)/POLES!)
#define T_C 100.0 			// Time constant (RC=CR)
#define PZ 500.0 			// Pole zero correction

void Filter(std::vector<double>* wave) // Semi-gaussian filter
{	
	
	//std::vector<double> old_wave = *wave;
	double b1,a0,a1,a0_1;
	b1=exp(-1./T_C);
	a0=(1.+b1)/2;
	a0_1=1.-b1;

	int i,j;
	
	// 1 differentiator (high-pass filter)
	double my_value, baseline;
	
	baseline= (*wave)[0];
	(*wave)[0]=0;
	for(i=1;i<wave->size();++i)
	{
		my_value=(*wave)[i]-baseline; // Baseline
		(*wave)[i]=b1*(*wave)[i-1] + a0*(my_value-(*wave)[i-1]) + (*wave)[i-1]/PZ;
	}
	
	//  6 integrators (low-pass filter)
 	for(j=0;j<6;++j)
	{
		for(i=1;i<wave->size();++i) 
		{
			my_value=b1*(*wave)[i-1]+a0_1*(*wave)[i];
			(*wave)[i]=my_value;
		}
	}
	
	//for(i=0;i<wave->size();++i) std::cout<<old_wave[i]-old_wave[0]<<" "<<(*wave)[i]<<std::endl;
};

unsigned int GetAmplitude(std::vector<double> wave)
{
	double minimum=wave[0];
	double baseline=0;
	int i;	
	
	for(i=0;i<B_SAMPLES && i<wave.size();++i) baseline+=wave[i];
	baseline*=1./B_SAMPLES;

	for(;i<wave.size();++i) if(wave[i]<minimum) minimum=wave[i];

	return baseline-minimum;

};

int main (int argc, char* argv[])
{
	std::fstream f_in;
	std::string str;
	if(argc<2)
	{
		std::cerr<<"USAGE: ./WavesToHisto input_file"<<std::endl;
		return 1;
	}
	str=argv[1];
	f_in.open(str.c_str(),std::fstream::in);
	if(!f_in)
	{
		std::cerr<<"No such file: "<<str<<std::endl;
	}

	// Header
	std::getline(f_in,str);
	while(str!="")
	{
		std::getline(f_in,str);
	}

	// Waveforms
	int read;
	int i=0;
	double baseline, minimum;

	int histo[500]={0};
	unsigned int channel;
	std::vector<double> wave;

	while(f_in)
	{
		i=0;
		baseline=0;
		f_in>>read;
		while( f_in && i<(TOT_SAMPLES-3) )
		{
			wave.push_back(read);
			f_in>>read;
			++i;
		}
		f_in>>read>>read;
		if(wave.size()>0)
		{		
			Filter(&wave);
			channel=GetAmplitude(wave);
			if(channel<500) histo[channel]++;
		}

		wave.clear();
				

		/*		
		minimum=read;	
		while(i<(TOT_SAMPLES-3))
		{
			//std::cout<<i<<" "<<read<<std::endl;
			if(i<B_SAMPLES) baseline+=read;
			else if (read<minimum) minimum=read;

			f_in>>read;
			i++;
		}
		f_in>>read>>read; // Waveform tail
		baseline*=1./B_SAMPLES;
		channel=baseline-minimum;
		if(channel<500) histo[channel]++;
		//std::cout<<baseline<<" "<<minimum<<" "<<baseline-minimum<<std::endl;
		*/
	}

	for(i=0;i<500;++i) std::cout<<i<<" "<<histo[i]<<std::endl;
	
	return 0;
}
ELOG V3.1.4-unknown