]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFPreprocessor.cxx
Minor changes
[u/mrichter/AliRoot.git] / TOF / AliTOFPreprocessor.cxx
index 9da5cae07e55da0be92f4c371c4296d8c841fbf4..2b841a23c71380a0aa5de6bba555353ffc87e3af 100644 (file)
 #include "AliTOFGeometry.h"
 #include "AliTOFPreprocessor.h"
 #include "AliTOFFEEReader.h"
+#include "AliTOFRawStream.h"
+#include "AliTOFCableLengthMap.h"
+#include "AliTOFcalibHisto.h"
+
 
 // TOF preprocessor class.
 // It takes data from DCS and passes them to the class AliTOFDataDCS, which
@@ -77,12 +81,12 @@ const Double_t AliTOFPreprocessor::fgkThrPar      = 0.013; // parameter used to
 AliTOFPreprocessor::AliTOFPreprocessor(AliShuttleInterface* shuttle) :
   AliPreprocessor("TOF", shuttle),
   fData(0),
-  fh2(0),
   fCal(0),
   fNChannels(0),
   fStoreRefData(kTRUE),
   fFDRFlag(kFALSE),
-  fStatus(0)
+  fStatus(0),
+  fMatchingWindow(0)
 {
   // constructor
   AddRunType("PHYSICS");
@@ -96,23 +100,6 @@ AliTOFPreprocessor::AliTOFPreprocessor(AliShuttleInterface* shuttle) :
 AliTOFPreprocessor::~AliTOFPreprocessor()
 {
   // destructor
-  if (fData){
-    delete fData;
-    fData = 0;
-  }
-  if (fh2){
-    delete fh2;
-    fh2 = 0;
-  }
-  if (fCal){
-    //    fCal->Clear();
-    delete fCal;
-    fCal = 0;
-  }
-  if (fStatus){
-    delete fStatus;
-    fStatus = 0;
-  }
 }
 
 //______________________________________________________________________________
@@ -123,13 +110,11 @@ void AliTOFPreprocessor::Initialize(Int_t run, UInt_t startTime,
 
   AliPreprocessor::Initialize(run, startTime, endTime);
 
-       AliInfo(Form("\n\tRun %d \n\tStartTime %s \n\tEndTime %s", run,
+       AliInfo(Form("\n\tRun %d \n\tStartTime %s \n\tEndTime %s \n\tStartTime DCS Query %s \n\tEndTime DCS Query %s", run,
                TTimeStamp(startTime).AsString(),
-               TTimeStamp(endTime).AsString()));
+               TTimeStamp(endTime).AsString(), ((TTimeStamp)GetStartTimeDCSQuery()).AsString(), ((TTimeStamp)GetEndTimeDCSQuery()).AsString()));
 
-       fData = new AliTOFDataDCS(fRun, fStartTime, fEndTime);
-       fData->SetFDRFlag(fFDRFlag);
-       fh2 = 0x0;
+       fData = new AliTOFDataDCS(fRun, fStartTime, fEndTime, GetStartTimeDCSQuery(), GetEndTimeDCSQuery());
        fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
 }
 //_____________________________________________________________________________
@@ -161,15 +146,26 @@ UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap* dcsAliasMap)
 
   // processing DCS
 
+  fData->SetFDRFlag(fFDRFlag);
+  
   if (!dcsAliasMap){
     Log("No DCS map found: TOF exiting from Shuttle");
+    if (fData){
+           delete fData;
+           fData = 0;
+    }
     return 1;// return error Code for DCS input data not found 
   }
   else {
+
   // 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");
+      if (fData){
+             delete fData;
+             fData = 0;
+      }
       return 2;// return error Code for processed DCS data not stored 
     }
     else{
@@ -181,12 +177,21 @@ UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap* dcsAliasMap)
       resultDCSStore = StoreReferenceData("Calib","DCSData",fData, &metaDataDCS);
       if (!resultDCSStore){
        Log("Some problems occurred while storing DCS data results in Reference Data, TOF exiting from Shuttle");
+       if (fData){
+               delete fData;
+               fData = 0;
+       }
        return 3;// return error Code for processed DCS data not stored 
                 // in reference data
        
       }
     }
   }
+  if (fData){
+         delete fData;
+         fData = 0;
+  }
+  
   return 0;
 }
 //_____________________________________________________________________________
@@ -195,6 +200,7 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
 {
   // Processing data from DAQ for online calibration 
 
+  Bool_t updateOCDB = kFALSE;
   Log("Processing DAQ delays");
 
   // reading configuration map 
@@ -260,14 +266,36 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
   if (compDelays == "kTRUE") fFDRFlag = kFALSE;
   else fFDRFlag = kTRUE;
 
+  delete cdbEntry;
+  cdbEntry = 0x0;
+
   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);
 
   Bool_t resultDAQRef=kFALSE;
   Bool_t resultTOFPP=kFALSE;
+  TH2S *h2 = 0x0;
   // processing DAQ
   
   TFile * daqFile=0x0;
