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.