Raw signal processing show macro
// Made by A.Olszewski on 10.03.1999
// From electronics map database
// creates FECDetector and initializes electronics parameters
// From raw data (in this particular case Test Beam 98):
// creates standard Phat events
// calculates pedestals, common mode noise, noise.
// does zero-suppression
// calibrates
// makes hit arrays and hits
// Writes events to file
// Plots histograms of the calculated quantities
run(Char_t *inputfilename=0, Int_t runno=0, Int_t evnts=1000, Int_t skipevents=0)
{
Int_t verbose = 0;
// Frequency of histogram updates
Int_t kSingleUpdate = 1, kSummaryUpdate = 10;
// Frequency of having a chance to interactively look at canvases
Int_t kLook = 1000;
// INPUT file
//-----------
if(!inputfilename) {
printf("Call run(filename,runno,evnts,skip) with the input file name as a parametern");
return;
}
TPhBT98DST *bt = NULL;
bt = new TPhBT98DST(inputfilename,skipevents,runno);
bt->SetVerbose(verbose);
if( !bt->IsInitialized() ) {
printf("Input file: %s - has not been foundn",inputfilename);
return;
}
// Get TB98 detector
//------------------
TPhDetector *det;
TPhDetector::DeleteInstance();
const Char_t *phathome = gSystem->Getenv("PHATHOME");
Char_t detpath[100];
sprintf(detpath,"%s/init/Detector_TB98.root",phathome);
TFile *detfile = new TFile(detpath);
det = (TPhDetector *) detfile->Get("TB98_V1.0");
// Open histograms output
//-----------------------
Char_t hisfilname[100];
Char_t *basename;
TH1F *his;
basename = gSystem->BaseName(inputfilename);
sprintf(hisfilname,"%s_%d_%d.zss.root",basename,skipevents,evnts);
TFile *hisf = new TFile(hisfilname,"create");
if(!hisf->IsOpen()) hisf = new TFile(hisfilname,"recreate");
// Open output with hits
//-----------------------
Char_t hitfilname[100];
Char_t *basename;
basename = gSystem->BaseName(inputfilename);
sprintf(hitfilname,"%s_%d_%d.root",basename,skipevents,evnts);
TFile *hitf = new TFile(hitfilname,"create");
if(!hitf->IsOpen()) hitf = new TFile(hitfilname,"recreate");
TPhFECDetector *fecd;
TPhFEC *fec;
TPhString *str;
Int_t strit;
Int_t nstr = 16;
Int_t fecno[nstr] = { 0,0,0,0,1,1,1,1,8,8,8,8,9,9,9,9 };
Int_t strno[nstr] = { 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3 };
// Build electronics structures
det->BuildFECDetector();
fecd = det->GetFECDetector();
fecd->SetVerboseDown(verbose);
// Set parameters for the signal processing routines
fecd->SetMIN_NUM_PED_EVENTS(300);
fecd->SetMIPADC_CUTOFF(20);
fecd->SetMIN_CHANNELS_CMN_EST(5);
fecd->SetMIN_NUM_NOISE_EVENTS(300);
fecd->SetTHRESH_CMN(6);
fecd->SetTHRESH_MULTIPLIER(3);
fecd->SetDoHistograms(kTRUE);
gStyle->SetCanvasColor(18);
gStyle->SetHistFillColor(46);
gStyle->SetFrameFillColor(41);
TCanvas *ca0 = new TCanvas("ca0","",770,0,500,300);
TCanvas *ca1 = new TCanvas("ca1","",770,330,500,300);
TCanvas *ca2 = new TCanvas("ca2","",770,660,500,300);
TCanvas *ctrlcanvas;
TButton *wait1;
TButton *wait2;
TPhEvent *ev = NULL;
Bool_t status=kTRUE;
Char_t s[5];
// Pedestal pre-evaluation.
printf("Pedestal pre-evaluation.n");
// Histogram definitions, canvas preparation
ca0->Divide(2,1);
ca0->SetTitle("Histograms of pedestal pre-means for single channels");
ca1->SetTitle("Current pedestal pre-means for all channels");
ca2->SetTitle("Histogram of pedestal pre-means for all channels");
wait1 = new TButton("Waiting for results","",.05,.85,.45,.95);
wait2 = new TButton("Waiting for results","",.55,.85,.95,.95);
wait1->SetFillColor(50);
wait2->SetFillColor(50);
ca0->cd(1); wait1->Draw();
ca0->cd(2); wait2->Draw();
ca1->cd(); wait1->Draw(); wait2->Draw();
ca2->cd(); wait1->Draw(); wait2->Draw();
ca0->Update();
ca1->Update();
ca2->Update();
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// Book histograms for channels 259,260 and a summary of all channels
str->AddPedPreHistogram(259, 0, 1500, 150);
str->AddPedPreHistogram(260, 0, 1500, 150);
str->AddPedPreHistogram( -1, 0, 1500, 150);
}
Int_t i=0;
do {
if(ev) delete ev;
ev = bt->GetNextEvent();
if(!ev) {
printf("Pedestal pre-evaluation stopped due to a lack of datan");
return;
}
det->SetEvent(ev);
// printf("Ped-pre for event no %dn",i);
status = det->PedPreProcess("RawHitFECn0s");
if(status) {
// Print contents of the pdestal pre-evaluation buffers
// str->DumpEvents(40);
// str->DumpPedPreMean(300);
// Get histograms and Draw them on prepared pads
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// Draw histograms for single channels
if(!(i%kSingleUpdate)) {
ca0->cd(1);
str->DrawPedPreHistogram(259);
ca0->cd(2);
str->DrawPedPreHistogram(260);
ca0->Update();
ca1->cd();
str->DrawPedPreSHisto();
ca1->Update();
}
// Draw summary histograms
if(!(i%kSummaryUpdate)) {
ca2->cd();
str->DrawPedPreHistogram(-1);
ca2->Update();
}
if(!gROOT->IsBatch()) {
if(i && !(i%kLook)) {
// Take a look (you can even interact with canvases)
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
}
}
}
i++;
} while(!status || i<evnts);
if(ev) delete ev;
if(status) {
// Take a look (you can even interact with canvases)
if(!gROOT->IsBatch()) {
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
} else {
printf("Pedestal pre-evaluation unsuccessfuln");
return;
}
// Pedestal levels calculation.
// ----------------------------
printf("Pedestal levels calculation.n");
// Histogram definitions, canvas preparation
ca0->Clear();
ca1->Clear();
ca2->Clear();
ca0->Divide(2,1);
ca1->Divide(2,1);
ca2->Divide(2,1);
ca0->SetTitle("Histograms of pedestal mean and RMS for a single channel");
ca1->SetTitle("Current pedestal mean and RMS for all channels");
ca2->SetTitle("Histograms of pedestal mean and RMS for all channels");
wait1 = new TButton("Waiting for results","",.05,.85,.45,.95);
wait2 = new TButton("Waiting for results","",.55,.85,.95,.95);
wait1->SetFillColor(50);
wait2->SetFillColor(50);
ca0->cd(1); wait1->Draw();
ca0->cd(2); wait2->Draw();
ca1->cd(1); wait1->Draw();
ca1->cd(2); wait2->Draw();
ca2->cd(1); wait1->Draw();
ca2->cd(2); wait2->Draw();
ca0->Update();
ca1->Update();
ca2->Update();
// Book histograms of pedestal mean and RMS
// for channels 386 and a summary of all channels
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
str->AddPedMeanHistogram(386, 0, 1500, 150);
str->AddPedRMSHistogram(386, 2, 7, 100);
str->AddPedMeanHistogram(-1, 0, 1500, 150);
str->AddPedRMSHistogram(-1, 0, 10, 200);
}
i=0;
do {
if(ev) delete ev;
ev = bt->GetNextEvent();
if(!ev) {
printf("Pedestal evaluation stopped due to a lack of datan");
return;
}
det->SetEvent(ev);
// printf("Ped for event no %dn",i);
status = det->PedProcess("RawHitFECn0s");
if(status) {
// Print contents of the pedestal buffers
// str->DumpEvents(40);
// str->DumpPedMean(40);
// str->DumpPedRMS(40);
// Get histograms and Draw them on prepared pads
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// Draw histograms for single channels
if(!(i%kSingleUpdate)) {
ca0->cd(1);
str->DrawPedMeanHistogram(386);
ca0->cd(2);
str->DrawPedRMSHistogram(386);
ca0->Update();
ca1->cd(1);
str->DrawPedMeanSHisto();
ca1->cd(2);
str->DrawPedRMSSHisto();
ca1->Update();
}
// Draw summary histograms
if(!(i%kSummaryUpdate)) {
ca2->cd(1);
str->DrawPedMeanHistogram(-1);
ca2->cd(2);
str->DrawPedRMSHistogram(-1);
ca2->Update();
}
if(!gROOT->IsBatch()) {
if(i && !(i%kLook)) {
// Take a look (you can even interact with canvases)
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
}
}
}
i++;
} while(!status || i<evnts);
if(ev) delete ev;
if(status) {
// Take a look (you can even interact with canvases)
if(!gROOT->IsBatch()) {
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
} else {
printf("Pedestal evaluation unsuccessfuln");
return;
}
// CMN and Noise calculation.
// --------------------------
printf("CMN and Noise calculation.n");
// Histogram definitions, canvas preparation
// On canvas 0 the CMN situation is be shown
// (event by event - pad 1, and histogram of means - pad 2)
// On canvas 1 distributions of CMN and Noise for all chips/channels are shown
// On canvas 2 distributions of CMN/Noise averages
// for all chips/channels is shown
ca0->Clear();
ca1->Clear();
ca2->Clear();
ca0->Divide(2,1);
ca1->Divide(2,1);
ca2->Divide(2,1);
ca0->SetTitle("Distribution of signals on one chip, Histogram of noise for a single channel");
ca1->SetTitle("Distributions of CMN means and noise - for all chips/channels");
ca2->SetTitle("Histograms of CMN means and noise for all chips/channels");
wait1 = new TButton("Waiting for results","",.05,.85,.45,.95);
wait2 = new TButton("Waiting for results","",.55,.85,.95,.95);
wait1->SetFillColor(50);
wait2->SetFillColor(50);
ca0->cd(1); wait1->Draw();
ca0->cd(2); wait2->Draw();
ca1->cd(1); wait1->Draw();
ca1->cd(2); wait2->Draw();
ca2->cd(1); wait1->Draw();
ca2->cd(2); wait2->Draw();
ca0->Update();
ca1->Update();
ca2->Update();
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// CMNEvent shows situation in every event processed
str->AddCMNEventHistogram(2, -10, 10, 100);
// CMNMean shows averages over many events processed
str->AddCMNMeanHistogram(2, -10, 10, 100);
str->AddCMNMeanHistogram(-1, -10, 10, 100);
str->AddNoiseHistogram(327, 0, 10, 100);
str->AddNoiseHistogram(-1, 0, 10, 100);
}
Bool_t cmnstatus;
Bool_t noisestatus;
Int_t i=0;
do {
if(ev) delete ev;
ev = bt->GetNextEvent();
if(!ev) {
printf("CMN/Noise evaluation stopped due to a lack of datan");
return;
}
// Compatibility of detector structures not checked for
det->SetEvent(ev);
// Compatibility of structures checked for
// but not used in case of a Test Beam data
// since these data ARE incompatible
if(i==1)
det->CompatibilityCheck("RawHitFECn0s");
// printf("CMN for event no %dn",i);
cmnstatus = kFALSE;
noisestatus = kFALSE;
cmnstatus = det->CMNProcess("RawHitFECn0s");
// Print contents of the CMN buffer
// str->DumpCMNFlag(200);
// str->DumpCMNMean(200);
if(cmnstatus) {
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// Draw histograms for single channels
if(!(i%kSingleUpdate)) {
ca0->cd(1);
str->DrawCMNEventHistogram(2);
ca0->Update();
ca1->cd(1);
str->DrawCMNMeanSHisto();
ca1->Update();
}
// Draw summary histograms
if(!(i%kSummaryUpdate)) {
ca2->cd(1);
str->DrawCMNMeanHistogram(-1);
ca2->Update();
}
}
}
else
printf("CMN evaluation unsuccessfuln");
if(cmnstatus) {
// printf("Noise for event no %dn",i);
noisestatus = det->NoiseProcess("RawHitFECn0s");
if(noisestatus) {
// Print contents of the noise buffer
// str->DumpNoise(40);
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// Draw histograms for single channels
if(!(i%kSingleUpdate)) {
ca0->cd(2);
str->DrawNoiseHistogram(327);
ca0->Update();
ca1->cd(2);
str->DrawNoiseSHisto();
ca1->Update();
}
// Draw summary histograms
if(!(i%kSummaryUpdate)) {
ca2->cd(2);
str->DrawNoiseHistogram(-1);
ca2->Update();
}
if(!gROOT->IsBatch()) {
if(i && !(i%kLook)) {
// Take a look (you can even interact with canvases)
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
}
}
}
}
i++;
} while(!noisestatus || i<evnts);
if(noisestatus) {
// Take a look (you can even interact with canvases)
if(!gROOT->IsBatch()) {
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
} else {
printf("Noise evaluation unsuccessfuln");
return;
}
printf("Readin calibration data base.n");
// the following reads only to "channel" objects
// fecd->ReadCalibrationTB98File("calbase.cal");
// -----------------------
// the next is reading into "channel" objects and
// constructs summary string calibration objects out of them
// fecd->ReadinStringCalibrationTB98File("calbase.cal");
// -------------------------------
// one of the two above functions may be put into
// the high level TPhDetector::ReadInCalibration function
// ------------------------------
// at present it is a ReadinStringCalibrationTB98File function
// constructing now (redundantly) both types of calibration objects
// return status is FALSE since FEC structure does not match TB98 setup
Char_t calpath[100];
sprintf(calpath,"%s/init/cal021.par",phathome);
status = det->ReadInCalibration(calpath);
sprintf(calpath,"%s/init/cal022sim.par",phathome);
status = det->ReadInCalibration(calpath);
sprintf(calpath,"%s/init/cal023sim.par",phathome);
status = det->ReadInCalibration(calpath);
sprintf(calpath,"%s/init/cal024sim.par",phathome);
status = det->ReadInCalibration(calpath);
// Zero suppression calculation.
// ----------------------------
printf("Zero suppression calculation.n");
// One may start zero-suppressing from the beginning of the data file
// dst->Reset();
// Histogram definitions, canvas preparation
// On canvas 0 the current Pedestal and CMN means are shown
// (constantly updated during ZSS processing)
// On canvas 1 histograms of Pedestal means and CMN values are shown
// On canvas 2 current set of ADC hit values is shown at the appropriate channel numbers
// after ZSS and after Calibration
ca0->Clear();
ca1->Clear();
ca2->Clear();
ca0->Divide(2,1);
ca1->Divide(2,1);
ca2->Divide(2,1);
ca0->SetTitle("Distributions of CMN means and noise - for all chips/channels");
ca1->SetTitle("Histograms of CMN means and noise for all chips/channels");
ca2->SetTitle("Distribution of signals after ZSS and calibration");
wait1 = new TButton("Waiting for results","",.05,.85,.45,.95);
wait2 = new TButton("Waiting for results","",.55,.85,.95,.95);
wait1->SetFillColor(50);
wait2->SetFillColor(50);
ca0->cd(1); wait1->Draw();
ca0->cd(2); wait2->Draw();
ca1->cd(1); wait1->Draw();
ca1->cd(2); wait2->Draw();
ca2->cd(1); wait1->Draw();
ca2->cd(2); wait2->Draw();
ca0->Update();
ca1->Update();
ca2->Update();
for(strit=0;strit<nstr;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
str->DeleteHistograms();
str->AddPedMeanHistogram(-1, 0, 1500, 150);
str->AddNoiseHistogram(-1, 0, 10, 100);
str->AddZSSHistogram(-1, -100, 100, 200);
str->AddCalHistogram(-1, -100, 900, 200);
}
TPhAbsDataContainer *hc;
Bool_t zssstatus=kTRUE;
Bool_t calstatus=kTRUE;
Int_t i=0;
do {
ev = bt->GetNextEvent();
if(!ev) {
printf("Zero suppression stopped due to a lack of datan");
return;
}
det->SetEvent(ev);
cmnstatus = det->CMNProcess("RawHitFECn0s");
if(!cmnstatus)
if(fVerbose) printf("Irregular CMN Event#%04dn",i);
// There are two paths one can proceed currently to
// zero-suppress and calibrate raw data
// 1) working with internal buffers for storing intermediate results
// (possibility to work with a higher precision storage)
// 2) produce zero-supressed TPhRawHitFECs0 objects and later calibrate
// these produced objects
// Both ways are shown below
// Zero-suppress and put into zero-suppressed rawhitFECs
zssstatus = det->MakeRawHitFECs0("RawHitFECn0s", "RawHitFECs0s");
// Zero-suppress and store into internal buffer
// zssstatus = det->ZeroSuppress("RawHitFECn0s");
if(zssstatus) {
// printf("ZSS for event no %dn",i);
// Dump contents of the internal buffers storing zero-suppressed hits
// str->DumpZSSHitChan(30);
// str->DumpZSSHitADC(30);
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
// Draw histograms for single channels
if(!(i%kSingleUpdate)) {
ca0->cd(1);
str->DrawPedMeanSHisto();
ca0->cd(2);
str->DrawNoiseSHisto();
ca0->Update();
}
// Draw summary histograms
if(!(i%kSummaryUpdate)) {
ca1->cd(1);
str->DrawPedMeanHistogram(-1);
ca1->cd(2);
str->DrawNoiseHistogram(-1);
ca1->Update();
ca2->cd(1);
str->DrawZSSHistogram(-1);
ca2->Update();
}
}
} else
printf("ZSS failed.n");
if(zssstatus) {
// One can create hitarrays after zero-suppression, even without calibration
// if one is interested (for octagon sensors?)
// -------------------------------------------
// printf("Making hit arrays after ZSS for the event no %d.n",i);
// Use internal buffers to create hit arrays and hits after zero suppression
// det->MakeHitArrays("HitArraysSuppressed");
// det->MakeHitsOutOfHitArrays("HitArraysSuppressed","HitsSuppressed");
// Use event zero-suppressed buffers to create hit arrays and hits
// det->MakeHitArrays("RawHitFECs0s", "HitArraysFromRawHitFECs0");
// det->MakeHitsOutOfHitArrays("HitArraysFromRawHitFECs0","HitsFromRawHitFECs0");
// printf("Calibrating event no %d.n",i);
// Calibrate internal buffers
// fecd->Calibrate(calstatus);
// Calibrate zero-suppressed TPhRawHitFECs0 objects in the event container
// (depeneding on the function called in the CalibrateRawHitFECs0 function
// one may be using here calibration at the string or the channel level
calstatus = det->MakeCalRawHitFECs0("RawHitFECs0s","CalRawHitFECs0s");
if(calstatus) {
// printf("ZSS buffer after calibration for event no %dn",i);
// Dump contents of the internal buffers storing zero-suppressed,
// calibrated hits
// str->DumpZSSHitChan(30);
// str->DumpZSSHitADC(30);
for(strit=0;strit<1;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
if(!(i%kSingleUpdate)) {
}
// Draw summary histograms
if(!(i%kSummaryUpdate)) {
ca2->cd(2);
str->DrawCalHistogram(-1);
}
}
} else {
// printf("Calibration failedn");
}
}
// printf("Making hit arrays after calibration for event no %d.n",i);
// from the calibrated internal buffers
// if(calstatus) det->MakeHitArrays("HitArraysCalibrated");
// printf("Making hit arrays after calibration for event no %d.n",i);
// if(calstatus) det->MakeHitsOutOfHitArrays("HitArraysCalibrated","HitsCalibrated");
// printf("Making hit arrays after calibration for event no %d.n",i);
// from the calibrated zero-suppressed event hit buffers
if(calstatus) det->MakeHitArrays("CalRawHitFECs0s", "HitArraysFromCalRawHitFECs0s");
// printf("Making hit arrays after calibration for event no %d.n",i);
if(calstatus) det->MakeHitsOutOfHitArrays("HitArraysFromCalRawHitFECs0s","HitsCalibrated");
// List event after zero suppression and calibration,
// but first remove raw data container, to suppress large printout
hc = (TPhAbsDataContainer *) ev->GetObject("RawHitFECn0s");
ev->RemoveObject(hc);
delete hc;
// ev->Print("3");
if(!gROOT->IsBatch()) {
if(i && !(i%kLook)) {
// Take a look (you can even interact with canvases)
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
}
// Writeout event to a file
hitf->cd();
ev->Write();
delete ev;
} while((i++)<evnts);
// Take a look (you can even interact with canvases)
if(!gROOT->IsBatch()) {
ctrlcanvas = new TCanvas("ctrlcanvas","Close this canvas to continue", 400, 30);
while( gROOT->GetListOfCanvases()->FindObject(ctrlcanvas) ) gSystem->InnerLoop();
}
delete ca0;
delete ca1;
delete ca2;
ca1 = new TCanvas("ca0","Zero-suppressed ADC distributions",350,0,800,700);
ca1->Divide(4,4);
ca2 = new TCanvas("ca1","Calibrated ADC distributions",400,100,800,700);
ca2->Divide(4,4);
// Draw and store final results
for(strit=0;strit<nstr;strit++) {
str = fecd->GetString(fecno[strit],strno[strit]);
ca1->cd(strit+1);
str->DrawZSSHistogram(-1);
ca2->cd(strit+1);
str->DrawCalHistogram(-1);
ca1->Update();
ca2->Update();
hisf->cd();
his = NULL;
his = str->GetZSSHistogram(-1);
if(his) his->Write();
his = NULL;
his = str->GetCalHistogram(-1);
if(his) his->Write();
}
}
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.