#include "GSignals.h"
ClassImp(GSignals)
GSignals::GSignals()
{
Num=10;
Noise=16;
MIPSignal=200;
PeakTimes=TArrayF(Num);
Cuts=TArrayF(Num);
sn =new TClonesArray("TH1F",Num);
csignal =new TClonesArray("TH1F",Num);
csignalsn =new TClonesArray("TH1F",Num);
csize =new TClonesArray("TH1F",Num);
}
GSignals::GSignals(Int_t num,Float_t noise, Float_t mipsignal, Float_t *peaktimes, Float_t *cuts)
{
TString snname="sn",csignalname="Signal_histogram_", csignalsnname="signal_SN_", csizename="Cluster_size_";
TString name1,name2,name3,name4;
Num=num;
Noise=noise;
MIPSignal=mipsignal;
PeakTimes=TArrayF(Num,peaktimes);
Cuts=TArrayF(3,cuts);
sn =new TClonesArray("TH1F",Num);
csignal =new TClonesArray("TH1F",Num);
csignalsn =new TClonesArray("TH1F",Num);
csize =new TClonesArray("TH1F",Num);
TClonesArray &sncopy = *sn;
TClonesArray &csignalcopy = *csignal;
TClonesArray &csignalsncopy = *csignalsn;
TClonesArray &csizecopy = *csize;
rnd=TRandom(44);
for(Int_t i=0;i<Num;i++)
{
char v[2]; v[0]=(Char_t) i+48; v[1]='\0';
//printf("character %sn",v);
name1=snname+v; name2=csignalname+v; name3=csignalsnname+v; name4=csizename+v;
new(sncopy[i]) TH1F((const char *)name1,"SN",100,0,50);
new(csignalcopy[i]) TH1F((const char *)name2,"Signal histogram",200,0,1e3);
new(csignalsncopy[i]) TH1F((const char *)name3,"Signal after SN-cuts",160,0,80);
new(csizecopy[i]) TH1F((const char *)name4,"Cluster size",10,0,10);
}
}
GSignals::~GSignals()
{
sn->Delete();
csignal->Delete();
csignalsn->Delete();
csize->Delete();
}
void GSignals::DrawHistogram(Int_t i,char *option,char *doption)
{
if(! strcmp(option,"s")) ((TH1F *)csignal->At(i))->DrawCopy(doption);
if(! strcmp(option,"sn")) ((TH1F *)sn->At(i))->DrawCopy(doption);
if(! strcmp(option,"ssc")) ((TH1F *)csignalsn->At(i))->DrawCopy(doption);
if(! strcmp(option,"csize")) ((TH1F *)csize->At(i))->DrawCopy(doption);
}
void GSignals::GetHistogram(Int_t i,TH1F *his,char *option)
{
if(! strcmp(option,"s")) ((TH1F *)csignal->At(i))->Copy(*his);
if(! strcmp(option,"sn")) ((TH1F *)sn->At(i))->Copy(*his);
if(! strcmp(option,"ssc")) ((TH1F *)csignalsn->At(i))->Copy(*his);
if(! strcmp(option,"csize")) ((TH1F *)csize->At(i))->Copy(*his);
}
void GSignals::AddEvent(Int_t timenum, Int_t clsiz, Float_t *sig)
{
Float_t sumsig=0; //sum of all signals(over hit strips) in the event after addition of random noise
Float_t sumsn=0; //sum of all SN(over hit strips) in the event after addition of random noise
Int_t cls=0; // cluster size in the event
Int_t j=0;
TArrayF signal=TArrayF(clsiz,sig);
((TH1F *)csignal->At(timenum))->Fill(signal.GetSum()/1e4);
Float_t *SN=new Float_t[clsiz]; // SN
Float_t *SIG=new Float_t[clsiz]; // Signal
Float_t maxsn=0;
Int_t maxsni;
Int_t cent=0;
for(j=0;j<clsiz;j++)
{
SN[j]=(signal[j]/1e4+rnd.Gaus(0,Noise))/Noise; //addition of random noise
SIG[j]=(signal[j]/1e4+rnd.Gaus(0,Noise)); //addition of random noise
if(SN[j]>maxsn) {maxsn=SN[j]; maxsni=j;} //max SN-strip in event search
//printf("SN[%d]=%f Signal=%fn",j,SN[j],signal[j]/1e4);
//printf("event=%d index=%dn",ev,maxsni);
}
for(j=0;j<clsiz;j++)
{
if(j!=maxsni) {if(SN[j]>Cuts[2]) {sumsn+=SN[j]; sumsig+=SIG[j]; cls++;}} else
if(SN[j]>Cuts[1]) {sumsn+=SN[j]; sumsig+=SIG[j]; cent=1; cls++;}
}
if(cent==1 && sumsn>Cuts[0])
{
((TH1F *)sn->At(timenum))->Fill(sumsn);
((TH1F *)csize->At(timenum))->Fill(cls);
((TH1F *)csignalsn->At(timenum))->Fill(sumsig/10);
}
sumsn=0; sumsig=0; cls=0;
delete [] SN;
delete [] SIG;
}
void GSignals::Clean()
{
for(Int_t i=0;i<Num;i++)
{
((TH1F *)sn->At(i))->Reset();
((TH1F *)csize->At(i))->Reset();
((TH1F *)csignal->At(i))->Reset();
((TH1F *)csignalsn->At(i))->Reset();
}
}
Double_t GSignals::FitLG(Int_t timenum,char *option, Double_t *par, Double_t *parerr)
{
Double_t GausLandConv(Double_t *,Double_t *);
Double_t param[4];
Double_t max=0;
TH1F *his=new TH1F();
GetHistogram(timenum,his,option);
param[0]=(Double_t) GetMax(his,0);
param[3]=(Double_t) GetMax(his,1);
param[2]=(Double_t) 3;//his->GetRMS(1);
param[1]=(Double_t) 1;
TF1 *f = new TF1("f",GausLandConv,0,70,4);
f->SetParameters(param);
his->Fit("f","RN");
max= FindLandauPeak(f);
for(Int_t i=0;i<4;i++) {parerr[i]=f->GetParError(i); par[i]=f->GetParameter(i);}
delete his;
delete f;
return max;
}
Double_t GSignals::FindLandauPeak(TF1 *land)
{
Double_t eps=0.01;
Double_t sigma=land->GetParameter(1);
Double_t mean=land->GetParameter(0);
Double_t x=mean-sigma;
while(land->Eval(x) > land->Eval(x-eps)) {x=x+eps;}
//printf("Max Y=%f, Max X=%f, sigma=%f, mean=%fn",land->Eval(x-eps),x-eps,sigma,mean);
return x-eps;
}
Double_t GausLandConv(Double_t *x, Double_t *par)
{
// Crude convolution of a Gaussian (mean= 0.) and a Landau
// distribution at x[0].
Double_t HiBound = 80; //par[6]; // hi bound for integration
Double_t LoBound = 0; //par[5]; // lo bound for integration
Double_t NumIntBins = 320;// par[4]; // number of Riemann integration bins
Double_t YNorm = par[3]; // Normalization
Double_t GausSigma = par[2]; // sigma width of gaussian
Double_t XNorm = par[1]; // x axis normalization
Double_t LandMostProb = par[0]; // most probable of landau
Double_t StepSize = (HiBound - LoBound) / NumIntBins;
// Integrate over the region LoBound --> HiBound using
// NumIntBins Riemannian bins
Double_t gaus, result = 0;
for ( Double_t tau = LoBound + StepSize/2; tau < HiBound; tau += StepSize ) {
// evaluate a gaussian curve at (x[0]-tau)
gaus = TMath::Exp( -1*(*x-tau)*(*x-tau)/(2*GausSigma*GausSigma) )/( TMath::Sqrt(2.*3.141592653)*GausSigma );
// add the area of this Riemann bin to the total integral result
result+=YNorm * TMath::Landau(tau,LandMostProb,XNorm) * gaus;
}
//result/=NumIntBins;
return result;
}
Float_t GSignals::GetMax(TH1F *histo,Int_t opt) //X=0,Y=else
{
Int_t i,maxi=0;
Float_t max=-1e20;
for(i=1;i<histo->GetNbinsX();i++) {//printf("%d %f %dn",i,max,maxi);
if(max<histo->GetBinContent(i)) {max=histo->GetBinContent(i); maxi=i;}}
if(opt==0) return(histo->GetBinCenter(maxi)); else return(max);
}
ROOT page - Class index - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.