@@ -287,15 +315,19 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                  if (fileNameRun.Length()>0){
                                          AliInfo(Form("Got the file %s, now we can store the Reference Data for the current Run.", fileNameRun.Data()));
                                          daqFile = new TFile(fileNameRun.Data(),"READ");
-                                         fh2 = (TH2S*) daqFile->Get("htof");
+                                         h2 = (TH2S*) daqFile->Get("htof");
                                          AliCDBMetaData metaDataHisto;
                                          metaDataHisto.SetBeamPeriod(0);
                                          metaDataHisto.SetResponsible("Chiara Zampolli");
                                          metaDataHisto.SetComment("This preprocessor stores the array of histos object as Reference Data.");
                                          AliInfo("Storing Reference Data");
-                                         resultDAQRef = StoreReferenceData("Calib","DAQData",fh2, &metaDataHisto);
+                                         resultDAQRef = StoreReferenceData("Calib","DAQData",h2, &metaDataHisto);
                                          if (!resultDAQRef){
                                                  Log("some problems occurred::No Reference Data stored, TOF exiting from Shuttle");
+                                                 delete h2;
+                                                 delete list;
+                                                 delete fCal;
+                                                 fCal=0x0;
                                                  return 5;//return error code for failure in storing Ref Data 
                                          }
                                          daqFile->Close();
@@ -304,6 +336,9 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                  
                                  else{
                                          Log("The input data file from DAQ (run-level) was not found, TOF exiting from Shuttle "); 
+                                         delete list;
+                                         delete fCal;
+                                         fCal=0x0;
                                          return 4;//return error code for failure in retrieving Ref Data 
                                  }
                          }
@@ -311,6 +346,8 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                  }
          else{
                  Log("The input data file list from DAQ (run-level) was not found, TOF exiting from Shuttle "); 
+                 delete fCal;
+                 fCal=0x0;
                  return 4;//return error code for failure in retrieving Ref Data 
          }     
   }
@@ -333,26 +370,55 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                  AliInfo(Form("Got the file %s, now we can extract some values.", fileName.Data()));
                                  
                                  daqFile = new TFile(fileName.Data(),"READ");
