]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Class for online monitoring of BeamTests
authorschutz <schutz@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 29 Sep 2004 10:02:56 +0000 (10:02 +0000)
committerschutz <schutz@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 29 Sep 2004 10:02:56 +0000 (10:02 +0000)
PHOS/AliPHOSOnlineMonitor.cxx [new file with mode: 0644]
PHOS/AliPHOSOnlineMonitor.h [new file with mode: 0644]

diff --git a/PHOS/AliPHOSOnlineMonitor.cxx b/PHOS/AliPHOSOnlineMonitor.cxx
new file mode 100644 (file)
index 0000000..cb24b8b
--- /dev/null
@@ -0,0 +1,738 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+//_________________________________________________________________________
+// Class intended to perform online monitoring of PHOS beamtests
+// Being constructed, produces menu with list of available histograms to fill
+// Once histograms are selected, button "Go" should be pressed to start scan of data.
+// Prepared histograms will be periodically updated during scan of the data.
+// Note:
+// 1. To plot most of histograms, a "Connection Table", relating ADC signal index and AbsId 
+//    of PHOS crystal, should be created beforehand. To do this, call macro
+//       $ALICE_ROOT/PHOS/macros/BeamTest/MakeConTableDB.C 
+//    with apropriate number of raws and columns of prototype.
+// 2. To perform reconstruction and e.g. invariant mass analysis, a "Calibration Database"
+//    should be created beforehand. To do this, call macro 
+//       $ALICE_ROOT/PHOS/macros/BeamTest/MakeConTableDB.C 
+//    to read calibration parameters from file or use AliPHOSCalibrator to calculate 
+//    pedestal and gains.
+// 3. Once histograms are filled with "Go" method, they can be written to file
+//    with WriteHisto("Filename.root") method. 
+//
+//*-- Author : D.Peressounko (RRC KI) after A.V. Kuryakin, (Sarov) 
+//////////////////////////////////////////////////////////////////////////////
+
+// --- ROOT system ---
+#include "TROOT.h"
+#include "TClonesArray.h"
+#include "TCanvas.h"
+#include "TH1.h"
+#include "TH2.h"
+#include "TGroupButton.h"
+#include "TFile.h"
+#include "TSystem.h"
+
+
+// --- Standard library ---
+#include "TBenchmark.h"
+#include "Riostream.h"
+
+// --- AliRoot header files ---
+#include "AliPHOSOnlineMonitor.h"
+#include "AliPHOSConTableDB.h"
+#include "AliPHOSGeometry.h"
+#include "AliPHOSRawReaderDate.h"
+#include "AliPHOSRawStream.h"
+#include "AliPHOSDigit.h"
+#include "AliPHOSGetterLight.h"  
+#include "AliPHOSClusterizerv1.h"  
+#include "AliPHOSTrackSegmentMakerv1.h"  
+#include "AliPHOSPIDv1.h"  
+#include "AliPHOSCalibrManager.h" 
+#include "AliPHOSCalibrationDB.h"
+
+ClassImp(AliPHOSOnlineMonitor)
+
+
+//____________________________________________________________________________ 
+AliPHOSOnlineMonitor::AliPHOSOnlineMonitor(): TDialogCanvas("PHOS","PHOS",150,300)
+{
+  
+  MakeButtons() ;
+  Modified(kTRUE);
+  Update();
+  SetEditable(kFALSE);
+  
+  //add this TFitPanel to the list of cleanups such that in case
+  //the referenced object is deleted, its pointer be reset
+  gROOT->GetListOfCleanups()->Add(this);
+  
+  fRefObject = this;
+  fRefPad    = (TPad*)gROOT->GetSelectedPad();
+
+  fScanPed = 0 ;
+  fScanSig = 0; 
+  fReconstruct = 0 ;
+
+  //Prepare list of canvas with histograms
+  fCanvasList = new TList() ;
+  fHistosList = new TList() ;
+
+  fcdb = 0 ;
+  fGeom = AliPHOSGeometry::GetInstance("IHEP","") ;
+  fNUpdate = 1000 ;
+
+}
+//____________________________________________________________________________ 
+AliPHOSOnlineMonitor::AliPHOSOnlineMonitor(const char * inputfile): TDialogCanvas("PHOS","PHOS",150,300)
+{
+
+  MakeButtons() ;
+  Modified(kTRUE);
+  Update();
+  SetEditable(kFALSE);
+  
+  //add this TFitPanel to the list of cleanups such that in case
+  //the referenced object is deleted, its pointer be reset
+  gROOT->GetListOfCleanups()->Add(this);
+  
+  fRefObject = this;
+  fRefPad    = (TPad*)gROOT->GetSelectedPad();
+
+  fScanPed = 0 ;
+  fScanSig = 0; 
+  fReconstruct = 0 ;
+
+  //Prepare list of canvas with histograms
+  fCanvasList = new TList() ;
+  fHistosList = new TList() ;
+
+  fInputFile = inputfile ;
+  fGeom = AliPHOSGeometry::GetInstance("IHEP","") ;
+  fcdb = 0 ;
+  fNUpdate = 1000 ;
+
+}
+//____________________________________________________________________________ 
+  AliPHOSOnlineMonitor::~AliPHOSOnlineMonitor()
+{
+  //Obvious, but unevoidable comment for destructor: cleans up everething.
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  while((c=(TCanvas*)nextCanvas()))
+    delete c ;
+  delete fCanvasList ;
+  
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  while((h=(TH1D*)nextHisto()))
+    delete h ;
+  delete fHistosList ; 
+
+  if(fcdb)
+    delete fcdb ;
+
+}
+//____________________________________________________________________________ 
+void AliPHOSOnlineMonitor::MakeButtons(void){
+  //Make buttons on graphical menu
+  Int_t nButtons = 16;
+  TGroupButton * b ;
+  Float_t xmin = 0.0;
+  Float_t ymin = 0.01;
+  Float_t xmax = 0.99;
+  Float_t ymax = 0.99;
+  Float_t dy = (ymax-ymin)/nButtons ;
+
+  Float_t y2=ymax ;
+  Float_t y1=y2-dy ;
+  b = new TGroupButton("APPLY","Triggers","",xmin,y1,xmax,y2);
+  b->Draw();
+  y2=y1 ;
+  y1=y1-dy ;
+  b = new TGroupButton("APPLY","Pedestals","",xmin,y1,xmax,y2);
+  b->Draw();
+  y2=y1 ;
+  y1=y1-dy ;
+  b = new TGroupButton("APPLY","Spectrum all","",xmin,y1,xmax,y2);
+  b->Draw();
+  y2=y1 ;
+  y1=y1-dy ;
+  b = new TGroupButton("APPLY","Spectrum g","",xmin,y1,xmax,y2);
+  b->Draw();
+  y2=y1 ;
+  y1=y1-dy ;
+  b = new TGroupButton("APPLY","Inv Mass","",xmin,y1,xmax,y2);
+  b->Draw();
+  for(Int_t i=1; i<=5; i++){
+    y2=y1 ;
+    y1=y1-dy ;
+    char name[10] ;
+    sprintf(name,"Edep(ADC) %d",i) ;
+    b = new TGroupButton("APPLY",name,"",xmin,y1,xmax,y2);
+    b->Draw();
+  }
+  for(Int_t i=1; i<=5; i++){
+    y2=y1 ;
+    y1=y1-dy ;
+    char name[10] ;
+    sprintf(name,"Edep(Cal) %d",i) ;
+    b = new TGroupButton("APPLY",name,"",xmin,y1,xmax,y2);
+    b->Draw();
+  }
+  y2=y1 ;
+  y1=y1-dy ;
+  b = new TGroupButton("APPLY","Go","",xmin,y1,xmax,y2);
+  b->SetTextColor(2);
+  b->Draw();
+}
+//____________________________________________________________________________ 
+void AliPHOSOnlineMonitor::Apply(const char *action){
+  //Function to handle button actions
+
+  TDialogCanvas::Apply() ;
+
+  TObject *obj;
+  TGroupButton *button;
+  TIter next(fPrimitives);
+  
+  if (!strcmp(action,"Triggers")) {
+    DrawTriggers() ;
+  }
+
+  if (!strcmp(action,"Pedestals")) {
+    DrawPedestals() ;
+  }
+  if (!strcmp(action,"Spectrum all")) {
+    DrawSpectrum("all") ;
+  }
+  if (!strcmp(action,"Spectrum g")) {
+    DrawSpectrum("gamma") ;
+  }
+  if (!strcmp(action,"Inv Mass")) {
+    DrawMinv() ;
+  }
+  if(strstr(action,"Edep")){
+    Int_t n ;
+    char tmp[10] ;
+    sscanf(action,"%s %d",tmp,&n) ;
+    char opt[5]="" ;
+    if(strstr(action,"Cal"))
+      sprintf(opt,"Cal") ;
+    DrawEdep(n,opt) ;
+  }
+  if (!strcmp(action,"Go")) {
+    Go() ;
+  }
+
+  //Mark button as pressed
+  if(strcmp(action,"Go")){ //Do not mark "Go" button
+    while ((obj = next())) {
+      if (obj->InheritsFrom(TGroupButton::Class())) {
+       button = (TGroupButton*)obj;
+       if(!strcmp(button->GetTitle(),action)){
+         if (button->GetBorderMode() > 0){
+           button->SetBorderMode(-1) ;
+           button->Modified(kTRUE);
+         }
+       }
+      }
+    }
+  }
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::SetInputFile(const char * filename){
+  //close previously opened
+  
+  fInputFile = filename ;
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::DrawPedestals(){
+  //Prepare canvas and histograms for drawing pedestals
+
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  Bool_t exists = kFALSE ;
+  while((c=(TCanvas*)nextCanvas())){
+    if(!strcmp(c->GetName(),"Pedestals")){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    c = new TDialogCanvas("Pedestals","Pedestals",300,200) ;
+    fCanvasList->AddLast(c) ;
+  }
+  
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  exists = kFALSE ;
+  while((h=(TH1D*)nextHisto())){
+    if(!strcmp(h->GetName(),"hPedestals")){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    h = new TH1D("hPedestals","Pedestals per event",fGeom->GetNModules()*fGeom->GetNCristalsInModule(),0.,
+                1.*fGeom->GetNModules()*fGeom->GetNCristalsInModule()) ;
+    fHistosList->AddLast(h) ;
+  }
+  
+  c->cd() ;
+  h->SetStats(0) ;
+  h->Draw() ;
+  fScanPed = kTRUE ; //We will scan pedestals
+
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::DrawTriggers(){
+  //Prepare canvas and histogram for drawing triggers
+
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  Bool_t exists = kFALSE ;
+  while((c=(TCanvas*)nextCanvas())){
+    if(!strcmp(c->GetName(),"Triggers")){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    c = new TDialogCanvas("Triggers","Triggers",200,200) ;
+    fCanvasList->AddLast(c) ;
+  }
+  
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  exists = kFALSE ;
+  while((h=(TH1D*)nextHisto())){
+    if(!strcmp(h->GetName(),"hTriggers")){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    h = new TH1D("hTriggers","Triggers",2,0.,2.) ;
+    fHistosList->AddLast(h) ;
+  }
+  //Make Labels
+  h->SetBit(TH1::kCanRebin);  
+  h->Fill("LED",0.0000001) ; 
+  h->Fill("PUL",0.0000001) ; 
+  h->Fill("PED",0.0000001) ; 
+  h->Fill("NEL",0.0000001) ; 
+  h->Fill("WEL",0.0000001) ; 
+  h->Fill("SOB",0.0000001) ; 
+  h->Fill("EOB",0.0000001) ; 
+  h->Fill("wrong",0.0000001) ;
+  h->LabelsOption("h");
+  h->LabelsDeflate();
+  h->SetStats(0) ;
+  c->cd() ;
+  h->Draw() ;
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::DrawSpectrum(const char * opt){
+  //Prepare canvas and histograms for drawing spectra of all reconstructed particles or photons
+
+  TString name("Spectrum") ;
+  name+=opt ;
+  
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  Bool_t exists = kFALSE ;
+  while((c=(TCanvas*)nextCanvas())){
+    if(!strcmp(c->GetName(),name.Data())){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    c = new TDialogCanvas(name,name,250,300) ;
+    fCanvasList->AddLast(c) ;
+  }
+  
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  exists = kFALSE ;
+  name.Prepend("h") ;
+  while((h=(TH1D*)nextHisto())){
+    if(!strcmp(h->GetName(),name.Data())){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    h = new TH1D(name,name,100,0.,100.) ;
+    fHistosList->AddLast(h) ;
+  }
+  
+  h->SetStats(0) ;
+  c->cd() ;
+  h->Draw() ;
+  fReconstruct = kTRUE ;
+  fScanSig = kTRUE ; //We will scan pedestals
+
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::DrawMinv(){
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  Bool_t exists = kFALSE ;
+  while((c=(TCanvas*)nextCanvas())){
+    if(!strcmp(c->GetName(),"InvMass")){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    c = new TDialogCanvas("InvMass","Invariant mass",300,200) ;
+    fCanvasList->AddLast(c) ;
+  }
+  
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  exists = kFALSE ;
+  while((h=(TH1D*)nextHisto())){
+    if(!strcmp(h->GetName(),"hInvMass")){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    h = new TH1D("hInvMass","hInvMass",1000,0.,1.0) ;
+    fHistosList->AddLast(h) ;
+  }
+  
+  c->cd() ;
+  h->Draw() ;
+  h->SetStats(0) ;
+  fReconstruct = kTRUE ;
+  fScanSig = kTRUE ; //We will scan pedestals
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::DrawEdep(Int_t mod,const char * opt){
+  char name[15] ;
+  sprintf(name,"Edep%s %d",opt,mod) ;
+
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  Bool_t exists = kFALSE ;
+  while((c=(TCanvas*)nextCanvas())){
+    if(!strcmp(c->GetName(),name)){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    c = new TDialogCanvas(name,name,300,200) ;
+    fCanvasList->AddLast(c) ;
+  }
+  
+  TIter nextHisto(fHistosList);
+  TH2D * h ;
+  exists = kFALSE ;
+  sprintf(name,"hEdep%s%d",opt,mod) ;
+  while((h=(TH2D*)nextHisto())){
+    if(!strcmp(h->GetName(),name)){
+      exists = kTRUE ;
+      break;
+    }
+  }
+  if(!exists){
+    h = new TH2D(name,name,fGeom->GetNPhi(),0.,1.*fGeom->GetNPhi(),fGeom->GetNZ(),0.,1.*fGeom->GetNZ()) ;
+    fHistosList->AddLast(h) ;
+  }
+  
+  c->cd() ;
+  h->Draw("col") ;
+  h->SetStats(0) ;
+  fScanSig = kTRUE ; //We will scan signal events
+  if(strstr(opt,"Cal"))
+    fReconstruct = kTRUE ;
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::ScanPedestals(TClonesArray * digits){
+  //This method is called for events with PED trigger
+  //We fill bins with ADC values
+
+  TH1D * h = (TH1D*)gROOT->FindObjectAny("hPedestals");
+  if(!h){
+    Error("ScanPedestals","Can not fild histogram hPedestals") ;
+    return ;
+  }
+  for(Int_t i=0; i<digits->GetEntriesFast(); i++){
+    AliPHOSDigit * dig = static_cast<AliPHOSDigit*>(digits->At(i)) ;
+    h->AddBinContent(dig->GetId(),dig->GetAmp()) ;
+  }
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::ScanEdep(TClonesArray * digits){
+  //Fill 2D distribution of ADC values in NEL and WEL events
+  AliPHOSGetter * gime = AliPHOSGetter::Instance() ;
+  AliPHOSCalibrationDB *cdb = 0 ;
+  if(gime)
+    cdb = gime->CalibrationDB() ;
+  Int_t mod = 0 ;
+  char name[15] ;
+  TH2D * h = 0 ;
+  TH2D * hCal = 0 ;
+  for(Int_t i=0; i<digits->GetEntriesFast(); i++){
+    AliPHOSDigit * dig = static_cast<AliPHOSDigit*>(digits->At(i)) ;
+    Int_t relId[4] ;
+    fGeom->AbsToRelNumbering(dig->GetId(),relId) ;
+    if(mod != relId[0]){ //new module, look for histograms
+      mod = relId[0] ;
+      sprintf(name,"hEdep%d",mod) ;
+      h = (TH2D*)gROOT->FindObjectAny(name);
+      sprintf(name,"hEdepCal%d",mod) ;
+      hCal = (TH2D*)gROOT->FindObjectAny(name);
+    }
+    if(h)
+      h->Fill(relId[2]-0.1,relId[3]-0.1,1.*dig->GetAmp()) ;
+    if(hCal)
+      hCal->Fill(relId[2]-0.1,relId[3]-0.1,cdb->Calibrate(dig->GetAmp(),dig->GetId())) ;
+  }
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::ScanRecon(TClonesArray * recParticles){
+  if(!recParticles || recParticles->GetEntries()==0) return ;
+
+  TH1D* hSpectr   = (TH1D*)gROOT->FindObjectAny("hSpectrumall");
+  TH1D* hSpectrGam= (TH1D*)gROOT->FindObjectAny("hSpectrumgamma");
+  TH1D* hInvMass  = (TH1D*)gROOT->FindObjectAny("hInvMass");
+  for(Int_t i=0; i<recParticles->GetEntriesFast() ; i++){
+    AliPHOSRecParticle * p = (AliPHOSRecParticle *)recParticles->At(i) ;
+    if(hSpectr)hSpectr->Fill(p->Energy()) ;
+    if(hSpectrGam && p->IsPhoton())hSpectrGam->Fill(p->Energy()) ;
+    if(hInvMass){
+      for(Int_t j=i+1; j<recParticles->GetEntriesFast() ; j++){
+       AliPHOSRecParticle * p2 = (AliPHOSRecParticle *)recParticles->At(j) ;
+       Double_t e = p->Energy() + p2->Energy() ;
+       Double_t x = p->Px() + p2->Px() ;
+       Double_t y = p->Py() + p2->Py() ;
+       Double_t z = p->Pz() + p2->Pz() ;
+       Double_t m = e*e-x*x-y*y-z*z ;
+       hInvMass->Fill(m>0?TMath::Sqrt(m): 0. ) ;
+      }
+    }
+  }
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::ScanTrigger(Int_t trig){
+  //Fills trigger distribution
+
+  TH1D * h = (TH1D*)gROOT->FindObjectAny("hTriggers");
+  if(!h) return ;
+  switch(trig){
+  case AliPHOSRawStream::kLED : h->Fill("LED",1.) ; break ;
+  case AliPHOSRawStream::kPUL : h->Fill("PUL",1.) ; break ;
+  case AliPHOSRawStream::kPED : h->Fill("PED",1.) ; break ;
+  case AliPHOSRawStream::kNEL : h->Fill("NEL",1.) ; break ;
+  case AliPHOSRawStream::kWEL : h->Fill("WEL",1.) ; break ;
+  case AliPHOSRawStream::kSOB : h->Fill("SOB",1.) ; break ;
+  case AliPHOSRawStream::kEOB : h->Fill("EOB",1.) ; break ;
+  default : h->Fill("wrong",1.) ;
+  }
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::SetConTableDB(const char * filename){
+  //Read ConnectionTableDB from file
+  TFile * file = new TFile(filename) ;
+  AliPHOSConTableDB * tmp = (AliPHOSConTableDB*)file->Get("AliPHOSConTableDB") ;
+  fcdb = new AliPHOSConTableDB(*tmp) ;
+  file->Close() ; 
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::Go(){
+  //Perform scan of curent event
+  gBenchmark->Start("PHOSOnlineMon"); 
+
+  //First test if we need "Connection table" then open it
+  if(!fcdb){
+    SetConTableDB() ;
+    if(fcdb){
+      Info("Go","Read Connection table from file \"ConTableDB.root\"") ;
+    }else{
+      Error("Go","Please, set connection table with SetConTableDB() method") ;
+      return ;
+    }
+  }
+
+  AliPHOSGetterLight * gime = AliPHOSGetterLight::Instance("PHOS","On Flight") ;
+
+  //Configure CalibrManager to read data from file
+  //Create calibration database and read it
+  AliPHOSCalibrationDB * calibDB = 0 ;
+  if(fScanSig || fReconstruct){ //We will ned calibration parameters
+    AliPHOSCalibrManager::GetInstance("CalibrDB.root","root") ;
+    //If we configured manager to read from ASCII file, 
+    //give him connection table. OK, it will not harm in any case.
+    AliPHOSCalibrManager::GetInstance()->SetConTable(fcdb) ;
+    
+    calibDB = new AliPHOSCalibrationDB("OnLine") ;
+    calibDB->GetParameters() ; //Read parameters using Manager
+    gime->SetCalibrationDB(calibDB) ;
+  }
+  
+  //Now open data file
+  AliPHOSRawReaderDate *rawReader = new AliPHOSRawReaderDate(fInputFile) ; 
+  AliPHOSRawStream     *rawStream = new AliPHOSRawStream(rawReader) ;
+  rawStream->SetConTableDB(fcdb) ;
+  
+  TClonesArray * digits = gime->Digits() ;
+  TClonesArray * recParticles = gime->RecParticles() ;
+  AliPHOSClusterizerv1* clu = 0 ;
+  AliPHOSTrackSegmentMakerv1 * tsm = 0 ;
+  AliPHOSPIDv1 * pid = 0 ;
+  if(fReconstruct){ //We will need calibation parameters
+    clu = new AliPHOSClusterizerv1("PHOS","On Flight") ;
+    clu->SetWriting(0) ; //Do not write to file
+    clu->SetEmcMinE(0.05) ;  //Minimal energy of the digit
+    clu->SetEmcLocalMaxCut(0.05) ; //Height of local maximum over environment
+    clu->SetEmcClusteringThreshold(0.2) ; //Minimal energy to start cluster
+//    clu->SetUnfolding(kFALSE) ; //Do not unfold
+    tsm = new AliPHOSTrackSegmentMakerv1("PHOS","On Flight") ;
+    tsm->SetWriting(0) ; //Do not write to file
+    pid = new AliPHOSPIDv1("PHOS","On Flight") ;
+    pid->SetWriting(0) ; //Do not write to file    
+  }
+  
+  fNevents=0 ;
+  //Scan all event in file
+  printf("      ") ;
+  while(rawReader->NextEvent()){
+    //Is it PHYSICAL event
+    if(rawReader->GetType() == PHYSICS_EVENT){
+      fNevents++ ;
+      if(fNevents%100 ==0){
+       printf("\b\b\b\b\b\b%6d",fNevents) ;
+      }
+      if(rawStream->ReadDigits(digits)){
+       
+       //Test trigger
+       //Pedestal Event
+       ScanTrigger(rawStream->GetTrigger()) ;
+       if(rawStream->IsPEDevent() && fScanPed){
+         ScanPedestals(digits) ;
+       }
+       if((rawStream->IsNELevent() || rawStream->IsWELevent()) && fScanSig){
+         ScanEdep(digits) ;
+         if(fReconstruct){
+           gime->Clusterizer()->Exec("") ;
+           gime->TrackSegmentMaker()->Exec("") ;
+           gime->PID()->Exec("") ;
+           ScanRecon(recParticles) ;
+         }
+       }
+      }
+      
+      if(fNevents%fNUpdate == 0 ){ //upate all histograms      
+       TIter nextCanvas(fCanvasList);
+       TCanvas * c ;
+       while((c=(TCanvas*)nextCanvas())){
+         c->Modified() ;
+         c->Update() ;
+       }
+      }
+      gSystem->ProcessEvents(); 
+    }
+    //    if(fNevents>=200)break ;
+  }
+  printf("\n") ;
+  gBenchmark->Stop("PHOSOnlineMon");
+  Float_t time = gBenchmark->GetCpuTime("PHOSOnlineMon") ;
+  printf("took %f seconds for scanning, i.e. %f seconds per event %d  \n",
+        time,time/fNevents,fNevents) ; 
+  
+  //Update canvas with histograms at the end
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  while((c=(TCanvas*)nextCanvas())){
+    c->Modified(kTRUE) ;
+  }
+  
+  if(clu)delete clu ;
+  if(tsm)delete tsm ;
+  if(pid)delete pid ;
+  printf("delete 1 \n") ;
+  if(calibDB) delete calibDB ;
+  delete rawStream ;
+  delete rawReader ;
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::Clean(){
+  //Cleans content of all histograms
+
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  while((h=(TH1D*)nextHisto())){
+    h->Reset("ISE") ;
+  }
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  while((c=(TCanvas*)nextCanvas())){
+    c->Modified() ;
+  }
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::Reset(){
+  //delets all canvas and histograms,
+  //marks buttons as unpressed
+
+  TIter nextHisto(fHistosList);
+  TH1D * h ;
+  while((h=(TH1D*)nextHisto())){
+    fHistosList->Remove(h) ;
+    delete h ;
+  }
+  TIter nextCanvas(fCanvasList);
+  TCanvas * c ;
+  while((c=(TCanvas*)nextCanvas())){
+    fCanvasList->Remove(c) ;
+    delete c ;
+  }
+  TObject *obj;
+  TGroupButton *button;
+  TIter next(fPrimitives);
+  
+  //Mark buttons as anpressed
+  while ((obj = next())) {
+    if (obj->InheritsFrom(TGroupButton::Class())) {
+      button = (TGroupButton*)obj;
+      if (button->GetBorderMode() < 0){
+       button->SetBorderMode(1) ;
+       button->Modified(kTRUE);
+      }
+    }
+  }
+  
+}
+//____________________________________________________________________________ 
+void  AliPHOSOnlineMonitor::WriteHistograms(const char * filename){
+  //Write filled histograms to file
+  TFile * file = new TFile(filename,"Update") ;
+  file->cd() ;
+  TIter nextHisto(fHistosList);
+  TH1 * h ;
+  while((h=(TH1*)nextHisto())){
+    h->Write(0,TObject::kOverwrite) ;
+  }
+  file->Close() ; 
+}
diff --git a/PHOS/AliPHOSOnlineMonitor.h b/PHOS/AliPHOSOnlineMonitor.h
new file mode 100644 (file)
index 0000000..f76fc95
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef ALIPHOSONLINEMONITOR_H
+#define ALIPHOSONLINEMONITOR_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+//_________________________________________________________________________
+//  Simple class for online mnitoring     
+//                  
+//*-- Author: D.Peressouno (RRC KI)
+
+
+// --- ROOT system ---
+#include "TDialogCanvas.h" 
+class TList ;
+class TString ;
+class TClonesArray;
+// --- Standard library ---
+
+// --- AliRoot header files ---
+class AliPHOSGeometry ;
+class AliPHOSConTableDB ;
+
+class AliPHOSOnlineMonitor: public TDialogCanvas{
+
+public:
+  AliPHOSOnlineMonitor() ;          // ctor
+  AliPHOSOnlineMonitor(const char * dataname) ;          // ctor
+  virtual ~AliPHOSOnlineMonitor() ; // dtor
+
+  virtual void Apply(const char *action=""); //Overloaded function to 
+                                             //handle butons
+  void SetInputFile(const char * filename = "run1.dat") ;    //Open new input file
+  void DrawPedestals();    //Scans pedestals in current file
+  void DrawSpectrum(const char * opt);  //Plot spectrum of all registered particles"
+  void DrawMinv() ;        //Plot invariant mass distribution
+  void DrawTriggers() ;        //Plot invariant mass distribution
+  void DrawEdep(Int_t mod,const char * opt) ;//Plots energy deposition per crystal for module
+  void Go() ;
+  void Clean() ;           //Cleans all histograms
+  void Reset() ;           //Removes all canvas and histograms
+
+  void WriteHistograms(const char * filename = "onlineout.root") ;
+
+  void SetConTableDB(const char * filename = "ConTableDB.root") ;
+
+ private:
+  void MakeButtons(void) ; //Function to make menu and buttons
+
+  void ScanDigits() ;
+  void ScanTrigger(Int_t trig) ;
+  void ScanPedestals(TClonesArray * digits) ;
+  void ScanEdep(TClonesArray * digits) ;
+  void ScanRecon(TClonesArray * recParticles) ;
+
+private:
+
+  Bool_t fScanPed ;     //should we analyse pedestal events
+  Bool_t fScanSig;      //should we analyse signal events
+  Bool_t fReconstruct ; //should we reconstruct events
+
+  Int_t fNevents ;      //Number of events processed so far 
+  Int_t fNUpdate ;      //Number of events to update histo 
+
+  TList * fCanvasList ;  //!
+  TList * fHistosList ;  //!
+  
+  TString fInputFile ;
+
+  AliPHOSGeometry   * fGeom ;         //! 
+  AliPHOSConTableDB * fcdb ;          //!
+
+  ClassDef(AliPHOSOnlineMonitor,1)  //PHOS online monitoring  
+
+};
+
+#endif // AliPHOSONLINEMONITOR_H