|
|
#define analyse2_cxx
#include "analyse2.h"
#include <TH2.h>
#include <TStyle.h>
#include <TCanvas.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <utility>
#include <TFile.h>
#include <TTree.h>
#include <TSystemDirectory.h>
#include <gsl/gsl_statistics.h>
#include <math.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_fft_complex.h>
#include <TF1.h>
#include <TGraphErrors.h>
using namespace std;
void analyse2::Loop() { // In a ROOT session, you can do:
// Root > .L analyse2.C
// Root > analyse2 t
// Root > t.GetEntry(12); // Fill t data members with entry number 12
// Root > t.Show(); // Show values of entry 12
// Root > t.Show(16); // Read and show values of entry 16
// Root > t.Loop(); // Loop on all entries
//
// This is the loop skeleton where:
// jentry is the global entry number in the chain
// ientry is the entry number in the current Tree
// Note that the argument to GetEntry must be:
// jentry for TChain::GetEntry
// ientry for TTree::GetEntry and TBranch::GetEntry
//
// To read only selected branches, Insert statements like:
// METHOD1:
// fChain->ve types of modulesSetBranchStatus("*",0); // disable all branches
// fChain->SetBranchStatus("branchname",1); // activate branchname
// METHOD2: replace line
// fChain->GetEntry(jentry); //read all branches
//by b_branchname->GetEntry(ientry); //read only this branch
if (fChain == 0) return; Double_t totalcurrent = 0.; Double_t totaltime = 0.; const int length = 100; double array[length] = {0.}; double arrayavg = 0.; TF1 * bkgfunc = new TF1("bkgfunc","[0]+[1]*TMath::Cos(x*[2]*(2*3.14159)+[3])"); bkgfunc->SetParameters( bkgfitPar0[64], bkgfitPar1[64], bkgfitPar2[64], bkgfitPar3[64]); TF1 * gausfunc = new TF1("gausfunc","gaus(0)+[3]"); TF1 * gausfunc2 = new TF1("gausfunc2","[0]*exp(-((x-[1])/[2])^2) +[3]*exp(-((x-[1])/[4])^2) + [5]"); TGraphErrors * gausgraph; int numoverthresh=0; double maxchannelamp = 0.; double threshold = 10.; int maxchannel = 0; int numtocalc = 0; int sidenumtocalc= 0; Long64_t nentries = fChain->GetEntries(); Long64_t ientry = LoadTree(1); fChain->GetEntry(1); Double_t basetimeoffset = time; Double_t channelamp[64] = {0.}; Double_t abschannelamp[64] = {0.};
Bool_t beamonflag = false; Int_t waitcounter = 0; Int_t lastfit = 0; Int_t lastfit2 = 0; Double_t channellist_gsl[64]; Bool_t savegraph = true; Long64_t nbytes = 0, nb = 0; for (Long64_t jentry=0; jentry<nentries;jentry++) { Long64_t ientry = LoadTree(jentry); if (ientry < 0) break; nb = fChain->GetEntry(jentry); nbytes += nb; // if (Cut(ientry) < 0) continue;
time_1 = time-basetimeoffset; ic1_1 = ic1; ic2_1 = ic2; mw1_focusx_1 = mw1_focusx; mw1_focusy_1 = mw1_focusy; mw2_focusx_1 = mw2_focusx; mw2_focusy_1 = mw2_focusy; mw1_posx_1 = mw1_posx; mw1_posy_1 = mw1_posy; mw2_posx_1 = mw2_posx; mw2_posy_1= mw2_posy; eventid_1 = jentry; if (jentry % 10000 ==0) cout << jentry << " events completed..." << endl; //calculate a rolling average of the signal
arrayavg = 0; for (int i = 1; i<length;i++){ array[i-1] = array[i]; } if(ic1_1>-100) array[length-1] = ic1_1 ; for (int i = 0; i<length;i++){ arrayavg += array[i]/double(length); } rollingavg = double(arrayavg); waitcounter++; // cout << rollingavg << " " << waitcounter << " " << ic1_1 << endl;
//rerun the baseline fitter using the data in front of each spill
if(rollingavg>1 && !beamonflag && jentry>5000) { beamonflag = true; beamon = 1; cout << "Beam On: " << jentry << endl;
Baseline(true,3200,int(jentry-4000),true); bkgfunc->SetParameters( bkgfitPar0[64], bkgfitPar1[64], bkgfitPar2[64], bkgfitPar3[64]); waitcounter = 0; } if(rollingavg <0.5 && beamonflag && jentry>5000 ) { beamonflag = false; beamon = 0; waitcounter = 0; }
if (ic1_1>0.01) {totaltime+=0.312; totalcurrent+=ic1_1;} // calculate mean and integral
beamSignal_1 = 0.; numoverthresh=0; maxchannelamp = 0.; threshold = 14; maxchannel = 0; // cout << (time_1-basetimeoffset)<< endl;
for (int ch = 4; ch < 64; ch++){ bkgfunc->SetParameters( bkgfitPar0[ch], bkgfitPar1[ch], bkgfitPar2[ch], bkgfitPar3[ch]); //set the parameters for the common mode subtraction
channelamp[ch] = channels[ch]- baseline[ch] - bkgfunc->Eval(time_1); //subtract the baseline
//channelamp_smooth[ch] = channelamp[ch];//to be smoothed later
if (channelamp[ch] < 0.) {abschannelamp[ch] = 0.;} else {abschannelamp[ch] = channelamp[ch];}
if (ic1_1>0.01) th2d_beamSignal_channel->Fill(ch,channelamp[ch]); if (ic1_1<=0.01) th2d_bkg_channel->Fill(ch,channelamp[ch]);
if ( channelamp[ch] >threshold) { numoverthresh++; if ( channelamp[ch] > maxchannelamp) { maxchannelamp = channelamp[ch] ; maxchannel = ch; } } channellist_gsl[ch] = 0; channelamp_smooth[ch] = 0.; } numoverthresh+=4; numtocalc = 0; sidenumtocalc = 0;
beamSidebandNoise_1 = 0.; // for (int ch = 4; ch < maxchannel-numoverthresh/2; ch++){
// if (ch>=4 && ch<=63){
// beamSidebandNoise_1 += channelamp[ch]; //integrate the noise outside the peak
// sidenumtocalc++;
// }
// }
for (int ch = maxchannel+numoverthresh/2; ch < 64; ch++){ if (ch>=4 && ch<=63){ beamSidebandNoise_1 += channelamp[ch]; //integrate the noise outside the peak
sidenumtocalc++; } } beamSidebandNoise_1 = beamSidebandNoise_1 /double(sidenumtocalc); // channel baseline shift
for (int ch = maxchannel-numoverthresh/2 ; ch < maxchannel + numoverthresh/2; ch++){ if (ch>=4 && ch<=63){ beamSignal_1 += channelamp[ch]; //integrate the signal around the peak channel
channelamp_smooth[numtocalc] = channelamp[ch] - beamSidebandNoise_1 ; beamSignal_1 += channelamp[ch]- beamSidebandNoise_1 ; //integrate the signal around the peak channel
channellist_gsl[numtocalc] = ch; numtocalc++; } }
// if (ic1_1<=5 && ic2_1<=5 && jentry<1000) { cout << beamSignal_1 << " "<<(time_1)<<" " << bkgfunc->Eval((time_1)) << endl; }
// beamSignal_1 -= bkgfunc->Eval(time_1);
//statistical analysis of the beam position
// FFTsmoothing(channelamp_smooth);//Fourier transform smoothing
beamPosX_1 = gsl_stats_wmean(channelamp_smooth,1,channellist_gsl,1,numtocalc); //calculate the weighted mean
beamFocusX_1 = gsl_stats_wsd_with_fixed_mean(channelamp_smooth,1,channellist_gsl,1,numtocalc,beamPosX_1); //SD
beamSkewX_1 = gsl_stats_wskew_m_sd(channelamp_smooth,1,channellist_gsl,1,numtocalc,beamPosX_1,beamFocusX_1); //skewness (symmetry)
beamKurtX_1 = gsl_stats_wkurtosis_m_sd(channelamp_smooth,1,channellist_gsl,1,numtocalc,beamPosX_1,beamFocusX_1); //excess kurtosis (well behaved tails)
beamNumX_1 = numtocalc; beamFocusX_1 *=2.3548;//SD-->FWHM
if (ic1_1>0.01 && beamSignal_1>5) th2d_mw1_beamPosX->Fill(mw1_posx_1,beamPosX_1); if (ic1_1>0.01 && beamSignal_1>5) th2d_ic1_beamSignal->Fill(ic1_1,beamSignal_1); if (ic1_1>0.01 && beamSignal_1>5) th1d_beamSignal_ic1ratio->Fill(beamSignal_1/ic1_1);
//fit with a gaussian function;
if (beamon==1){ if (numtocalc>10&&numtocalc<50){ gausfunc->SetParameters(beamSignal_1/(sqrt(2)*beamFocusX_1/2.3548),beamPosX_1,beamFocusX_1/2.3548,0.); gausfunc2->SetParameters(beamSignal_1/(sqrt(2)*beamFocusX_1/2.3548),beamPosX_1,beamFocusX_1/2.3548,beamSignal_1/(10*sqrt(2)*beamFocusX_1/2.3548),2*beamFocusX_1/2.3548,0.); } else{ gausfunc->SetParameters(500.,32.,10.,0.); gausfunc2->SetParameters(500.,32,5.0,50.,10.0,0.);
} gausfunc->SetParLimits(0,0.,10000.); gausfunc->SetParLimits(1,10.,50.); gausfunc->SetParLimits(2,0.5,30.); gausfunc->SetParLimits(3,-150.,150.);
gausfunc2->SetParLimits(0,0.,10000.); gausfunc2->SetParLimits(1,0.,64.); gausfunc2->SetParLimits(2,0.5,50.); gausfunc2->SetParLimits(3,0.,500.); gausfunc2->SetParLimits(4,1.5,50.); gausfunc2->SetParLimits(5,-150.,150.);
gausgraph = new TGraphErrors(64,channellist,channelamp,errorx,errory); lastfit = gausgraph->Fit(gausfunc,"QRN","",4,60); // single gaussian fit
if (beamon && savegraph && waitcounter>5000) { gausgraph->SetName("example"); gausgraph->SetTitle("example"); gausgraph->Write(); gausfunc->Write(); cout << "Example data saved" << endl; savegraph = false; } // lastfit2 = gausgraph->Fit(gausfunc2,"QR","",4,60);// two gaussian fit
beamPosX_fit = gausfunc->GetParameter(1); beamFocusX_fit =2.3548* gausfunc->GetParameter(2); beamChi2_fit = gausfunc->GetChisquare()/gausfunc->GetNDF(); beamPeakX_fit = gausfunc->GetParameter(0);
beamPosX_fit2 = gausfunc2->GetParameter(1); beamFocusX_fit2 =2.3548* gausfunc2->GetParameter(2); beamFocus2X_fit2 =2.3548* gausfunc2->GetParameter(4); beamChi2_fit2 = gausfunc2->GetChisquare()/gausfunc->GetNDF(); beamPeakX_fit2 = gausfunc2->GetParameter(0); beamPeak2X_fit2 = gausfunc2->GetParameter(3);
for (int ch = 4; ch < 64; ch++){ th2d_fitdiff_channel->Fill(ch, double(channelamp[ch]-gausfunc->Eval(ch))); th2d_fit2diff_channel->Fill(ch, double(channelamp[ch]-gausfunc2->Eval(ch))); } } newdata->Fill();
} TVectorD v(10); v[0] = totalcurrent; v[1] = totaltime; v.Write("icinfo"); th2d_mw1_beamPosX->Write(); th2d_ic1_beamSignal->Write(); th1d_beamSignal_ic1ratio->Write(); th2d_beamSignal_channel->Write(); th2d_bkg_channel->Write(); th2d_fitdiff_channel->Write(); th2d_PhaseFFT_channel->Write(); th2d_AmpFFT_channel->Write(); newdata->Write(); }
int main(int argc, char **argv) { // Working directories
const char *dirname = "/work/leverington/beamprofilemonitor/hitdata/HIT_26-11-2016/with_timestamp/"; const char *pin_dirname = "/work/leverington/beamprofilemonitor/hitdata/HIT_26-11-2016/with_timestamp/pin/"; const char *ext = ".root"; TSystemDirectory pin_dir(pin_dirname, pin_dirname);
if (true) { TSystemFile* file; TString fname = argv[1];
// fname = file->GetName();
// execute single PiN_run***.root
if ( fname.EndsWith(ext) && !fname.BeginsWith("SAVE") && fname.BeginsWith("PiN_run")) { analyse2 *mon = new analyse2(); printf("File name: %s \n", fname.Data());
// Main part
// Initialize(DIRName, FileName, baselineEvents, prelimEvents, beamLevel, firstFibermat, readOutFrequency in Hz, integrationTime in us)
mon->Initialize(dirname, fname.Data(), 3200, 10000, 1., true, 3000., 0.); mon->Baseline(true,1000,1,true); mon->Loop(); //analysis loop
// cout << th2d_mw1_beamPosX->GetCorrelationFactor() << endl;
mon->Save();//save output tree file
// mon->Close();//close output tree file
delete mon; } } return 0; }
|