-                                 if (fh2) delete fh2;
-                                 fh2 = (TH2S*) daqFile->Get("htoftot");
-                                 if (!fh2){
+                                 if (h2) delete h2;
+                                 h2 = (TH2S*) daqFile->Get("htoftot");
+                                 if (!h2){
                                          Log("some problems occurred:: No histo retrieved, TOF exiting from Shuttle");
+                                         delete listTot;
                                          delete daqFile;
+                                         delete fCal;
+                                         fCal=0x0;
                                          return 7; //return error code for histograms not existing/junky
                                  }
                                  else {
-                                         static const Int_t kSize=fh2->GetNbinsX();
-                                         static const Int_t kNBins=fh2->GetNbinsY();
-                                         static const Double_t kXBinmin=fh2->GetYaxis()->GetBinLowEdge(1);
+                                         static const Int_t kSize=h2->GetNbinsX();
+                                         static const Int_t kNBins=h2->GetNbinsY();
+                                         static const Double_t kXBinmin=h2->GetYaxis()->GetBinLowEdge(1);
                                          if (kSize != fNChannels){
                                                  Log(" number of bins along x different from number of pads, found only a subset of the histograms, TOF exiting from Shuttle");
+                                                 delete listTot;
+                                                 delete h2;
                                                  delete daqFile;
+                                                 delete fCal;
+                                                 fCal=0x0;
                                                  return 7; //return error code for histograms not existing/junky
                                          }
                                          Int_t nNotStatistics = 0; // number of channel with not enough statistics
-                                         if (fFDRFlag) Log(" Not computing delays according to flag set in Config entry in OCDB!");
+
+                                         /* 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!");
+                                           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.
@@ -364,7 +430,7 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                                          AliDebug(2,Form(" Channel %i found ok according to FEEmap, starting delay computing",ich));
                                                          TH1S *h1 = new TH1S("h1","h1",kNBins,kXBinmin-0.5,kNBins*1.+kXBinmin-0.5);
                                                          for (Int_t ibin=0;ibin<kNBins;ibin++){
-                                                                 h1->SetBinContent(ibin+1,fh2->GetBinContent(ich+1,ibin+1));
+                                                                 h1->SetBinContent(ibin+1,h2->GetBinContent(ich+1,ibin+1));
                                                          }
                                                          if(h1->Integral()<integralThr) {
                                                                  nNotStatistics++;
@@ -413,11 +479,15 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                          }
                                          if (nNotStatistics!=0) Log(Form("Too little statistics for %d channels!",nNotStatistics)); 
                                  }
+                                 delete h2;
                                  daqFile->Close();
                                  delete daqFile;
                          }
                          else{
                                  Log("The Cumulative data file from DAQ does not exist, TOF exiting from Shuttle"); 
+                                 delete listTot;
+                                 delete fCal;
+                                 fCal=0x0;
                                  return 6;//return error code for problems in retrieving DAQ data 
                          }
                  }
@@ -425,9 +495,19 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
          }
   else{
     Log("Problem: no list for Cumulative data file from DAQ was found, TOF exiting from Shuttle");
+    delete fCal;
+    fCal=0x0;
     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);
@@ -437,9 +517,16 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
   resultTOFPP = Store("Calib","ParOnlineDelay",fCal, &metaData,deltaStartingRun,kTRUE);
   if(!resultTOFPP){
     Log("Some problems occurred while storing online object resulting from DAQ data processing");
+    delete fCal;
+    fCal=0x0;
     return 8;//return error code for problems in storing DAQ data 
   }
 
+  if (fCal){
+    delete fCal;
+    fCal = 0;
+  }
+
   return 0;
 }
 //_____________________________________________________________________________
@@ -474,102 +561,114 @@ UInt_t AliTOFPreprocessor::ProcessPulserData()
   //retrieving Pulser data 
   TList* listPulser = GetFileSources(kDAQ, "PULSER");
   if (listPulser !=0x0 && listPulser->GetEntries()!=0)
-    {
-      AliInfo("The following sources produced files with the id PULSER");
-      listPulser->Print();
-      Int_t nPulser = 0;
-      for (Int_t jj=0;jj<listPulser->GetEntries();jj++){
-       Int_t nPulserSource = 0;
-       TObjString * str = dynamic_cast<TObjString*> (listPulser->At(jj));
-       AliInfo(Form("found source %s", str->String().Data()));
-       // file to be stored run per run
-       TString fileNamePulser = GetFile(kDAQ, "PULSER", str->GetName());
-       if (fileNamePulser.Length()>0){
-         // storing refernce data
-         AliInfo(Form("Got the file %s, now we can process pulser data.", fileNamePulser.Data()));
-         daqFile = new TFile(fileNamePulser.Data(),"READ");
-         h1 = (TH1S*) daqFile->Get("hTOFpulser");
-         for (Int_t ibin=0;ibin<kSize;ibin++){
-           if ((h1->GetBinContent(ibin+1))!=-1){
-             if ((htofPulser->GetBinContent(ibin+1))==-1){
-               htofPulser->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
-             }
-             else {
-               Log(Form("Something strange occurred during Pulser run, channel %i already read by another LDC, please check!",ibin));
-             }
-           }
-         }
-         
-         // elaborating infos
-         Double_t mean =0;
-         Int_t nread=0;
-         Int_t nreadNotEmpty=0;
-         for (Int_t ientry=1;ientry<=h1->GetNbinsX();ientry++){
-
-                 AliDebug(3,Form(" channel %i pulser status before pulser = %i, with global status = %i",ientry,(Int_t)fStatus->GetPulserStatus(ientry),(Int_t)fStatus->GetStatus(ientry)));
-           /* check whether channel has been read out during current run.
-            * if the status is bad it means it has not been read out.
-            * in this case skip channel in order to not affect the mean */ 
-                 if (fStatus->GetHWStatus(ientry-1) == AliTOFChannelOnlineStatusArray::kTOFHWBad)
-                         continue;
-                 nPulser++;
-                 nPulserSource++;
-                 if (h1->GetBinContent(ientry)==-1) continue;
-                 else {
-                         if (h1->GetBinContent(ientry)>0) {
-                                 nreadNotEmpty++;
-                                 AliDebug(2,Form(" channel %i is ok with entry = %f; so far %i channels added ",ientry-1,h1->GetBinContent(ientry),nreadNotEmpty));
+         {
+                 AliInfo("The following sources produced files with the id PULSER");
+                 listPulser->Print();
+                 Int_t nPulser = 0;
+                 for (Int_t jj=0;jj<listPulser->GetEntries();jj++){
+                         Int_t nPulserSource = 0;
+                         TObjString * str = dynamic_cast<TObjString*> (listPulser->At(jj));
+                         AliInfo(Form("found source %s", str->String().Data()));
+                         // file to be stored run per run
+                         TString fileNamePulser = GetFile(kDAQ, "PULSER", str->GetName());
+                         if (fileNamePulser.Length()>0){
+                                 // storing refernce data
+                                 AliInfo(Form("Got the file %s, now we can process pulser data.", fileNamePulser.Data()));
+                                 daqFile = new TFile(fileNamePulser.Data(),"READ");
+                                 h1 = (TH1S*) daqFile->Get("hTOFpulser");
+                                 for (Int_t ibin=0;ibin<kSize;ibin++){
+                                         if ((h1->GetBinContent(ibin+1))!=-1){
+                                                 if ((htofPulser->GetBinContent(ibin+1))==-1){
+                                                         htofPulser->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
+                                                 }
+                                                 else {
+                                                         Log(Form("Something strange occurred during Pulser run, channel %i already read by another LDC, please check!",ibin));
+                                                 }
+                                         }
+                                 }
+                                 
+                                 // elaborating infos
+                                 Double_t mean =0;
+                                 Int_t nread=0;
+                                 Int_t nreadNotEmpty=0;
+                                 for (Int_t ientry=1;ientry<=h1->GetNbinsX();ientry++){
+                                         
+                                         AliDebug(3,Form(" channel %i pulser status before pulser = %i, with global status = %i",ientry,(Int_t)fStatus->GetPulserStatus(ientry),(Int_t)fStatus->GetStatus(ientry)));
+                                         /* check whether channel has been read out during current run.
+                                          * if the status is bad it means it has not been read out.
+                                          * in this case skip channel in order to not affect the mean */ 
+                                         if (fStatus->GetHWStatus(ientry-1) == AliTOFChannelOnlineStatusArray::kTOFHWBad)
+                                                 continue;
+                                         nPulser++;
+                                         nPulserSource++;
+                                         if (h1->GetBinContent(ientry)==-1) continue;
+                                         else {
+                                                 if (h1->GetBinContent(ientry)>0) {
+                                                         nreadNotEmpty++;
+                                                         AliDebug(2,Form(" channel %i is ok with entry = %f; so far %i channels added ",ientry-1,h1->GetBinContent(ientry),nreadNotEmpty));
+                                                 }
+                                                 mean+=h1->GetBinContent(ientry);
+                                                 nread++;
+                                         }
+                                 }
+                                 if (nread!=0) {
+                                         mean/=nread;
+                                         AliDebug(2,Form(" nread =  %i , nreadNotEmpty = %i, mean = %f",nread,nreadNotEmpty,mean));
+                                         for (Int_t ich =0;ich<fNChannels;ich++){
+                                                 if (h1->GetBinContent(ich+1)==-1) continue;
+                                                 AliDebug(3,Form(" channel %i pulser status before pulser = %i",ich,(Int_t)fStatus->GetPulserStatus(ich)));
+                                                 
+                                                 /* check whether channel has been read out during current run.
+                                                  * if the status is bad it means it has not been read out.
+                                                  * in this case skip channel in order to leave its status 
+                                                  * unchanged */
+                                                 if (fStatus->GetHWStatus(ich) == AliTOFChannelOnlineStatusArray::kTOFHWBad)
+                                                         continue;
+                                                 
+                                                 if (h1->GetBinContent(ich+1)<0.05*mean){
+                                                         fStatus->SetPulserStatus(ich,AliTOFChannelOnlineStatusArray::kTOFPulserBad);  // bad status for pulser
+                                                         AliDebug(2,Form( " channel %i pulser status after pulser = %i (bad, content = %f), with global status = %i",ich,(Int_t)fStatus->GetPulserStatus(ich),h1->GetBinContent(ich+1),(Int_t)fStatus->GetStatus(ich)));
+                                                 }
+                                                 else {
+                                                         fStatus->SetPulserStatus(ich,AliTOFChannelOnlineStatusArray::kTOFPulserOk);  // good status for pulser
+                                                         AliDebug(2,Form( " channel %i pulser status after pulser = %i (good), with global status = %i",ich,(Int_t)fStatus->GetPulserStatus(ich),(Int_t)fStatus->GetStatus(ich)));
+                                                 }
+                                         }
+                                 }
+                                 else {
+                                         Log("No channels read!! No action taken, keeping old status");
+                                 }
+                                 
+                                 daqFile->Close();
+                                 delete daqFile;
+                                 delete h1;
                          }
-                         mean+=h1->GetBinContent(ientry);
-                         nread++;
-                 }
-         }
-         if (nread!=0) {
-                 mean/=nread;
-                 AliDebug(2,Form(" nread =  %i , nreadNotEmpty = %i, mean = %f",nread,nreadNotEmpty,mean));
-                 for (Int_t ich =0;ich<fNChannels;ich++){
-                         if (h1->GetBinContent(ich+1)==-1) continue;
-                         AliDebug(3,Form(" channel %i pulser status before pulser = %i",ich,(Int_t)fStatus->GetPulserStatus(ich)));
-                         
-                         /* check whether channel has been read out during current run.
-                          * if the status is bad it means it has not been read out.
-                          * in this case skip channel in order to leave its status 
-                          * unchanged */
-                                 if (fStatus->GetHWStatus(ich) == AliTOFChannelOnlineStatusArray::kTOFHWBad)
-                                 continue;
                          
-                         if (h1->GetBinContent(ich+1)<0.05*mean){
-                                 fStatus->SetPulserStatus(ich,AliTOFChannelOnlineStatusArray::kTOFPulserBad);  // bad status for pulser
-                                 AliDebug(2,Form( " channel %i pulser status after pulser = %i (bad, content = %f), with global status = %i",ich,(Int_t)fStatus->GetPulserStatus(ich),h1->GetBinContent(ich+1),(Int_t)fStatus->GetStatus(ich)));
-                         }
-                         else {
-                                 fStatus->SetPulserStatus(ich,AliTOFChannelOnlineStatusArray::kTOFPulserOk);  // good status for pulser
-                                 AliDebug(2,Form( " channel %i pulser status after pulser = %i (good), with global status = %i",ich,(Int_t)fStatus->GetPulserStatus(ich),(Int_t)fStatus->GetStatus(ich)));
+                         else{
+                                 Log("The input data file from DAQ (pulser) was not found, TOF exiting from Shuttle "); 
+                                 delete listPulser;
+                                 delete htofPulser;
+                                 htofPulser = 0x0;
+                                 if (fStatus){
+                                         delete fStatus;
+                                         fStatus = 0;
+                                 }
+                                 return 10;//return error code for failure in retrieving Ref Data 
                          }
+                         AliDebug(2,Form(" Number of channels processed during pulser run from source %i = %i",jj, nPulserSource));             
                  }
+                 AliDebug(2,Form(" Number of channels processed during pulser run = %i",nPulser));
+                 delete listPulser;
          }
-         else {
-                 Log("No channels read!! No action taken, keeping old status");
-         }
-         
-         daqFile->Close();
-         delete daqFile;
-         delete h1;
-       }
-       
-       else{
-               Log("The input data file from DAQ (pulser) was not found, TOF exiting from Shuttle "); 
-               return 10;//return error code for failure in retrieving Ref Data 
-       }
-       AliDebug(2,Form(" Number of channels processed during pulser run from source %i = %i",jj, nPulserSource));
-       
-      }
-      AliDebug(2,Form(" Number of channels processed during pulser run = %i",nPulser));
-      delete listPulser;
-    }
   
   else{
          Log("The input data file list from DAQ (pulser) was not found, TOF exiting from Shuttle "); 
+         delete htofPulser;
+         htofPulser = 0x0;
+         if (fStatus){
+                 delete fStatus;
+                 fStatus = 0;
+         }
          return 10;//return error code for failure in retrieving Ref Data 
   }    
   
@@ -583,6 +682,12 @@ UInt_t AliTOFPreprocessor::ProcessPulserData()
   resultPulser = Store("Calib","Status",fStatus, &metaData,0,kTRUE);
   if(!resultPulser){
     Log("Some problems occurred while storing online object resulting from Pulser data processing");
+    delete htofPulser;
+    htofPulser = 0x0;
+    if (fStatus){
+           delete fStatus;
+           fStatus = 0;
+    }
     return 11;//return error code for problems in storing Pulser data 
   }
 
@@ -598,12 +703,26 @@ UInt_t AliTOFPreprocessor::ProcessPulserData()
     resultPulserRef = StoreReferenceData("Calib","PulserData",htofPulser, &metaDataHisto);
     if (!resultPulserRef){
       Log("some problems occurred::No Reference Data for pulser stored, TOF exiting from Shuttle");
+      delete htofPulser;
+      htofPulser = 0x0;
+      if (fStatus){
+             delete fStatus;
+             fStatus = 0;
+      }
       return 9;//return error code for failure in storing Ref Data 
     }
   }
   
   daqFile=0;
 
+  delete htofPulser;
+  htofPulser = 0x0;
+
+  if (fStatus){
+    delete fStatus;
+    fStatus = 0;
+  }
+
   return 0;
 }
 //_____________________________________________________________________________
