]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFPreprocessor.cxx
Coverity fixes
[u/mrichter/AliRoot.git] / TOF / AliTOFPreprocessor.cxx
index 877c595eba1f092cb1e38150d588db146a5c50e7..99cb61ed2da4ef39fb8fb717e702f5e92d20debd 100644 (file)
 
 /* $Id$ */
 
+
 //#include <Riostream.h>
 //#include <stdio.h>
 //#include <stdlib.h>
 
 #include <TFile.h>
 #include <TH2S.h>
+#include <TH1F.h>
+#include <TCanvas.h>
 #include <TMath.h>
 #include <TObjArray.h>
 #include <TObjString.h>
 #include "AliTOFChannelOnlineArray.h"
 #include "AliTOFChannelOnlineStatusArray.h"
 #include "AliTOFDataDCS.h"
+#include "AliTOFDCSmaps.h"
+#include "AliTOFLvHvDataPoints.h"
 #include "AliTOFGeometry.h"
 #include "AliTOFPreprocessor.h"
 #include "AliTOFFEEReader.h"
 #include "AliTOFRawStream.h"
 #include "AliTOFCableLengthMap.h"
-
+#include "AliTOFcalibHisto.h"
+#include "AliTOFFEEDump.h"
+#include "TChain.h"
+#include "AliTOFDeltaBCOffset.h"
+#include "AliTOFCTPLatency.h"
+#include "AliTOFRunParams.h"
+#include "AliTOFT0FillOnlineCalib.h"
+#include "AliTOFHitField.h"
+#include "AliTOFChannelOffline.h"
+#include "TF1.h"
+#include "TGeoManager.h"
+#include "AliGeomManager.h"
+#include "AliTOFReadoutInfo.h"
 
 // TOF preprocessor class.
 // It takes data from DCS and passes them to the class AliTOFDataDCS, which
@@ -68,6 +85,9 @@
 // return=17: failed to store FEE data in OCDB
 // return=18: failed to store FEE reference data in OCDB
 // return=20: failed in retrieving status variable
+// return=100 : no DCS input data Map (HV and LV status)
+// return=200 : no DCS input data processing (HV and LV status)
+// return=300 : no DCS processed data was stored in Ref Data (HV and LV status)
 
 ClassImp(AliTOFPreprocessor)
 
@@ -80,12 +100,15 @@ const Double_t AliTOFPreprocessor::fgkThrPar      = 0.013; // parameter used to
 AliTOFPreprocessor::AliTOFPreprocessor(AliShuttleInterface* shuttle) :
   AliPreprocessor("TOF", shuttle),
   fData(0),
+  fHVLVmaps(0),
   fCal(0),
   fNChannels(0),
   fStoreRefData(kTRUE),
   fFDRFlag(kFALSE),
   fStatus(0),
-  fMatchingWindow(0)
+  fMatchingWindow(0),
+  fLatencyWindow(0),
+  fIsStatusMapChanged(0)
 {
   // constructor
   AddRunType("PHYSICS");
@@ -114,6 +137,7 @@ void AliTOFPreprocessor::Initialize(Int_t run, UInt_t startTime,
                TTimeStamp(endTime).AsString(), ((TTimeStamp)GetStartTimeDCSQuery()).AsString(), ((TTimeStamp)GetEndTimeDCSQuery()).AsString()));
 
        fData = new AliTOFDataDCS(fRun, fStartTime, fEndTime, GetStartTimeDCSQuery(), GetEndTimeDCSQuery());
+       fHVLVmaps = new AliTOFLvHvDataPoints(fRun, fStartTime, fEndTime, GetStartTimeDCSQuery(), GetEndTimeDCSQuery());
        fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
 }
 //_____________________________________________________________________________
@@ -132,7 +156,7 @@ Bool_t AliTOFPreprocessor::ProcessDCS(){
 }
 //_____________________________________________________________________________
 
-UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMapdcsAliasMap)
+UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap *dcsAliasMap)
 {
   // Fills data into a AliTOFDataDCS object
 
@@ -145,8 +169,6 @@ UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap* dcsAliasMap)
 
   // processing DCS
 
-  fData->SetFDRFlag(fFDRFlag);
-  
   if (!dcsAliasMap){
     Log("No DCS map found: TOF exiting from Shuttle");
     if (fData){
@@ -157,7 +179,9 @@ UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap* dcsAliasMap)
   }
   else {
 
-  // The processing of the DCS input data is forwarded to AliTOFDataDCS
+    fData->SetFDRFlag(fFDRFlag);
+  
+    // The processing of the DCS input data is forwarded to AliTOFDataDCS
     resultDCSMap=fData->ProcessData(*dcsAliasMap);
     if(!resultDCSMap){
       Log("Some problems occurred while processing DCS data, TOF exiting from Shuttle");
@@ -195,10 +219,185 @@ UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap* dcsAliasMap)
 }
 //_____________________________________________________________________________
 
