Detector Algorithm for pedestal runs.
authorpolicheh <policheh@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 12 Mar 2010 10:30:59 +0000 (10:30 +0000)
committerpolicheh <policheh@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 12 Mar 2010 10:30:59 +0000 (10:30 +0000)
PHOS/PHOSPEDda.cxx [new file with mode: 0644]

diff --git a/PHOS/PHOSPEDda.cxx b/PHOS/PHOSPEDda.cxx
new file mode 100644 (file)
index 0000000..38d2f6d
--- /dev/null
@@ -0,0 +1,482 @@
+/*\r
+contact: Boris.Polishchuk@cern.ch\r
+reference run: /alice/data/2010/LHC10a_PHOS/000112189/raw/10000112189003.10.root\r
+run type: PEDESTAL\r
+DA type: MON \r
+number of events needed: 200\r
+input files: Mod0RCU0.data Mod0RCU1.data Mod0RCU2.data Mod0RCU3.data Mod1RCU0.data Mod1RCU1.data Mod1RCU2.data Mod1RCU3.data Mod2RCU0.data Mod2RCU1.data Mod2RCU2.data Mod2RCU3.data Mod3RCU0.data Mod3RCU1.data Mod3RCU2.data Mod3RCU3.data Mod4RCU0.data Mod4RCU1.data Mod4RCU2.data Mod4RCU3.data\r
+Output files: PHOS_PED.root\r
+*/\r
+\r
+\r
+#include "event.h"\r
+#include "monitor.h"\r
+\r
+extern "C" {\r
+#include "daqDA.h"\r
+}\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+#include <TSystem.h>\r
+#include <TROOT.h>\r
+#include <TPluginManager.h>\r
+\r
+#include <TStyle.h>\r
+#include <TFile.h>\r
+#include <TH1F.h>\r
+#include <TH2F.h>\r
+#include <TString.h>\r
+#include "AliRawReader.h"\r
+#include "AliCaloRawStreamV3.h"\r
+#include "AliLog.h"\r
+\r
+int main(int argc, char **argv) \r
+{\r
+  // Read raw data, decode it to samples,\r
+  // calculate pedestals from presamples, \r
+  // evaluate the signal amplitude as a maximum sample, \r
+  // and fill histograms with pedestals and amplitudes\r
+\r
+  gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",\r
+                                        "*",\r
+                                        "TStreamerInfo",\r
+                                        "RIO",\r
+                                        "TStreamerInfo()");\r
+  \r
+  AliLog::SetGlobalDebugLevel(0) ;\r
+  AliLog::SetGlobalLogLevel(AliLog::kFatal);\r
+\r
+  int status;\r
+  \r
+  if (argc!=2) {\r
+    printf("Wrong number of arguments\n");\r
+    return -1;\r
+  }\r
+\r
+  /* Retrieve mapping files from DAQ DB */ \r
+  const char* mapFiles[20] = {\r
+    "Mod0RCU0.data",\r
+    "Mod0RCU1.data",\r
+    "Mod0RCU2.data",\r
+    "Mod0RCU3.data",\r
+    "Mod1RCU0.data",\r
+    "Mod1RCU1.data",\r
+    "Mod1RCU2.data",\r
+    "Mod1RCU3.data",\r
+    "Mod2RCU0.data",\r
+    "Mod2RCU1.data",\r
+    "Mod2RCU2.data",\r
+    "Mod2RCU3.data",\r
+    "Mod3RCU0.data",\r
+    "Mod3RCU1.data",\r
+    "Mod3RCU2.data",\r
+    "Mod3RCU3.data",\r
+    "Mod4RCU0.data",\r
+    "Mod4RCU1.data",\r
+    "Mod4RCU2.data",\r
+    "Mod4RCU3.data"\r
+  };\r
+\r
+  for(Int_t iFile=0; iFile<20; iFile++) {\r
+    int failed = daqDA_DB_getFile(mapFiles[iFile], mapFiles[iFile]);\r
+    if(failed) { \r
+      printf("Cannot retrieve file %s from DAQ DB. Exit.\n",mapFiles[iFile]);\r
+      return -1;\r
+    }\r
+  }\r
+  \r
+  /* Open mapping files */\r
+  AliAltroMapping *mapping[20];\r
+  TString path = "./";\r
+\r
+  path += "Mod";\r
+  TString path2;\r
+  TString path3;\r
+  Int_t iMap = 0;\r
+\r
+  for(Int_t iMod = 0; iMod < 5; iMod++) {\r
+    path2 = path;\r
+    path2 += iMod;\r
+    path2 += "RCU";\r
+\r
+    for(Int_t iRCU=0; iRCU<4; iRCU++) {\r
+      path3 = path2;\r
+      path3 += iRCU;\r
+      path3 += ".data";\r
+      mapping[iMap] = new AliCaloAltroMapping(path3.Data());\r
+      iMap++;\r
+    }\r
+  }\r
+  \r
+  /* define data source : this is argument 1 */  \r
+  status=monitorSetDataSource( argv[1] );\r
+  if (status!=0) {\r
+    printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));\r
+    return -1;\r
+  }\r
+  \r
+  /* declare monitoring program */\r
+  status=monitorDeclareMp( __FILE__ );\r
+  if (status!=0) {\r
+    printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));\r
+    return -1;\r
+  }\r
+  \r
+  /* define wait event timeout - 1s max */\r
+  monitorSetNowait();\r
+  monitorSetNoWaitNetworkTimeout(1000);\r
+  \r
+  /* init some counters */\r
+  int nevents_physics=0;\r
+  int nevents_total=0;\r
+\r
+  AliRawReader * reader = NULL;\r
+  AliCaloRawStreamV3* stream = NULL;\r
+  \r
+  TString baseNamePed ="hPed";\r
+  TString baseTitlePed="Ped in cell (";\r
+  const char* sgain[3]={"LG","HG", "TRU"};\r
+\r
+  const Int_t caloFlagMax=3,modMax=5,cellXMax=64,cellZMax=56;\r
+  TH1F *hPed[5][3][64][56] = {};\r
+\r
+  TH1F *hPedHiMean1m2 = new TH1F("hPedHiMean1m2","Mean pedestals in module 2, high gain" ,100,0.,100.);\r
+  TH1F *hPedHiRMS1m2  = new TH1F("hPedHiRMS1m2" ,"RMS pedestals in module 2, high gain"  ,100,0.,50.);\r
+  TH1F *hPedLoMean1m2 = new TH1F("hPedLoMean1m2","Mean pedestals in module 2, low gain"  ,100,0.,100.);\r
+  TH1F *hPedLoRMS1m2  = new TH1F("hPedLoRMS1m2" ,"RMS pedestals in module 2, low gain"   ,100,0.,50.);\r
+  TH1F *hPedTRUMean1m2 = new TH1F("hPedTRUMean1m2","Mean pedestals in module 2, TRU"     ,1000,0.,1000.);\r
+  TH1F *hPedTRURMS1m2  = new TH1F("hPedTRURMS1m2" ,"RMS pedestals in module 2, TRU"      ,100,0.,50.);\r
+\r
+  TH1F *hPedHiMean1m3 = new TH1F("hPedHiMean1m3","Mean pedestals in module 3, high gain" ,100,0.,100.);\r
+  TH1F *hPedHiRMS1m3  = new TH1F("hPedHiRMS1m3" ,"RMS pedestals in module 3, high gain"  ,100,0.,50.);\r
+  TH1F *hPedLoMean1m3 = new TH1F("hPedLoMean1m3","Mean pedestals in module 3, low gain"  ,100,0.,100.);\r
+  TH1F *hPedLoRMS1m3  = new TH1F("hPedLoRMS1m3" ,"RMS pedestals in module 3, low gain"   ,100,0.,50.);\r
+  TH1F *hPedTRUMean1m3 = new TH1F("hPedTRUMean1m3","Mean pedestals in module 3, TRU"     ,1000,0.,1000.);\r
+  TH1F *hPedTRURMS1m3  = new TH1F("hPedTRURMS1m3" ,"RMS pedestals in module 3, TRU"      ,100,0.,50.);\r
+\r
+  TH1F *hPedHiMean1m4 = new TH1F("hPedHiMean1m4","Mean pedestals in module 4, high gain" ,100,0.,100.);\r
+  TH1F *hPedHiRMS1m4  = new TH1F("hPedHiRMS1m4" ,"RMS pedestals in module 4, high gain"  ,100,0.,50.);\r
+  TH1F *hPedLoMean1m4 = new TH1F("hPedLoMean1m4","Mean pedestals in module 4, low gain"  ,100,0.,100.);\r
+  TH1F *hPedLoRMS1m4  = new TH1F("hPedLoRMS1m4" ,"RMS pedestals in module 4, low gain"   ,100,0.,50.);\r
+  TH1F *hPedTRUMean1m4 = new TH1F("hPedTRUMean1m4","Mean pedestals in module 4, TRU"     ,1000,0.,1000.);\r
+  TH1F *hPedTRURMS1m4  = new TH1F("hPedTRURMS1m4" ,"RMS pedestals in module 4, TRU"      ,100,0.,50.);\r
+\r
+  hPedHiMean1m2->Sumw2();\r
+  hPedHiRMS1m2 ->Sumw2();\r
+  hPedLoMean1m2->Sumw2();\r
+  hPedLoRMS1m2 ->Sumw2();\r
+  hPedTRUMean1m2->Sumw2();\r
+  hPedTRURMS1m2 ->Sumw2();\r
+  hPedHiMean1m3->Sumw2();\r
+  hPedHiRMS1m3 ->Sumw2();\r
+  hPedLoMean1m3->Sumw2();\r
+  hPedLoRMS1m3 ->Sumw2();\r
+  hPedTRUMean1m3->Sumw2();\r
+  hPedTRURMS1m3 ->Sumw2();\r
+  hPedHiMean1m4->Sumw2();\r
+  hPedHiRMS1m4 ->Sumw2();\r
+  hPedLoMean1m4->Sumw2();\r
+  hPedLoRMS1m4 ->Sumw2();\r
+  hPedTRUMean1m4->Sumw2();\r
+  hPedTRURMS1m4 ->Sumw2();\r
+\r
+  TH2F *hPedHiMeanm2  = new TH2F("hPedHiMeanm2","Mean pedestals in module 2, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedHiRMSm2   = new TH2F("hPedHiRMSm2" ,"R.M.S. of pedestals in module 2, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedHiNumm2   = new TH2F("hPedHiNumm2" ,"Number of pedestals in module 2, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoMeanm2  = new TH2F("hPedLoMeanm2","Mean pedestals in module 2, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoRMSm2   = new TH2F("hPedLoRMSm2" ,"R.M.S. of pedestals in module 2, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoNumm2   = new TH2F("hPedLoNumm2" ,"Number of pedestals in module 2, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+\r
+  TH2F *hPedHiMeanm3  = new TH2F("hPedHiMeanm3","Mean pedestals in module 3, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedHiRMSm3   = new TH2F("hPedHiRMSm3" ,"R.M.S. of pedestals in module 3, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedHiNumm3   = new TH2F("hPedHiNumm3" ,"Number of pedestals in module 3, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoMeanm3  = new TH2F("hPedLoMeanm3","Mean pedestals in module 3, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoRMSm3   = new TH2F("hPedLoRMSm3" ,"R.M.S. of pedestals in module 3, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoNumm3   = new TH2F("hPedLoNumm3" ,"Number of pedestals in module 3, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+\r
+  TH2F *hPedHiMeanm4  = new TH2F("hPedHiMeanm4","Mean pedestals in module 4, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedHiRMSm4   = new TH2F("hPedHiRMSm4" ,"R.M.S. of pedestals in module 4, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedHiNumm4   = new TH2F("hPedHiNumm4" ,"Number of pedestals in module 4, high gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoMeanm4  = new TH2F("hPedLoMeanm4","Mean pedestals in module 4, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoRMSm4   = new TH2F("hPedLoRMSm4" ,"R.M.S. of pedestals in module 4, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+  TH2F *hPedLoNumm4   = new TH2F("hPedLoNumm4" ,"Number of pedestals in module 4, low gain",\r
+                              cellXMax,0.,cellXMax, cellZMax,0.,cellZMax);\r
+\r
+  TH1I *hNBunches = new TH1I("hNBunches","Number of bunches",10,0,10);\r
+  TH2I *hHWaddr   = new TH2I("hHWaddr","DDL is vs HW addr",216,0,216,4096,0,4096);\r
+  TH1I *hModule   = new TH1I("hModule" ,"Module number", 5,0.,5);\r
+\r
+  Int_t runNum=0;\r
+  Int_t module,cellX,cellZ,caloFlag;\r
+\r
+  /* main loop (infinite) */\r
+  for(;;) {\r
+    struct eventHeaderStruct *event;\r
+    eventTypeType eventT;\r
+    \r
+    /* check shutdown condition */\r
+    if (daqDA_checkShutdown()) {break;}\r
+    \r
+    /* get next event (blocking call until timeout) */\r
+    status=monitorGetEventDynamic((void **)&event);\r
+    if (status==MON_ERR_EOF) {\r
+      printf ("End of File detected\n");\r
+      break; /* end of monitoring file has been reached */\r
+    }\r
+    \r
+    if (status!=0) {\r
+      printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));\r
+      break;\r
+    }\r
+    \r
+    /* retry if got no event */\r
+    if (event==NULL) {\r
+      continue;\r
+    }\r
+\r
+    /* use event - here, just write event id to result file */\r
+    eventT=event->eventType;\r
+    \r
+    if (eventT==PHYSICS_EVENT) {\r
+\r
+      reader = new AliRawReaderDate((void*)event);\r
+      stream =  new AliCaloRawStreamV3(reader,"PHOS",mapping);\r
+\r
+      while (reader->NextEvent()) {\r
+       runNum = reader->GetRunNumber();\r
+       while (stream->NextDDL()) {\r
+         while (stream->NextChannel()) {\r
+           module   = stream->GetModule();\r
+           cellX    = stream->GetCellX();\r
+           cellZ    = stream->GetCellZ();\r
+           caloFlag = stream->GetCaloFlag();\r
+           if (caloFlag!=0 && caloFlag!=1) continue;\r
+\r
+           hHWaddr->Fill(stream->GetDDLNumber(),stream->GetHWAddress());\r
+           hModule->Fill(module);\r
+           if (!hPed[module][caloFlag][cellX][cellZ]) {\r
+             TString name  = baseNamePed;\r
+             TString title = baseTitlePed;\r
+             name +="_g"; name +=caloFlag;\r
+             name +="_m"; name +=module;\r
+             name +="_x"; name +=cellX;\r
+             name +="_z"; name +=cellZ;\r
+\r
+             title +=module; title +=",";\r
+             title +=cellX; title +=",";\r
+             title +=cellZ; title +="), ";\r
+             title +=sgain[caloFlag];\r
+             \r
+             Int_t nx,xmin,xmax;\r
+             if (caloFlag==0 || caloFlag==1) {\r
+               nx=100;\r
+               xmin=0.;\r
+               xmax=100.;\r
+             }\r
+             else {\r
+               nx=1000;\r
+               xmin=0.;\r
+               xmax=1000.;\r
+             }\r
+             hPed[module][caloFlag][cellX][cellZ] = new TH1F(name,title,100,0.,100.);\r
+             hPed[module][caloFlag][cellX][cellZ]->Sumw2();\r
+             hPed[module][caloFlag][cellX][cellZ]->SetMarkerStyle(20);\r
+             hPed[module][caloFlag][cellX][cellZ]->SetOption("eph");\r
+           }\r
+\r
+           Int_t nBunches = 0;\r
+           while (stream->NextBunch()) {\r
+             nBunches++;\r
+             const UShort_t *sig = stream->GetSignals();\r
+             Int_t sigLength = stream->GetBunchLength();\r
+             for (Int_t i = 0; i < sigLength; i++) {\r
+               hPed[module][caloFlag][cellX][cellZ]->Fill(sig[i]);\r
+             }\r
+           }\r
+           hNBunches->Fill(nBunches);\r
+         } // end of NextChannel()\r
+\r
+       } // end of NextDDL()\r
+      } // end of nextEvent()\r
+      \r
+      // Fill 2-dim histograms for mean, rms and n pedestals\r
+      \r
+      for (Int_t mod=2; mod<=4; mod++) {\r
+       for (Int_t caloFlag=0; caloFlag<2; caloFlag++) {\r
+         for (Int_t cellX=0; cellX<cellXMax; cellX++) {\r
+           for (Int_t cellZ=0; cellZ<cellZMax; cellZ++) {\r
+             if (hPed[mod][caloFlag][cellX][cellZ] != 0) {\r
+               if      (caloFlag == 0) {\r
+                 if (mod==2) {\r
+                   hPedLoMean1m2->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedLoRMS1m2 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedLoMeanm2 ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedLoRMSm2  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedLoNumm2  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetEntries());\r
+                 }\r
+                 else if (mod==3) {\r
+                   hPedLoMean1m3->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedLoRMS1m3 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedLoMeanm3 ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedLoRMSm3  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedLoNumm3  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetEntries());\r
+                 }\r
+                 else if (mod==4) {\r
+                   hPedLoMean1m4->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedLoRMS1m4 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedLoMeanm4 ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedLoRMSm4  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedLoNumm4  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetEntries());\r
+                 }\r
+               }\r
+               else if (caloFlag == 1) {\r
+                 if (mod==2) {\r
+                   hPedHiMean1m2->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedHiRMS1m2 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS() );\r
+                   hPedHiMeanm2 ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedHiRMSm2  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedHiNumm2  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetEntries());\r
+                 }\r
+                 if (mod==3) {\r
+                   hPedHiMean1m3->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedHiRMS1m3 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS() );\r
+                   hPedHiMeanm3 ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedHiRMSm3  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedHiNumm3  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetEntries());\r
+                 }\r
+                 if (mod==4) {\r
+                   hPedHiMean1m4->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedHiRMS1m4 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedHiMeanm4 ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedHiRMSm4  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetRMS());\r
+                   hPedHiNumm4  ->Fill( cellX, cellZ, hPed[mod][caloFlag][cellX][cellZ]->GetEntries());\r
+                 }\r
+               }\r
+               else if (caloFlag == 2) {\r
+                 if (mod==2) {\r
+                   hPedTRUMean1m2->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedTRURMS1m2 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS() );\r
+                 }\r
+                 if (mod==3) {\r
+                   hPedTRUMean1m3->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedTRURMS1m3 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS() );\r
+                 }\r
+                 if (mod==4) {\r
+                   hPedTRUMean1m4->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetMean());\r
+                   hPedTRURMS1m4 ->Fill( hPed[mod][caloFlag][cellX][cellZ]->GetRMS() );\r
+                 }\r
+               }\r
+             }\r
+           }\r
+         }\r
+       }\r
+      }\r
+      \r
+      delete rawReader;     \r
+      delete stream;\r
+      nevents_physics++;\r
+    } // end of if (eventT==PHYSICS_EVENT)\r
+    \r
+    nevents_total++;\r
+    \r
+    /* free resources */\r
+    free(event);\r
+    \r
+    /* exit when last event received, no need to wait for TERM signal */\r
+    if (eventT==END_OF_RUN) {\r
+      printf("EOR event detected\n");\r
+      break;\r
+    }\r
+\r
+  } // end of inf. loop over events\r
+  \r
+  for(Int_t i = 0; i < 20; i++) delete mapping[i];\r
+  \r
+  // Write existing histograms to a root file\r
+  \r
+  TString fileName = "PHOS_PED.root";\r
+  TFile *file = new TFile(fileName,"RECREATE");\r
+  \r
+  for (Int_t mod=2; mod<=3; mod++) {\r
+    for (Int_t caloFlag=0; caloFlag<caloFlagMax; caloFlag++) {\r
+      for (Int_t mod=0; mod<modMax; mod++) {\r
+       for (Int_t cellX=0; cellX<cellXMax; cellX++) {\r
+         for (Int_t cellZ=0; cellZ<cellZMax; cellZ++) {\r
+           if (hPed[mod][caloFlag][cellX][cellZ] != 0)\r
+             hPed[mod][caloFlag][cellX][cellZ]->Write();\r
+         }\r
+       }\r
+      }\r
+    }\r
+  }\r
+  \r
+  hPedHiMean1m2->Write();\r
+  hPedHiRMS1m2 ->Write();\r
+  hPedLoMean1m2->Write();\r
+  hPedLoRMS1m2 ->Write();\r
+  hPedHiMeanm2 ->Write();\r
+  hPedHiRMSm2  ->Write();\r
+  hPedHiNumm2  ->Write();\r
+  hPedLoMeanm2 ->Write();\r
+  hPedLoRMSm2  ->Write();\r
+  hPedLoNumm2  ->Write();\r
+  hPedTRUMean1m2->Write();\r
+  hPedTRURMS1m2 ->Write();\r
+  \r
+  hPedHiMean1m3->Write();\r
+  hPedHiRMS1m3 ->Write();\r
+  hPedLoMean1m3->Write();\r
+  hPedLoRMS1m3 ->Write();\r
+  hPedHiMeanm3 ->Write();\r
+  hPedHiRMSm3  ->Write();\r
+  hPedHiNumm3  ->Write();\r
+  hPedLoMeanm3 ->Write();\r
+  hPedLoRMSm3  ->Write();\r
+  hPedLoNumm3  ->Write();\r
+  hPedTRUMean1m3->Write();\r
+  hPedTRURMS1m3 ->Write();\r
+\r
+  hPedHiMean1m4->Write();\r
+  hPedHiRMS1m4 ->Write();\r
+  hPedLoMean1m4->Write();\r
+  hPedLoRMS1m4 ->Write();\r
+  hPedHiMeanm4 ->Write();\r
+  hPedHiRMSm4  ->Write();\r
+  hPedHiNumm4  ->Write();\r
+  hPedLoMeanm4 ->Write();\r
+  hPedLoRMSm4  ->Write();\r
+  hPedLoNumm4  ->Write();\r
+  hPedTRUMean1m4->Write();\r
+  hPedTRURMS1m4 ->Write();\r
+\r
+  hNBunches  ->Write();\r
+  hHWaddr    ->Write();\r
+  hModule    ->Write();\r
+  \r
+  file->Close();\r
+  \r
+  /* Store output files to the File Exchange Server */\r
+  daqDA_FES_storeFile(fileName.Data(),"PED");\r
+  \r
+  printf("%d physics events of %d total processed.\n",nevents_physics,nevents_total);\r
+  return status;\r
+}\r