@@ -620,6 +739,32 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
          return 20;
   }
 
+  Float_t noiseThr = 1;   // setting default threshold for noise to 1 Hz
+  // reading config map
+  AliCDBEntry *cdbEntry = GetFromOCDB("Calib","ConfigNoise");
+  if (!cdbEntry) {
+         Log(Form("No Configuration entry found in CDB, using default values: NoiseThr = %d",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));
+         }
+         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 = %i",noiseThr));
+                 }
+         }
+  }
+
+  delete cdbEntry;
+  cdbEntry = 0x0;
+
   TH1::AddDirectory(0);
 
   Bool_t resultNoiseRef=kFALSE;
@@ -636,84 +781,136 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
   TFile * daqFile=0x0;
   TH1F * h1=0x0;
   
-  //retrieving Noise data 
+  // useful counters
+  Int_t nNoise = 0;
+  Int_t nNoisyChannels = 0;
+  Int_t nNotNoisyChannels = 0;
+  Int_t nChannelsFromDA = 0;
+  Int_t nMatchingWindowNullNonZero = 0;
+  Int_t nMatchingWindowNullEqualZero = 0;
+
+  // retrieving Noise data 
   TList* listNoise = GetFileSources(kDAQ, "NOISE");
   if (listNoise !=0x0 && listNoise->GetEntries()!=0)