+UInt_t AliTOFPreprocessor::ProcessHVandLVdps(TMap *dcsAliasMap)
+{
+  //
+  //Fills data into a AliTOFLvHvDataPoints object
+  // Merges fStatus object with LV and HV status at SOR
+  // Updates fStatus object with LV and HV status
+  //    at EOR in case of correct end of run
+  //    at last but two value in case of end-of-run caused by TOF detector.
+  //
+
+  Log("Processing HV and LV DCS DPs");
+  TH1::AddDirectory(0);
+
+  Bool_t resultDCSMap=kFALSE;
+
+  // processing DCS HV and LV data points
+
+  if (!dcsAliasMap){
+    Log("No DCS map found: TOF exiting from Shuttle");
+    if (fHVLVmaps){
+      delete fHVLVmaps;
+      fHVLVmaps = 0;
+    }
+    return 100;// return error Code for DCS input data not found 
+  }
+  else {
+
+    fHVLVmaps->SetFDRFlag(fFDRFlag);
+  
+    // The processing of the DCS input data is forwarded to AliTOFDataDCS
+    //if (0) { // AdC
+    resultDCSMap = fHVLVmaps->ProcessData(*dcsAliasMap);
+    if (!resultDCSMap) {
+      Log("Some problems occurred while processing DCS data, TOF exiting from Shuttle");
+      if (fHVLVmaps) {
+       delete fHVLVmaps;
+       fHVLVmaps = 0;
+      }
+      return 200;// return error Code for processed DCS data not stored 
+    }
+    else {
+
+      // check with plots. Start...
+      /*
+      TH1F *hROsor = new TH1F("hROsor","RO status map at SOR",91*96*18,-0.5,91*96*18-0.5);
+      for (Int_t ii=1; ii<=91*96*18; ii++) hROsor->SetBinContent(ii,-1);
+      for (Int_t ii=0; ii<91*96*18; ii++) {
+       if (fStatus->GetHWStatus(ii)==AliTOFChannelOnlineStatusArray::kTOFHWBad)
+         hROsor->SetBinContent(ii+1,0);
+       else if (fStatus->GetHWStatus(ii)==AliTOFChannelOnlineStatusArray::kTOFHWOk)
+         hROsor->SetBinContent(ii+1,1);
+      }
+
+      TH1F *hROandHVandLVsor = new TH1F("hROandHVandLVsor","RO.and.HV.andLV status map at SOR",91*96*18,-0.5,91*96*18-0.5);
+      for (Int_t ii=1; ii<=91*96*18; ii++) hROandHVandLVsor->SetBinContent(ii,-1);
+      TH1F *hROandHVandLVeor = new TH1F("hROandHVandLVeor","RO.and.HV.andLV status map at EOR",91*96*18,-0.5,91*96*18-0.5);
+      for (Int_t ii=1; ii<=91*96*18; ii++) hROandHVandLVeor->SetBinContent(ii,-1);
+      */
+
+      AliTOFDCSmaps * lvANDhvMap = (AliTOFDCSmaps*)fHVLVmaps->GetHVandLVmapAtSOR(); // Get LV.and.HV status map at SOR
+      for (Int_t index=0; index<fNChannels; index++) {
+       if ( ( lvANDhvMap->GetCellValue(index)==0 &&
+              fStatus->GetHWStatus(index) != AliTOFChannelOnlineStatusArray::kTOFHWBad ) ||
+            ( lvANDhvMap->GetCellValue(index)==1 &&
+              fStatus->GetHWStatus(index) != AliTOFChannelOnlineStatusArray::kTOFHWOk ) ) {
+         fStatus->SetHWStatus(index, AliTOFChannelOnlineStatusArray::kTOFHWBad);
+         fIsStatusMapChanged=kTRUE;
+       }
+      }
+      
+      // check with plots. Start...
+      /*
+      for (Int_t ii=0; ii<91*96*18; ii++) {
+       if (fStatus->GetHWStatus(ii)==AliTOFChannelOnlineStatusArray::kTOFHWBad)
+         hROandHVandLVsor->SetBinContent(ii+1,0);
+       else if (fStatus->GetHWStatus(ii)==AliTOFChannelOnlineStatusArray::kTOFHWOk)
+         hROandHVandLVsor->SetBinContent(ii+1,1);
+      }
+      */
+
+      lvANDhvMap = (AliTOFDCSmaps*)fHVLVmaps->GetHVandLVmapAtEOR(); // Get LV.and.HV status map at EOR
+      for (Int_t index=0; index<fNChannels; index++) {
+       if ( ( lvANDhvMap->GetCellValue(index)==0 &&
+              fStatus->GetHWStatus(index)!=AliTOFChannelOnlineStatusArray::kTOFHWBad ) ||
+            ( lvANDhvMap->GetCellValue(index)==1 &&
+              fStatus->GetHWStatus(index) != AliTOFChannelOnlineStatusArray::kTOFHWOk ) ) {
+         fStatus->SetHWStatus(index, AliTOFChannelOnlineStatusArray::kTOFHWBad);
+         fIsStatusMapChanged=kTRUE;
+       }
+      }
+
+      // check with plots. Start...
+      /*
+      for (Int_t ii=0; ii<91*96*18; ii++) {
+       if (fStatus->GetHWStatus(ii)==AliTOFChannelOnlineStatusArray::kTOFHWBad)
+         hROandHVandLVeor->SetBinContent(ii+1,0);
+       else if (fStatus->GetHWStatus(ii)==AliTOFChannelOnlineStatusArray::kTOFHWOk)
+         hROandHVandLVeor->SetBinContent(ii+1,1);
+      }
+
+      TCanvas *canvas = new TCanvas("canvas","",10,10,1000,1000);
+      canvas->SetFillColor(0);
+      canvas->Divide(2,2);
+      canvas->cd(1);
+      hROsor->SetLineWidth(2);
+      hROsor->Draw();
+      canvas->cd(2);
+      hROandHVandLVsor->SetLineWidth(2);
+      hROandHVandLVsor->Draw();
+      canvas->cd(3);
+      hROandHVandLVeor->SetLineWidth(2);
+      hROandHVandLVeor->Draw();
+      canvas->cd();
+      */
+
+    }
+    //} // AdC
+  }
+
+
+  /* check whether we don't need to update OCDB.
+   * in this case we can return without errors. */
+
+  if (!fIsStatusMapChanged) {
+    AliInfo("TOF HW status config has not changed. Do not overwrite stored file.");
+    return 0; // return ok
+  }
+
+  TString runType = GetRunType();
+  if (runType != "PHYSICS") {
+    AliInfo(Form("Run Type = %s, waiting to store status map",GetRunType()));
+    return 0; // return ok
+  }
+
+  // update the OCDB with the current FEE.and.HV.and.LV
+  // since even a little difference has been detected.
+
+  AliCDBMetaData metaData;
+  metaData.SetBeamPeriod(0);
+  metaData.SetResponsible("Roberto Preghenella");
+  metaData.SetComment("This preprocessor fills an AliTOFChannelOnlineStatusArray object from FEE.and.HV.and.LV data.");
+  AliInfo("Storing Status data from current run. Collected RO.and.HV.and.LV infos @ EOR");
+  // store TOF channel status
+  if (!Store("Calib", "Status", fStatus, &metaData, 0, kTRUE)) {
+    // failed
+    Log("problems while storing RO.and.HV.and.LV Status data object");
+    if (fStatus){
+      delete fStatus;
+      fStatus = 0;
+    }
+    if (fHVLVmaps) {
+      delete fHVLVmaps;
+      fHVLVmaps = 0;
+    }
+    return 17; // return error code for problems while TOF channel status
+  }
+
+  // everything fine. return
+
+  if (fStatus){
+    delete fStatus;
+    fStatus = 0;
+  }
+
+  if (fHVLVmaps) {
+    delete fHVLVmaps;
+    fHVLVmaps = 0;
+  }
+  
+  return 0;
+}
+
+//_____________________________________________________________________________
+
 UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
 {
   // Processing data from DAQ for online calibration 
 
+  Bool_t updateOCDB = kFALSE;
   Log("Processing DAQ delays");
 
   // reading configuration map 
@@ -249,7 +448,7 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                          integralThr = tmpstr.Atof();
                  }
                  else {
-                         Log(Form("No IntegralThr value found in Map from Config entry in CDB, using default value: IntegralThr = %i",integralThr));
+                         Log(Form("No IntegralThr value found in Map from Config entry in CDB, using default value: IntegralThr = %f",integralThr));
                  }
                  TObjString *strThrPar = (TObjString*)configMap->GetValue("ThrPar");
                  if (strThrPar) {
@@ -257,7 +456,7 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                          thrPar = tmpstr.Atof();
                  }
                  else {
-                         Log(Form("No ThrPar value found in Map from Config entry in CDB, using default value: ThrPar = %i",thrPar));
+                         Log(Form("No ThrPar value found in Map from Config entry in CDB, using default value: ThrPar = %f",thrPar));
                  }
          }
   }
@@ -269,7 +468,25 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
 
   Log(Form("ComputingDelays = %s, StartingRun = %i",compDelays.Data(),startingRun));
 
-  fCal = new AliTOFChannelOnlineArray(fNChannels);
+  /* init array with current calibration, if any */
+  fCal = new AliTOFChannelOnlineArray(fNChannels);  
+  AliTOFChannelOnlineArray *curCal = NULL;
+
+  AliCDBEntry *cdbEntry2 = GetFromOCDB("Calib","ParOnlineDelay");
+  if (!cdbEntry2 || !cdbEntry2->GetObject()) {
+    /* no CDB entry found. set update flag */
+    Log("     ************ WARNING ************");
+    Log("No CDB ParOnlineDelay entry found, creating a new one!");
+    Log("     *********************************");
+    updateOCDB = kTRUE;
+  }
+  else {
+    Log("Found previous ParOnlineDelay entry. Using it to init calibration");
+    curCal = (AliTOFChannelOnlineArray *)cdbEntry2->GetObject();
+    for (Int_t i = 0; i < fNChannels; i++)
+      fCal->SetDelay(i, curCal->GetDelay(i));
+  }
 
   TH1::AddDirectory(0);
 
@@ -289,6 +506,10 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                          list->Print();
                          for (Int_t jj=0;jj<list->GetEntries();jj++){
                                  TObjString * str = dynamic_cast<TObjString*> (list->At(jj));
+                                 if (!str) {
+                                   AliError("dynamic_cast returned NULL");
+                                   return 4;
+                                 }
                                  AliInfo(Form("found source %s", str->String().Data()));
                                  // file to be stored run per run
                                  TString fileNameRun = GetFile(kDAQ, "RUNLevel", str->GetName());
@@ -341,7 +562,11 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                  AliInfo("The following sources produced files with the id DELAYS");
                  listTot->Print();
                  for (Int_t jj=0;jj<listTot->GetEntries();jj++){
-                         TObjString * str = dynamic_cast<TObjString*> (listTot->At(jj));
+                   TObjString * str = dynamic_cast<TObjString*> (listTot->At(jj));
+                   if (!str) {
+                     AliError("dynamic_cast returned NULL");
+                                   return 4;
+                         }
                          AliInfo(Form("found source %s", str->String().Data()));
                          
                          // file with summed histos, to extract calib params
@@ -375,63 +600,30 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                          }
                                          Int_t nNotStatistics = 0; // number of channel with not enough statistics
 
- /* FDR flag set. do not compute delays, use nominal cable delays */
                                        /* FDR flag set. do not compute delays, use nominal cable delays */
                                          if (fFDRFlag) {
 
                                            Log(" Not computing delays according to flag set in Config entry in OCDB!");
-                                           Log(" Using nominal cable delays.");
-                                           
-                                           AliTOFRawStream tofrs;
-                                           Int_t det[5], dummy, index;
-                                           Float_t cableTimeShift;
-                                           
-                                           /* temporarly disable warnings */
-                                           AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
-                                           AliLog::SetGlobalLogLevel(AliLog::kError);
-
-                                           /* loop over EO indeces */
-                                           for (Int_t iddl = 0; iddl < 72; iddl++)
-                                             for (Int_t islot = 3; islot <= 12; islot++)
-                                               for (Int_t ichain = 0; ichain < 2; ichain++)
-                                                 for (Int_t itdc = 0; itdc < 15; itdc++)
-                                                   for (Int_t ichannel = 0; ichannel < 8; ichannel++) {
-                                                     
-                                                     /* get DO index */
-                                                     tofrs.EquipmentId2VolumeId(iddl, islot, ichain, itdc, ichannel, det);
-                                                     
-                                                     /* swap det[3] and det[4] indeces (needed to obtain correct channel index) */
-                                                     dummy = det[3];
-                                                     det[3] = det[4];
-                                                     det[4] = dummy;
-                                                     
-                                                     /* check DO index */
-                                                     if (det[0] < 0 || det[0] > 17 ||
-                                                         det[1] < 0 || det[1] > 4 ||
-                                                         det[2] < 0 || det[2] > 18 ||
-                                                         det[3] < 0 || det[3] > 1 ||
-                                                         det[4] < 0 || det[4] > 47)
-                                                       continue;
-                                                     
-                                                     /* get channel index */
-                                                     index = AliTOFGeometry::GetIndex(det);
-                                                     
-                                                     /* get cable time shift */
-                                                     cableTimeShift = AliTOFCableLengthMap::GetCableTimeShift(iddl, islot, ichain, itdc);
-                                                     
-                                                     /* set delay */
-                                                     if (index<fNChannels) {
-                                                       fCal->SetDelay(index,cableTimeShift);  // delay in ns
-                                                       AliDebug(2,Form("Setting delay %f (ns) for channel %i",cableTimeShift,index));
-                                                     }
-                                                     
-                                                   } /* loop over EO indeces */
-
-                                           /* re-enable warnings */
-                                           AliLog::SetGlobalLogLevel(logLevel);
-                                           
+                                           FillWithCosmicCalibration(fCal);
+
+                                           /* check whether the new calibration is different from the previous one */
+                                           if (curCal) { /* well, check also whether we have a previous calibration */
+                                             for (Int_t i = 0; i < fNChannels; i++) {
+                                               if (fCal->GetDelay(i) != curCal->GetDelay(i)) {
+                                                 updateOCDB = kTRUE;
+                                                 break;
+                                               }
+                                             }
+                                           }
+                                           else /* otherwise update OCDB */
+                                             updateOCDB = kTRUE;
+
                                          }
 
                                          else {  // computing delays if not in FDR runs
+
+                                           updateOCDB = kTRUE; /* always update OCDB when computing delays */
+
                                                  for (Int_t ich=0;ich<kSize;ich++){
                                                          /* check whether channel has been read out during current run.
                                                           * if the status is bad it means it has not been read out.
@@ -513,6 +705,14 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
     return 6; //return error code for problems in retrieving DAQ data 
   }
 
+  /* check whether we don't need to update OCDB.
+   * in this case we can return without errors and
+   * the current FEE is stored in the fStatus object. */
+  if (!updateOCDB) {
+    AliInfo("update OCDB flag not set. Do not overwrite stored file.");
+    return 0; /* return ok */
+  }
+  
   daqFile=0;
   AliCDBMetaData metaData;
   metaData.SetBeamPeriod(0);
@@ -534,6 +734,515 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
 
   return 0;
 }
+
+//_____________________________________________________________________________
+
+UInt_t 
+AliTOFPreprocessor::ProcessT0Fill()
+{
+  // Processing data from DAQ for T0-fill measurement 
+
+  Log("Processing T0-fill");
+
+#if 0
+  /* instance and setup CDB manager */
+  AliCDBManager *cdb = AliCDBManager::Instance();
+  /* load geometry */
+  if (!gGeoManager) AliGeomManager::LoadGeometry();
+#endif
+
+  /* get params from OCDB */
+  AliCDBEntry *cdbe = NULL;
+
+  /*
+   * check UseLHCClockPhase flag in RunParams.
+   * if set do nothing and return successfully
+   */
+  cdbe = GetFromOCDB("Calib", "RunParams");
+  if (!cdbe) {
+    Log("cannot get \"RunParams\" entry from OCDB");
+    return 21;
+  }
+  AliTOFRunParams *runparams = (AliTOFRunParams *)cdbe->GetObject();
+  if (runparams->GetUseLHCClockPhase()) {
+    Log("UseLHCClockPhase flag is set in RunParams: online T0-fill not computed");
+    return 0;
+  }
+
+  /* 
+   * at this stage status object is not on OCDB yet
+   * since it will be stored later. nevertheless we
+   * should have the array in memory since it has been
+   * already setup by ProcessFEF. 
+   */
+  
+  /* check status and latency window available */
+  if (!fStatus || !fLatencyWindow){
+    AliError("No valid fStatus or fLatencyWindow found, some errors must have occurred!!");
+    return 21;
+  }
+
+  /* get offline calibration from OCDB */
+  cdbe = GetFromOCDB("Calib", "ParOffline");
+  if (!cdbe) {
+    Log("cannot get \"ParOffline\" entry from OCDB");
+    return 21;
+  }
+  TObjArray *offlineArray = (TObjArray *)cdbe->GetObject();
+  AliTOFChannelOffline *channelOffline;
+  if (!offlineArray) {
+    Log("cannot get \"ParOffline\" object from CDB entry");
+    return 21;
+  }
+  Log("got \"ParOffline\" object");
+
+  /* get deltaBC offset from OCDB */
+  cdbe = GetFromOCDB("Calib", "DeltaBCOffset");
+  if (!cdbe) {
+    Log("cannot get \"DeltaBCOffset\" entry from OCDB");
+    return 21;
+  }
+  AliTOFDeltaBCOffset *deltaBCOffsetObject = (AliTOFDeltaBCOffset *)cdbe->GetObject();
+  if (!deltaBCOffsetObject) {
+    Log("cannot get \"DeltaBCOffset\" object from CDB entry");
+    return 21;
+  }
+  Int_t deltaBCOffset = deltaBCOffsetObject->GetDeltaBCOffset();
+  Log(Form("got \"DeltaBCOffset\" object: deltaBCOffset=%d (BC bins)", deltaBCOffset));
+
+  /* get CTP latency from OCDB */
+  cdbe = GetFromOCDB("Calib", "CTPLatency");
+  if (!cdbe) {
+    Log("cannot get \"CTPLatency\" entry from OCDB");
+    return 21;
+  }
+  AliTOFCTPLatency *ctpLatencyObject = (AliTOFCTPLatency *)cdbe->GetObject();
+  if (!ctpLatencyObject) {
+    Log("cannot get \"CTPLatency\" object from CDB entry");
+    return 21;
+  }
+  Float_t ctpLatency = ctpLatencyObject->GetCTPLatency();
+  Log(Form("got \"CTPLatency\" object: ctpLatency=%f (ps)", ctpLatency));
+  
+  /* get file sources from FXS */
+  TList *fileList = GetFileSources(kDAQ, "HITS");
+  if (!fileList || fileList->GetEntries() == 0) {
+    Log("cannot get DAQ source file list or empty list");
+    return 21;
+  }
+  Log(Form("got DAQ source file list: %d files", fileList->GetEntries()));
+  fileList->Print();
+  
+  /* create tree chain using file sources */
+  TChain chain("hitTree");
+  for (Int_t ifile = 0; ifile < fileList->GetEntries(); ifile++) {
+    TObjString *str = (TObjString *)fileList->At(ifile);
+    TString filename = GetFile(kDAQ, "HITS", str->GetName());
+    chain.Add(filename);
+    Log(Form("file added to input chain: source=%s, filename=%s", str->String().Data(), filename.Data()));
+  }
+  Int_t nhits = chain.GetEntries();
+  Log(Form("input chain ready: %d hits", nhits));
+
+  /* setup input chain */
+  AliTOFHitField *hit = new AliTOFHitField();
+  chain.SetBranchAddress("hit", &hit);
+
+  /* create calib histo and geometry */
+  AliTOFcalibHisto calibHisto;
+  calibHisto.LoadCalibHisto();
+  AliTOFGeometry tofGeo;
+
+  /* constants */
+  Float_t c = TMath::C() * 1.e2 / 1.e12; /* cm/ps */
+  Float_t c_1 = 1. / c;
+  /* variables */
+  Int_t index, timebin, totbin, deltaBC, l0l1latency, det[5];
+  Float_t timeps, totns, corrps, length, timeexp, timezero, pos[3], latencyWindow;
+
+  /* histos */
+  TH1F *hT0Fill = new TH1F("hT0Fill", "T0 fill;t - t_{exp}^{(c)} (ps);", 2000, -24400., 24400.);
+
+  /* loop over hits */
+  for (Int_t ihit = 0; ihit < nhits; ihit++) {
+
+    /* get entry */
+   chain.GetEntry(ihit);
+    
+    /* get hit info */
+    index = hit->GetIndex();
+    timebin = hit->GetTimeBin();
+    totbin = hit->GetTOTBin();
+    deltaBC = hit->GetDeltaBC();
+    l0l1latency = hit->GetL0L1Latency();
+    latencyWindow = fLatencyWindow[index] * 1.e3;
+    
+    /* convert time in ps and tot in ns */
+    timeps = timebin * AliTOFGeometry::TdcBinWidth();
+    totns = totbin * AliTOFGeometry::ToTBinWidth() * 1.e-3;
+    /* get calibration correction in ps */
+    
+
+    channelOffline = (AliTOFChannelOffline *)offlineArray->At(index);
+    if (totns < AliTOFGeometry::SlewTOTMin()) totns = AliTOFGeometry::SlewTOTMin();
+    if (totns > AliTOFGeometry::SlewTOTMax()) totns = AliTOFGeometry::SlewTOTMax();
+    corrps = 0.;
+    for (Int_t ipar = 0; ipar < 6; ipar++) corrps += channelOffline->GetSlewPar(ipar) * TMath::Power(totns, ipar);
+    corrps *= 1.e3;
+    /* perform time correction */
+    //    timeps = timeps + (deltaBC - deltaBCOffset) * AliTOFGeometry::BunchCrossingBinWidth() + l0l1latency * AliTOFGeometry::BunchCrossingBinWidth() + ctpLatency - latencyWindow - corrps; /* deltaBC correction removed for the time being */
+    timeps = timeps + l0l1latency * AliTOFGeometry::BunchCrossingBinWidth() + ctpLatency - latencyWindow - corrps;
+    /* compute length and expected time */
+    tofGeo.GetVolumeIndices(index, det);
+    tofGeo.GetPosPar(det, pos);
+    length = 0.;
+    for (Int_t i = 0; i < 3; i++) length += pos[i] * pos[i];
+    length = TMath::Sqrt(length);
+    timeexp = length * c_1;
+    /* compute time zero */
+    timezero = timeps - timeexp;
+    
+    /* fill histos */
+    hT0Fill->Fill(timezero);
+  }
+
+  /* rebin until maximum bin has required minimum entries */
+  Int_t maxBin = hT0Fill->GetMaximumBin();
+  Float_t maxBinContent = hT0Fill->GetBinContent(maxBin);
+  Float_t binWidth = hT0Fill->GetBinWidth(maxBin);
+  while (maxBinContent < 400 && binWidth < 90.) {
+    hT0Fill->Rebin(2);
+    maxBin = hT0Fill->GetMaximumBin();
+    maxBinContent = hT0Fill->GetBinContent(maxBin);
+    binWidth = hT0Fill->GetBinWidth(maxBin);
+  }
+  Float_t maxBinCenter = hT0Fill->GetBinCenter(maxBin);
+
+  /* rough fit of the edge */
+  TF1 *gaus = (TF1 *)gROOT->GetFunction("gaus");
+  gaus->SetParameter(1, maxBinCenter);
+  Float_t fitMin = maxBinCenter - 1000.; /* fit from 1 ns before max */
+  Float_t fitMax = maxBinCenter + 1000.; /* fit until 1 ns above max */
+  hT0Fill->Fit("gaus", "q0", "", fitMin, fitMax);
+  /* better fit of the edge */
+  Float_t mean, sigma;
+  for (Int_t istep = 0; istep < 10; istep++) {
+    mean = gaus->GetParameter(1);
+    sigma = gaus->GetParameter(2);
+    fitMin = mean - 3. * sigma;
+    fitMax = mean;
+    hT0Fill->Fit("gaus", "q0", "", fitMin, fitMax);
+  }
+  /* print params */
+  mean = gaus->GetParameter(1);
+  sigma = gaus->GetParameter(2);
+  Float_t meane = gaus->GetParError(1);
+  Float_t sigmae = gaus->GetParError(2);
+  Log(Form("edge fit: mean  = %f +- %f ps", mean, meane));
+  Log(Form("edge fit: sigma = %f +- %f ps", sigma, sigmae));
+  /* check error */
+  if (meane > 300.) {
+    Log("error on mean is large: store default T0-fill value (0 ps)");
+    mean = 0.;
+  }
+  if (sigmae > 300.) {
+    Log("error on sigma is large: store default TOFreso value (200 ps)");
+    sigma = 200.;
+  }
+
+  /* scratch values from the fit and use max bin center as t0-fill */
+  mean = maxBinCenter;
+  sigma = -1.;
+  Log(Form("do not care about fitted value, just use max bin as t0-fill: %f ps", mean));
+
+  /* create RunParams object */
+  UInt_t timestamp[1] = {0};
+  Float_t t0[1] = {mean};
+  Float_t tofReso[1] = {sigma};
+  Float_t t0Spread[1] = {-1.};
+  AliTOFRunParams *runParamsObject = new AliTOFRunParams(1);
+  runParamsObject->SetTimestamp(timestamp);
+  runParamsObject->SetT0(t0);
+  runParamsObject->SetTOFResolution(tofReso);
+  runParamsObject->SetT0Spread(t0Spread);
+  runParamsObject->SetUseLHCClockPhase(kFALSE);
+
+  /* store reference data */
+  if(fStoreRefData){
+    AliCDBMetaData metaDataHisto;
+    metaDataHisto.SetBeamPeriod(0);
+    metaDataHisto.SetResponsible("Roberto Preghenella");
+    metaDataHisto.SetComment("online T0-fill histogram");
+    if (!StoreReferenceData("Calib","T0Fill", hT0Fill, &metaDataHisto)) {
+      Log("error while storing reference data");
+      delete hT0Fill;
+      delete hit;
+      delete runParamsObject;
+      return 21;
+    }
+    Log("reference data successfully stored");
+  }
+  
+  AliCDBMetaData metaData;
+  metaData.SetBeamPeriod(0);
+  metaData.SetResponsible("Roberto Preghenella");
+  metaData.SetComment("online RunParams measurement");
+  if (!Store("Calib", "RunParams", runParamsObject, &metaData, 0, kFALSE)) {
+    Log("error while storing RunParams object");
+    delete hT0Fill;
+    delete hit;
+    delete runParamsObject;
+    return 21;
+  }
+  Log("RunParams object successfully stored");
+
+  delete hT0Fill;
+  delete hit;
+  delete runParamsObject;
+  return 0;
+
+}
+//_____________________________________________________________________________
+
+UInt_t 
+AliTOFPreprocessor::ProcessNoiseCalibTrg()
+{
+  // Processing data from DAQ using calibration triggers for noise measurement 
+
+  Log("Processing Noise (calibration trigger)");
+
+  /* check status and matching window available */
+  if (!fStatus || !fMatchingWindow){
+    AliError("No valid fStatus or fMatchingWindow found, some errors must have occurred!!");
+    return 22;
+  }
+
+  Float_t noiseThr = 1000.;   // setting default threshold for noise to 1000 Hz
+  // reading config map
+  AliCDBEntry *cdbEntry = GetFromOCDB("Calib","ConfigNoise");
+  if (!cdbEntry) Log(Form("No Configuration entry found in CDB, using default values: NoiseThr = %f",noiseThr));
+  else {
+    TMap *configMap = (TMap*)cdbEntry->GetObject();
+    if (!configMap) Log(Form("No map found in Config entry in CDB, using default values: NoiseThr = %f", noiseThr));
+    else {
+      TObjString *strNoiseThr = (TObjString*)configMap->GetValue("NoiseThr");
+      if (strNoiseThr) {
+       TString tmpstr = strNoiseThr->GetString();
+       noiseThr = tmpstr.Atoi();
+      }
+      else Log(Form("No NoiseThr value found in Map from ConfigNoise entry in CDB, using default value: NoiseThr = %f",noiseThr));
+    }
+  }
+
+  /* get file sources from FXS */
+  TList *fileList = GetFileSources(kDAQ, "CALIB");
+  if (!fileList || fileList->GetEntries() == 0) {
+    Log("cannot get DAQ source file list or empty list");
+    return 22;
+  }
+  Log(Form("got DAQ source file list: %d files", fileList->GetEntries()));
+  fileList->Print();
+
+  /* open input file (only one expected) */
+  TObjString *str = (TObjString *)fileList->At(0);
+  TString filename = GetFile(kDAQ, "CALIB", str->GetName());
+  Log(Form("opening input file: source=%s, filename=%s", str->String().Data(), filename.Data()));
+  TFile *filein = TFile::Open(filename.Data());
+  if (!filein || !filein->IsOpen()) {
+    Log("cannot open input file");
+    return 22;
+  }
+
+  /* get histo from input file */
+  TH1F *hCalibHit = (TH1F *)filein->Get("hCalibHit");
+  if (!hCalibHit) {
+    Log("cannot get \"hCalibHit\" histo");
+    return 22;
+  }
+
+  /* create and set noise rate histo and check rate */
+  TH1F *hNoiseRate = new TH1F("hNoiseRate", ";index;rate (Hz)", fNChannels, 0., fNChannels);
+  Float_t rate, rate_err;
+  for (Int_t ich = 0; ich < fNChannels; ich++) {
+    /* check channel enabled */
+    if (fStatus->GetHWStatus(ich) == AliTOFChannelOnlineStatusArray::kTOFHWBad) continue;
+    /* set noise rate histo */
+    rate = hCalibHit->GetBinContent(ich + 1);
+    rate_err = hCalibHit->GetBinError(ich + 1);
+    rate /= fMatchingWindow[ich] * 1.e-9;
+    rate_err /= fMatchingWindow[ich] * 1.e-9;
+    hNoiseRate->SetBinContent(ich + 1, rate);
+    hNoiseRate->SetBinError(ich + 1, rate_err);
+    /* check error */
+    if (rate_err == 0.) continue;
+    /* check noise rate and set noise flags */
+    if ((rate - 3. * rate_err) > noiseThr) {
+      Log(Form("channel %d detected as noisy: rate = (%f +- %f) Hz", ich, rate, rate_err));
+      if (fStatus->GetNoiseStatus(ich) == AliTOFChannelOnlineStatusArray::kTOFNoiseOk) {
+       Log(Form("channel %d noise status changed from Ok to Bad", ich));
+       fStatus->SetNoiseStatus(ich, AliTOFChannelOnlineStatusArray::kTOFNoiseBad);
+       fIsStatusMapChanged = kTRUE;
+      }
+      else Log(Form("channel %d noise status unchanged", ich));
+    }
+    else if ((rate + 3. * rate_err) < noiseThr) {
+      if (fStatus->GetNoiseStatus(ich) == AliTOFChannelOnlineStatusArray::kTOFNoiseBad) {
+       Log(Form("channel %d noise status changed from Bad to Ok", ich));
+       fStatus->SetNoiseStatus(ich, AliTOFChannelOnlineStatusArray::kTOFNoiseOk);
+       fIsStatusMapChanged = kTRUE;
+      }
+    }
+  }
+
+  /* store reference data */
+  if(fStoreRefData){
+    AliCDBMetaData metaDataHisto;
+    metaDataHisto.SetBeamPeriod(0);
+    metaDataHisto.SetResponsible("Roberto Preghenella");
+    metaDataHisto.SetComment("calibration trigger noise rate histogram");
+    if (!StoreReferenceData("Calib","CalibNoise", hNoiseRate, &metaDataHisto)) {
+      Log("error while storing reference data");
+      delete hNoiseRate;
+      filein->Close();
+      return 22;
+    }
+    Log("reference data successfully stored");
+  }
+
+  delete hNoiseRate;
+  filein->Close();
+  return 0;
+}
+
+//_____________________________________________________________________________
+
+UInt_t 
+AliTOFPreprocessor::ProcessReadout()
+{
+  // Processing data from DAQ to compute reaodut efficiency
+
+  Log("Processing Readout");
+
+  /* get file sources from FXS */
+  TList *fileList = GetFileSources(kDAQ, "READOUT");
+  if (!fileList || fileList->GetEntries() == 0) {
+    Log("cannot get DAQ source file list or empty list");
+    return 22;
+  }
+  Log(Form("got DAQ source file list: %d files", fileList->GetEntries()));
+  fileList->Print();
+
+  /* open input file (only one expected) */
+  TObjString *str = (TObjString *)fileList->At(0);
+  TString filename = GetFile(kDAQ, "READOUT", str->GetName());
+  Log(Form("opening input file: source=%s, filename=%s", str->String().Data(), filename.Data()));
+  TFile *filein = TFile::Open(filename.Data());
+  if (!filein || !filein->IsOpen()) {
+    Log("cannot open input file");
+    return 23;
+  }
+
+  /* get histo from input file */
+  TH1F *hChainEfficiency = (TH1F *)filein->Get("hChainEfficiency");
+  if (!hChainEfficiency) {
+    Log("cannot get \"hChainEfficiency\" histo");
+    return 23;
+  }
+
+  /* fill channel efficiency histo */
+
+ /* temporarly disable warnings */
+  AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
+  AliLog::SetGlobalLogLevel(AliLog::kError);
+
+  TH1F *hChannelEfficiency = new TH1F("hChannelEfficiency", "Channel readout efficiency;index;efficiency", fNChannels, 0., fNChannels);
+  Int_t chainIndex, det[5], dummy, index;
+  Float_t effi, effi_err;
+  /* loop over DDLs */
+  for (Int_t iddl = 0; iddl < 72; iddl++) {
+    /* loop over TRMs */
+    for (Int_t itrm = 0; itrm < 10; itrm++) {
+      /* loop over chains */
+      for (Int_t ichain = 0; ichain < 2; ichain++) {
+       chainIndex = ichain + 2 * itrm + 20 * iddl;
+       effi = hChainEfficiency->GetBinContent(chainIndex + 1);
+       effi_err = hChainEfficiency->GetBinError(chainIndex + 1);
+       /* loop over TDCs */
+       for (Int_t itdc = 0; itdc < 15; itdc++) {
+         /* loop over channels */
+         for (Int_t ichannel = 0; ichannel < 8; ichannel++) {
+
+           /* get channel index */
+           AliTOFRawStream::EquipmentId2VolumeId(iddl, itrm + 3, ichain, itdc, ichannel, det);
+           dummy = det[4];
+           det[4] = det[3];
+           det[3] = dummy;
+           /* check valid index */
+           if (det[0] < 0 || det[0] > 17 ||
+               det[1] < 0 || det[1] > 5 ||
+               det[2] < 0 || det[2] > 18 ||
+               det[3] < 0 || det[3] > 1 ||
+               det[4] < 0 || det[4] > 47) continue;
+           index = AliTOFGeometry::GetIndex(det);
+
+           /* set channel efficiency */
+           hChannelEfficiency->SetBinContent(index + 1, effi);
+           hChannelEfficiency->SetBinError(index + 1, effi_err);
+
+         }
+       }
+      }
+    }
+  }
+
+  /* re-enable warnings */
+  AliLog::SetGlobalLogLevel(logLevel);
+
+  /* store reference data */
+  if(fStoreRefData){
+    /* setup TOF readout info object */
+    AliTOFReadoutInfo readoutInfo;
+    readoutInfo.SetChainEfficiency((TH1F *)filein->Get("hChainEfficiency"));
+    readoutInfo.SetTRMData((TH1F *)filein->Get("hTRMData"));
+    readoutInfo.SetTRMEmptyEvent((TH1F *)filein->Get("hTRMEmptyEvent"));
+    readoutInfo.SetTRMBadEventCounter((TH1F *)filein->Get("hTRMBadEventCounter"));
+    readoutInfo.SetTRMBadCRC((TH1F *)filein->Get("hTRMBadCRC"));
+    readoutInfo.SetChainData((TH1F *)filein->Get("hChainData"));
+    readoutInfo.SetChainBadStatus((TH1F *)filein->Get("hChainBadStatus"));
+    readoutInfo.SetChainBadEventCounter((TH1F *)filein->Get("hChainBadEventCounter"));
+    readoutInfo.SetTDCError((TH1F *)filein->Get("hTDCError"));
+    readoutInfo.SetTDCErrorFlags((TH2F *)filein->Get("hTDCErrorFlags"));
+
+    AliCDBMetaData metaDataHisto;
+    metaDataHisto.SetBeamPeriod(0);
+    metaDataHisto.SetResponsible("Roberto Preghenella");
+    metaDataHisto.SetComment("readout info data");
+    if (!StoreReferenceData("Calib","ReadoutInfo", &readoutInfo, &metaDataHisto)) {
+      Log("error while storing reference data");
+      filein->Close();
+      return 23;
+    }
+    Log("reference data successfully stored");
+  }
+
+  AliCDBMetaData metaData;
+  metaData.SetBeamPeriod(0);
+  metaData.SetResponsible("Roberto Preghenella");
+  metaData.SetComment("online ReadoutEfficiency measurement");
+  if (!Store("Calib", "ReadoutEfficiency", hChannelEfficiency, &metaData, 0, kFALSE)) {
+    Log("error while storing ReadoutEfficiency object");
+    delete hChannelEfficiency;
+    filein->Close();
+    return 23;
+  }
+  Log("ReadoutEfficiency object successfully stored");
+
+  delete hChannelEfficiency;
+  filein->Close();
+  return 0;
+}
+
 //_____________________________________________________________________________
 
 UInt_t AliTOFPreprocessor::ProcessPulserData()
@@ -573,6 +1282,10 @@ UInt_t AliTOFPreprocessor::ProcessPulserData()
                  for (Int_t jj=0;jj<listPulser->GetEntries();jj++){
                          Int_t nPulserSource = 0;
                          TObjString * str = dynamic_cast<TObjString*> (listPulser->At(jj));
+                         if (!str) {
+                           AliError("dynamic_cast returned NULL");
+                           return 4;
+                         }
                          AliInfo(Form("found source %s", str->String().Data()));
                          // file to be stored run per run
                          TString fileNamePulser = GetFile(kDAQ, "PULSER", str->GetName());
@@ -701,9 +1414,7 @@ UInt_t AliTOFPreprocessor::ProcessPulserData()
     AliCDBMetaData metaDataHisto;
     metaDataHisto.SetBeamPeriod(0);
     metaDataHisto.SetResponsible("Chiara Zampolli");
-    char comment[200];
-    sprintf(comment,"This preprocessor stores the Ref data from a pulser run.");
-    metaDataHisto.SetComment(comment);
+    metaDataHisto.SetComment("This preprocessor stores the Ref data from a pulser run.");
     AliInfo("Storing Reference Data");
     resultPulserRef = StoreReferenceData("Calib","PulserData",htofPulser, &metaDataHisto);
     if (!resultPulserRef){
@@ -748,12 +1459,12 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
   // reading config map
   AliCDBEntry *cdbEntry = GetFromOCDB("Calib","ConfigNoise");
   if (!cdbEntry) {
-         Log(Form("No Configuration entry found in CDB, using default values: NoiseThr = %d",noiseThr));
+         Log(Form("No Configuration entry found in CDB, using default values: NoiseThr = %f",noiseThr));
   }
   else {
          TMap *configMap = (TMap*)cdbEntry->GetObject();
          if (!configMap){
-                 Log(Form("No map found in Config entry in CDB, using default values: NoiseThr = %d", noiseThr));
+                 Log(Form("No map found in Config entry in CDB, using default values: NoiseThr = %f", noiseThr));
          }
          else{
                  TObjString *strNoiseThr = (TObjString*)configMap->GetValue("NoiseThr");
@@ -762,7 +1473,7 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
                          noiseThr = tmpstr.Atoi();
                  }
                  else {
-                         Log(Form("No NoiseThr value found in Map from ConfigNoise entry in CDB, using default value: NoiseThr = %i",noiseThr));
+                         Log(Form("No NoiseThr value found in Map from ConfigNoise entry in CDB, using default value: NoiseThr = %f",noiseThr));
                  }
          }
   }
@@ -803,6 +1514,10 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
                  for (Int_t jj=0;jj<listNoise->GetEntries();jj++){
                          Int_t nNoiseSource = 0;
                          TObjString * str = dynamic_cast<TObjString*> (listNoise->At(jj));
+                         if (!str) {
+                           AliError("dynamic_cast returned NULL");
+                           return 4;
+                         }
                          AliInfo(Form("found source %s", str->String().Data()));
                          // file to be stored run per run
                          TString fileNameNoise = GetFile(kDAQ, "NOISE", str->GetName());
@@ -942,9 +1657,7 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
     AliCDBMetaData metaDataHisto;
     metaDataHisto.SetBeamPeriod(0);
     metaDataHisto.SetResponsible("Chiara Zampolli");
-    char comment[200];
-    sprintf(comment,"This preprocessor stores the Ref data from a noise run. ");
-    metaDataHisto.SetComment(comment);
+    metaDataHisto.SetComment("This preprocessor stores the Ref data from a noise run. ");
     AliInfo("Storing Reference Data");
     resultNoiseRef = StoreReferenceData("Calib","NoiseData",htofNoise, &metaDataHisto);
     if (!resultNoiseRef){
@@ -987,28 +1700,40 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
 
   Log("Processing FEE");
 
-  Bool_t updateOCDB = kFALSE;
+  //Bool_t updateOCDB = kFALSE;
   AliTOFFEEReader feeReader;
 
   TH1C hCurrentFEE("hCurrentFEE","histo with current FEE channel status", fNChannels, 0, fNChannels);
   
-  /* load current TOF FEE config from DCS FXS, parse, 
+  /* load current TOF FEE(dump) from DCS FXS, 
+   * setup TOFFEEdump object */
+
+  const char * toffeeFileName = GetFile(kDCS,"TofFeeMap",""); 
+  AliInfo(Form("toffee file name = %s", toffeeFileName));
+  if (toffeeFileName == NULL) {
+    return 15;
+  } 
+  AliTOFFEEDump feedump;
+  feedump.ReadFromFile(toffeeFileName);
+  
+  /* load current TOF FEE(light) config from DCS FXS, parse, 
    * fill current FEE histogram and set FEE status */
   
-  const char * nameFile = GetFile(kDCS,"TofFeeMap",""); 
-  AliInfo(Form("nameFile = %s",nameFile));
+  const char * nameFile = GetFile(kDCS,"TofFeeLightMap",""); 
+  AliInfo(Form("toffeeLight file name = %s",nameFile));
   if (nameFile == NULL) {
          return 15;
   } 
-  feeReader.LoadFEEConfig(nameFile);
-  Int_t parseFee = feeReader.ParseFEEConfig();
-  AliDebug(2,Form("%i enabled channels found in FEE configuration",parseFee));
+  feeReader.LoadFEElightConfig(nameFile);
+  Int_t parseFee = feeReader.ParseFEElightConfig();
+  AliDebug(2,Form("%i enabled channels found in FEElight configuration",parseFee));
   /* load stored TOF FEE from OCDB and compare it with current FEE.
    * if stored FEE is different from current FEE set update flag.
    * if there is no stored FEE in OCDB set update flag */
   
   fMatchingWindow = new Int_t[fNChannels];
-
+  fLatencyWindow = new Int_t[fNChannels];
+  
   AliCDBEntry *cdbEntry = GetFromOCDB("Calib","Status");
   if (!cdbEntry) {
          /* no CDB entry found. set update flag */
@@ -1016,7 +1741,8 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
          Log("No CDB Status entry found, creating a new one!");
          Log("     *********************************");
          fStatus = new AliTOFChannelOnlineStatusArray(fNChannels);
-         updateOCDB = kTRUE;
+         //updateOCDB = kTRUE;
+         fIsStatusMapChanged = kTRUE;
   }
   else {
          if (cdbEntry) cdbEntry->SetOwner(kFALSE);
@@ -1024,6 +1750,17 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
          fStatus = (AliTOFChannelOnlineStatusArray*) cdbEntry->GetObject();
          delete cdbEntry;
          cdbEntry = 0x0;
+         /* cehck whether status object has latency window data */
+         if (!fStatus->HasLatencyWindow()) {
+           /* create new status object and update OCDB */
+           Log("     ************ WARNING ************");
+           Log("CDB Status entry found but has no latency window data, creating a new one!");
+           Log("     *********************************");
+           delete fStatus;
+           fStatus = new AliTOFChannelOnlineStatusArray(fNChannels);
+           //updateOCDB = kTRUE;
+           fIsStatusMapChanged = kTRUE;
+         }
   }
   for (Int_t iChannel = 0; iChannel < fNChannels; iChannel++){
          //AliDebug(2,Form("********** channel %i",iChannel));
@@ -1031,17 +1768,26 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
           * if different set update flag and break loop */
          //AliDebug(2,Form( " channel %i status before FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
          fMatchingWindow[iChannel] = feeReader.GetMatchingWindow(iChannel);
+         fLatencyWindow[iChannel] = feeReader.GetLatencyWindow(iChannel);
          if (feeReader.IsChannelEnabled(iChannel)) {
                  hCurrentFEE.SetBinContent(iChannel + 1, 1);
                  if (fStatus->GetHWStatus(iChannel)!=AliTOFChannelOnlineStatusArray::kTOFHWOk){
-                         updateOCDB = kTRUE;
+                         //updateOCDB = kTRUE;
+                         fIsStatusMapChanged = kTRUE;
                          fStatus->SetHWStatus(iChannel,AliTOFChannelOnlineStatusArray::kTOFHWOk);
                          AliDebug(3,Form( " changed into enabled: channel %i status after FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
                  }
+                 if (fStatus->GetLatencyWindow(iChannel)!=fLatencyWindow[iChannel]){
+                         //updateOCDB = kTRUE;
+                         fIsStatusMapChanged = kTRUE;
+                         fStatus->SetLatencyWindow(iChannel,fLatencyWindow[iChannel]);
+                         AliDebug(3,Form( " changed latency window: channel %i latency window after FEE = %i",iChannel,fStatus->GetLatencyWindow(iChannel)));
+                 }
          }
          else {
                  if (fStatus->GetHWStatus(iChannel)!=AliTOFChannelOnlineStatusArray::kTOFHWBad){
-                         updateOCDB = kTRUE;
+                         //updateOCDB = kTRUE;
+                         fIsStatusMapChanged = kTRUE;
                          fStatus->SetHWStatus(iChannel,AliTOFChannelOnlineStatusArray::kTOFHWBad);
                          AliDebug(3,Form( " changed into disabled: channel %i status after FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
                  }
@@ -1052,62 +1798,35 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
   /* check whether we don't have to store reference data.
    * in this case we return without errors. */
   if (fStoreRefData) {
-         /* store reference data */
-         AliCDBMetaData metaDataHisto;
-         metaDataHisto.SetBeamPeriod(0);
-         metaDataHisto.SetResponsible("Roberto Preghenella");
-         metaDataHisto.SetComment("This preprocessor stores the FEE Ref data of the current run.");
-         AliInfo("Storing FEE reference data");
-         /* store FEE reference data */
-         if (!StoreReferenceData("Calib", "FEEData", &hCurrentFEE, &metaDataHisto)) {
-                 /* failed */
-                 Log("problems while storing FEE reference data");
-                 if (fStatus){
-                         delete fStatus;
-                         fStatus = 0;
-                 }
-                 return 18; /* error return code for problems while storing FEE reference data */
-         }
-  }
-
-  /* check whether we don't need to update OCDB.
-   * in this case we can return without errors and
-   * the current FEE is stored in the fStatus object. */
-  if (!updateOCDB) {
-    AliInfo("TOF FEE config has not changed. Do not overwrite stored file.");
-    return 0; /* return ok */
-  }
-
-  TString runType = GetRunType();
-  if (runType != "PHYSICS") {
-         AliInfo(Form("Run Type = %s, waiting to store status map",GetRunType()));
-    return 0; /* return ok */
-  }
-
-  /* update the OCDB with the current FEE since even 
-   * a little difference has been detected. */
-
-  AliCDBMetaData metaData;
-  metaData.SetBeamPeriod(0);
-  metaData.SetResponsible("Roberto Preghenella");
-  metaData.SetComment("This preprocessor fills an AliTOFChannelOnlineStatusArray object from FEE data.");
-  AliInfo("Storing Status data from current run after FEE parsing");
-  /* store FEE data */
-  if (!Store("Calib", "Status", fStatus, &metaData, 0, kTRUE)) {
-    /* failed */
-    Log("problems while storing FEE data object");
-    if (fStatus){
-           delete fStatus;
-           fStatus = 0;
+    /* store reference data */
+    AliCDBMetaData metaDataHisto;
+    metaDataHisto.SetBeamPeriod(0);
+    metaDataHisto.SetResponsible("Roberto Preghenella");
+    metaDataHisto.SetComment("This preprocessor stores the FEE Ref data of the current run.");
+    AliInfo("Storing FEE reference data");
+    /* store FEE reference data */
+    if (!StoreReferenceData("Calib", "FEEData", &hCurrentFEE, &metaDataHisto)) {
+      /* failed */
+      Log("problems while storing FEE reference data");
+      if (fStatus){
+       delete fStatus;
+       fStatus = 0;
+      }
+      return 18; /* error return code for problems while storing FEE reference data */
+    }
+    
+    /* store TOF FEE dump reference data */
+    AliCDBMetaData metaDatadump;
+    metaDatadump.SetBeamPeriod(0);
+    metaDatadump.SetResponsible("Roberto Preghenella");
+    metaDatadump.SetComment("This preprocessor stores the TOF FEE dump Ref data of the current run.");
+    AliInfo("Storing TOF FEE dump reference data");
+    /* store FEE reference data */
+    if (!StoreReferenceData("Calib", "FEEDump", &feedump, &metaDatadump)) {
+      /* failed */
+      Log("problems while storing TOF FEE dump reference data");
+      return 18; /* error return code for problems while storing FEE reference data */
     }
-    return 17; /* return error code for problems  while storing FEE data */
-  }
-
-  /* everything fine. return */
-
-  if (fStatus){
-    delete fStatus;
-    fStatus = 0;
   }
 
   return 0;
@@ -1116,10 +1835,10 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
 
 //_____________________________________________________________________________
 
-UInt_t AliTOFPreprocessor::Process(TMapdcsAliasMap)
+UInt_t AliTOFPreprocessor::Process(TMap *dcsAliasMap)
 {
   //
-  //
+  // Main AliTOFPreprocessor method called by SHUTTLE
   //
 
   TString runType = GetRunType();
@@ -1141,16 +1860,15 @@ UInt_t AliTOFPreprocessor::Process(TMap* dcsAliasMap)
     Int_t iresultNoise = ProcessNoiseData();
     return iresultNoise; 
   }
-  
   if (runType == "PHYSICS") {
-    Int_t iresultDAQ = ProcessOnlineDelays();
-    if (iresultDAQ != 0) {
-      return iresultDAQ;
-    }
-    else {
-      Int_t iresultDCS = ProcessDCSDataPoints(dcsAliasMap);
-      return iresultDCS;
-    }
+    //    Int_t iresultDAQ = ProcessOnlineDelays();
+    Int_t iresultDAQ = ProcessT0Fill();
+    Int_t iresultNoiseCalib = ProcessNoiseCalibTrg();
+    Int_t iresultReadout = ProcessReadout();
+    Int_t iresultDCS = ProcessDCSDataPoints(dcsAliasMap);
+    Int_t iResultHVandLVdps = ProcessHVandLVdps(dcsAliasMap);
+    return iresultDAQ+iresultNoiseCalib+iresultDCS+iResultHVandLVdps+iresultReadout;
   }
 
   // storing
@@ -1158,3 +1876,89 @@ UInt_t AliTOFPreprocessor::Process(TMap* dcsAliasMap)
 }
 
 
+//_____________________________________________________________________________
+
+void
+AliTOFPreprocessor::FillWithCosmicCalibration(AliTOFChannelOnlineArray *cal)
+{
+  /*
+   * fill with cosmic calibration 
+   */
+
+  Log(" Using cosmic-ray calibration.");
+  
+  AliTOFcalibHisto calibHisto;
+  calibHisto.SetFullCorrectionFlag(AliTOFcalibHisto::kTimeSlewingCorr, kFALSE);
+  Log(Form(" loading calibration histograms from %s", calibHisto.GetCalibHistoFileName()));
+  Log(Form(" loading calibration parameters from %s", calibHisto.GetCalibParFileName()));
+  calibHisto.LoadCalibPar();
+  
+  /* loop over channel index */
+  for (Int_t iIndex = 0; iIndex < fNChannels; iIndex++) {
+    cal->SetDelay(iIndex, calibHisto.GetFullCorrection(iIndex));
+  }
+  
+}
+
+//_____________________________________________________________________________
+
+void
+AliTOFPreprocessor::FillWithCableLengthMap(AliTOFChannelOnlineArray *cal)
+{
+  /*
+   * fill with cosmic calibration 
+   */
+  
+  Log(" Using cable-length map.");
+  AliTOFRawStream tofrs;
+  Int_t det[5], dummy, index;
+  Float_t cableTimeShift;
+  
+  /* temporarly disable warnings */
+  AliLog::EType_t logLevel = (AliLog::EType_t)AliLog::GetGlobalLogLevel();
+  AliLog::SetGlobalLogLevel(AliLog::kError);
+  
+  /* loop over EO indeces */
+  for (Int_t iddl = 0; iddl < 72; iddl++)
+    for (Int_t islot = 3; islot <= 12; islot++)
+      for (Int_t ichain = 0; ichain < 2; ichain++)
+       for (Int_t itdc = 0; itdc < 15; itdc++)
+         for (Int_t ichannel = 0; ichannel < 8; ichannel++) {
+           
+           /* get DO index */
+           tofrs.EquipmentId2VolumeId(iddl, islot, ichain, itdc, ichannel, det);
+           
+           /* swap det[3] and det[4] indeces (needed to obtain correct channel index) */
+           dummy = det[3];
+           det[3] = det[4];
+           det[4] = dummy;
+           
+           /* check DO index */
+           if (det[0] < 0 || det[0] > 17 ||
+               det[1] < 0 || det[1] > 4 ||
+               det[2] < 0 || det[2] > 18 ||
+               det[3] < 0 || det[3] > 1 ||
+               det[4] < 0 || det[4] > 47)
+             continue;
+           
+           /* get channel index */
+           index = AliTOFGeometry::GetIndex(det);
+           if (index < 0) continue;
+           
+           /* get cable time shift */
+           cableTimeShift = AliTOFCableLengthMap::GetCableTimeShift(iddl, islot, ichain, itdc);
+           
+           /* set delay */
+           if (index<fNChannels) {
+             cal->SetDelay(index,cableTimeShift);  // delay in ns
+             AliDebug(2,Form("Setting delay %f (ns) for channel %i",cableTimeShift,index));
+           }
+           
+         } /* loop over EO indeces */
+  
+  /* re-enable warnings */
+  AliLog::SetGlobalLogLevel(logLevel);
+  
+}
+
+