-    {
-      AliInfo("The following sources produced files with the id NOISE");
-      listNoise->Print();
-      Int_t nNoise = 0;
-      for (Int_t jj=0;jj<listNoise->GetEntries();jj++){
-       Int_t nNoiseSource = 0;
-       TObjString * str = dynamic_cast<TObjString*> (listNoise->At(jj));
-       AliInfo(Form("found source %s", str->String().Data()));
-       // file to be stored run per run
-       TString fileNameNoise = GetFile(kDAQ, "NOISE", str->GetName());
-       if (fileNameNoise.Length()>0){
-         // storing reference data
-         AliInfo(Form("Got the file %s, now we can process noise data.", fileNameNoise.Data()));
-         daqFile = new TFile(fileNameNoise.Data(),"READ");
-         h1 = (TH1F*) daqFile->Get("hTOFnoise");
-         for (Int_t ibin=0;ibin<kSize;ibin++){
-           if ((h1->GetBinContent(ibin+1))!=-1){
-             if ((htofNoise->GetBinContent(ibin+1))==-1){
-               htofNoise->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
-             }
-             else {
-               Log(Form("Something strange occurred during Noise run, channel %i already read by another LDC, please check!",ibin));
-             }
-           }
-         }
-         // elaborating infos
-         for (Int_t ich =0;ich<fNChannels;ich++){
-           if (h1->GetBinContent(ich+1)==-1) continue;
-           AliDebug(3,Form(" channel %i noise status before noise = %i, with global status = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich),(Int_t)fStatus->GetStatus(ich)));
-           //AliDebug(2,Form( " channel %i status before noise = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich)));
-
-           /* check whether channel has been read out during current run.
-            * if the status is bad it means it has not been read out.
-            * in this case skip channel in order to leave its status 
-            * unchanged */
-           if ((fStatus->GetHWStatus(ich)) == AliTOFChannelOnlineStatusArray::kTOFHWBad)
-             continue;
+         {
+                 AliInfo("The following sources produced files with the id NOISE");
+                 listNoise->Print();
+                 for (Int_t jj=0;jj<listNoise->GetEntries();jj++){
+                         Int_t nNoiseSource = 0;
+                         TObjString * str = dynamic_cast<TObjString*> (listNoise->At(jj));
+                         AliInfo(Form("found source %s", str->String().Data()));
+                         // file to be stored run per run
+                         TString fileNameNoise = GetFile(kDAQ, "NOISE", str->GetName());
+                         if (fileNameNoise.Length()>0){
+                                 // storing reference data
+                                 AliInfo(Form("Got the file %s, now we can process noise data.", fileNameNoise.Data()));
+                                 daqFile = new TFile(fileNameNoise.Data(),"READ");
+                                 h1 = (TH1F*) daqFile->Get("hTOFnoise");
+                                 for (Int_t ibin=0;ibin<kSize;ibin++){
+                                         if ((h1->GetBinContent(ibin+1))!=-1){
+                                                 nNoiseSource++;
+                                                 // checking the matching window for current channel
+                                                 if (fMatchingWindow[ibin] == 0){
+                                                         Log(Form("Matching window for channel %i null, but the channel was read by the LDC! skipping channel, BUT Please check!",ibin));
+                                                         if ((h1->GetBinContent(ibin+1))!=0) nMatchingWindowNullNonZero++;                                             
+                                                         if ((h1->GetBinContent(ibin+1))==0) nMatchingWindowNullEqualZero++;                                           
+                                                         continue;
+                                                 }
+                                                 if ((htofNoise->GetBinContent(ibin+1))==-1){
+                                                         htofNoise->SetBinContent(ibin+1,h1->GetBinContent(ibin+1)/(fMatchingWindow[ibin]*1.E-9));
+                                                         if ((h1->GetBinContent(ibin+1))!= 0) AliDebug(2,Form("Channel = %i, Matching window = %i, Content = %f", ibin, fMatchingWindow[ibin], htofNoise->GetBinContent(ibin+1)));
+                                                 }
+                                                 else {
+                                                         Log(Form("Something strange occurred during Noise run, channel %i already read by another LDC, please check!",ibin));
+                                                 }
+                                         }
+                                 }
 
-           nNoise++;
-           nNoiseSource++;
-           if (h1->GetBinContent(ich+1)>=1){  // setting limit for noise to 1 kHz
-                   fStatus->SetNoiseStatus(ich,AliTOFChannelOnlineStatusArray::kTOFNoiseBad); // bad status for noise
-                   AliDebug(2,Form( " channel %i noise status after noise = %i, with global status = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich),(Int_t)fStatus->GetStatus(ich)));
-           }
-           else {
-                   fStatus->SetNoiseStatus(ich,AliTOFChannelOnlineStatusArray::kTOFNoiseOk); // good status for noise
-                   AliDebug(2,Form(" channel %i noise status after noise = %i, with global status = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich),(Int_t)fStatus->GetStatus(ich)));
-           }
-         }
-         daqFile->Close();
-         delete daqFile;
-         delete h1;
+                                 Log(Form(" Number of channels processed during noise run from source %i = %i",jj, nNoiseSource));
+                                 daqFile->Close();
+                                 delete daqFile;
+                                 delete h1;
+                                 daqFile = 0x0;
+                                 h1 = 0x0;
 
-       }
-       
-       else{
-         Log("The input data file from DAQ (noise) was not found, TOF exiting from Shuttle "); 
-         return 13;//return error code for failure in retrieving Ref Data 
-       }
-       
-       AliDebug(2,Form(" Number of channels processed during noise run from source %i = %i",jj, nNoiseSource));
-      }
-      AliDebug(2,Form(" Number of channels processed during noise run = %i",nNoise));
-      delete listNoise;
-    }
+                         }
+                         else{
+                                 Log("The input data file from DAQ (noise) was not found, TOF exiting from Shuttle "); 
+                                 delete listNoise;
+                                 listNoise = 0x0;
+                                 delete htofNoise;
+                                 htofNoise = 0x0;
+                                 if (fStatus){
+                                         delete fStatus;
+                                         fStatus = 0;
+                                 }
+                                 if (fMatchingWindow){
+                                         delete [] fMatchingWindow;
+                                         fMatchingWindow = 0;
+                                 }
+                                 return 13;//return error code for failure in retrieving Ref Data 
+                         }
+                 }               
+         }
+                         
   else{
-    Log("The input data file list from DAQ (noise) was not found, TOF exiting from Shuttle "); 
-    return 13;//return error code for failure in retrieving Ref Data 
+         Log("The input data file list from DAQ (noise) was not found, TOF exiting from Shuttle "); 
+         delete htofNoise;
+         htofNoise = 0x0;
+         if (fStatus){
+                 delete fStatus;
+                 fStatus = 0;
+         }
+         if (fMatchingWindow){
+                 delete [] fMatchingWindow;
+                 fMatchingWindow = 0;
+         }
+         return 13;//return error code for failure in retrieving Ref Data 
   }    
   
-  daqFile=0;
+  // elaborating infos to set NOISE status
+  for (Int_t ich =0;ich<fNChannels;ich++){
+         if (htofNoise->GetBinContent(ich+1)== -1) continue;
 
-  //storing in OCDB
+         nChannelsFromDA++;
+
+         AliDebug(3,Form(" channel %i noise status before noise = %i, with global status = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich),(Int_t)fStatus->GetStatus(ich)));
+         //AliDebug(2,Form( " channel %i status before noise = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich)));
+         
+         /* check whether channel has been read out during current run.
+          * if the status is bad it means it has not been read out.
+          * in this case skip channel in order to leave its status 
+          * unchanged */
 
+         if ((fStatus->GetHWStatus(ich)) == AliTOFChannelOnlineStatusArray::kTOFHWBad)
+                 continue;
+         
+         nNoise++;
+         if (htofNoise->GetBinContent(ich+1) >= noiseThr){
+                 fStatus->SetNoiseStatus(ich,AliTOFChannelOnlineStatusArray::kTOFNoiseBad); // bad status for noise
+                 AliDebug(3,Form( " channel %i noise status after noise = %i, with global status = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich),(Int_t)fStatus->GetStatus(ich)));
+                 nNoisyChannels++;
+         }
+         else {
+                 fStatus->SetNoiseStatus(ich,AliTOFChannelOnlineStatusArray::kTOFNoiseOk); // good status for noise
+                 AliDebug(3,Form(" channel %i noise status after noise = %i, with global status = %i",ich,(Int_t)fStatus->GetNoiseStatus(ich),(Int_t)fStatus->GetStatus(ich)));
+                 nNotNoisyChannels++;
+         }
+  }
+  
+  Log(Form(" Number of channels processed by DA during noise run, independetly from TOFFEE = %i",nChannelsFromDA));
+  Log(Form(" Number of channels processed during noise run (that were ON according to TOFFEE) = %i",nNoise));
+  Log(Form(" Number of noisy channels found during noise run = %i",nNoisyChannels));
+  Log(Form(" Number of not noisy channels found during noise run = %i",nNotNoisyChannels));
+  Log(Form(" Number of channels with matching window NULL (so skipped), but Non Zero content = %i",nMatchingWindowNullNonZero));
+  Log(Form(" Number of channels with matching window NULL (so skipped), and Zero content = %i",nMatchingWindowNullEqualZero));
+
+  delete listNoise;
+  
+  //daqFile=0;
+  
+  //storing in OCDB
+  
   AliCDBMetaData metaData;
   metaData.SetBeamPeriod(0);
   metaData.SetResponsible("Chiara Zampolli");
@@ -722,6 +919,16 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
   resultNoise = Store("Calib","Status",fStatus, &metaData,0,kTRUE);
   if(!resultNoise){
     Log("Some problems occurred while storing online object resulting from Noise data processing");
+    delete htofNoise;
+    htofNoise = 0x0;
+    if (fStatus){
+           delete fStatus;
+           fStatus = 0;
+    }
+    if (fMatchingWindow){
+           delete [] fMatchingWindow;
+           fMatchingWindow = 0;
+    }
     return 14;//return error code for problems in storing Noise data 
   }
 
@@ -737,10 +944,33 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
     resultNoiseRef = StoreReferenceData("Calib","NoiseData",htofNoise, &metaDataHisto);
     if (!resultNoiseRef){
       Log("some problems occurred::No Reference Data for noise stored");
+      delete htofNoise;
+      htofNoise = 0x0;
+      if (fStatus){
+             delete fStatus;
+             fStatus = 0;
+      }
+      if (fMatchingWindow){
+             delete [] fMatchingWindow;
+             fMatchingWindow = 0;
+      }
       return 12;//return error code for failure in storing Ref Data 
     }
   }
 
+  delete htofNoise;
+  htofNoise = 0x0;
+
+  if (fStatus){
+    delete fStatus;
+    fStatus = 0;
+  }
+
+  if (fMatchingWindow){
+         delete [] fMatchingWindow;
+         fMatchingWindow = 0;
+  }
+
   return 0;
 }
 //_____________________________________________________________________________
@@ -760,18 +990,20 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
   /* load current TOF FEE config from DCS FXS, parse, 
    * fill current FEE histogram and set FEE status */
   
-  const char * nameFile = GetFile(kDCS,"TofFeeMap",""); 
+  const char * nameFile = GetFile(kDCS,"TofFeeLightMap",""); 
   AliInfo(Form("nameFile = %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];
+
   AliCDBEntry *cdbEntry = GetFromOCDB("Calib","Status");
   if (!cdbEntry) {
          /* no CDB entry found. set update flag */
@@ -782,27 +1014,31 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
          updateOCDB = kTRUE;
   }
   else {
+         if (cdbEntry) cdbEntry->SetOwner(kFALSE);
          /* CDB entry OK. loop over channels */
          fStatus = (AliTOFChannelOnlineStatusArray*) cdbEntry->GetObject();
+         delete cdbEntry;
+         cdbEntry = 0x0;
   }
   for (Int_t iChannel = 0; iChannel < fNChannels; iChannel++){
          //AliDebug(2,Form("********** channel %i",iChannel));
          /* compare current FEE channel status with stored one 
           * 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);
          if (feeReader.IsChannelEnabled(iChannel)) {
                  hCurrentFEE.SetBinContent(iChannel + 1, 1);
                  if (fStatus->GetHWStatus(iChannel)!=AliTOFChannelOnlineStatusArray::kTOFHWOk){
                          updateOCDB = kTRUE;
                          fStatus->SetHWStatus(iChannel,AliTOFChannelOnlineStatusArray::kTOFHWOk);
-                         AliDebug(2,Form( " changed into enabled: channel %i status after FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
+                         AliDebug(3,Form( " changed into enabled: channel %i status after FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
                  }
          }
          else {
                  if (fStatus->GetHWStatus(iChannel)!=AliTOFChannelOnlineStatusArray::kTOFHWBad){
                          updateOCDB = kTRUE;
                          fStatus->SetHWStatus(iChannel,AliTOFChannelOnlineStatusArray::kTOFHWBad);
-                         AliDebug(2,Form( " changed into disabled: channel %i status after FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
+                         AliDebug(3,Form( " changed into disabled: channel %i status after FEE = %i",iChannel,(Int_t)fStatus->GetHWStatus(iChannel)));
                  }
          }
   }
@@ -821,6 +1057,10 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
          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 */
          }
   }
@@ -851,11 +1091,20 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
   if (!Store("Calib", "Status", fStatus, &metaData, 0, kTRUE)) {
     /* failed */
     Log("problems while storing FEE data object");
+    if (fStatus){
+           delete fStatus;
+           fStatus = 0;
+    }
     return 17; /* return error code for problems  while storing FEE data */
   }
 
   /* everything fine. return */
 
+  if (fStatus){
+    delete fStatus;
+    fStatus = 0;
+  }
+
   return 0;
 
 }
@@ -889,14 +1138,14 @@ UInt_t AliTOFPreprocessor::Process(TMap* dcsAliasMap)
   }
   
   if (runType == "PHYSICS") {
-    Int_t iresultDCS = ProcessDCSDataPoints(dcsAliasMap);
-    if (iresultDCS != 0) {
-      return iresultDCS;
-    }
-    else { 
-      Int_t iresultDAQ = ProcessOnlineDelays();
+    Int_t iresultDAQ = ProcessOnlineDelays();
+    if (iresultDAQ != 0) {
       return iresultDAQ;
     }
+    else {
+      Int_t iresultDCS = ProcessDCSDataPoints(dcsAliasMap);
+      return iresultDCS;
+    }
   }
 
   // storing
@@ -904,3 +1153,88 @@ UInt_t AliTOFPreprocessor::Process(TMap* dcsAliasMap)
 }
 
 
+//_____________________________________________________________________________
+
+void
+AliTOFPreprocessor::FillWithCosmicCalibration(AliTOFChannelOnlineArray *cal)
+{
+  /*
+   * fill with cosmic calibration 
+   */
+
+  Log(" Using cosmic-ray calibration.");
+  
+  AliTOFcalibHisto calibHisto;
+    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.GetNominalCorrection(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);
+           
+           /* 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);
+  
+}
+
+