]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFPreprocessor.cxx
Small bug fix (which should have no influence online)
[u/mrichter/AliRoot.git] / TOF / AliTOFPreprocessor.cxx
index 1bc38792d841d02820df5e289961f3ff81264795..11db6ab29c57151db6e66aa1f64ef2ae5be64226 100644 (file)
@@ -15,6 +15,7 @@
 
 /* $Id$ */
 
+
 //#include <Riostream.h>
 //#include <stdio.h>
 //#include <stdlib.h>
 #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
@@ -81,7 +86,8 @@ AliTOFPreprocessor::AliTOFPreprocessor(AliShuttleInterface* shuttle) :
   fNChannels(0),
   fStoreRefData(kTRUE),
   fFDRFlag(kFALSE),
-  fStatus(0)
+  fStatus(0),
+  fMatchingWindow(0)
 {
   // constructor
   AddRunType("PHYSICS");
@@ -105,11 +111,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 = new AliTOFDataDCS(fRun, fStartTime, fEndTime, GetStartTimeDCSQuery(), GetEndTimeDCSQuery());
        fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
 }
 //_____________________________________________________________________________
@@ -195,6 +201,7 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
 {
   // Processing data from DAQ for online calibration 
 
+  Bool_t updateOCDB = kFALSE;
   Log("Processing DAQ delays");
 
   // reading configuration map 
@@ -265,7 +272,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);
 
@@ -370,9 +395,31 @@ UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
                                                  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.
@@ -454,6 +501,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);
@@ -685,6 +740,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;
@@ -701,13 +782,20 @@ 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));
@@ -721,62 +809,51 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
                                  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));
+                                                         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));
                                                  }
                                          }
                                  }
-                                 // 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;
-                                         
-                                         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)));
-                                         }
-                                 }
-                                 
+
+                                 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 "); 
                                  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 
                          }
-                         
-                         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 list from DAQ (noise) was not found, TOF exiting from Shuttle "); 
          delete htofNoise;
@@ -785,10 +862,53 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
                  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;
+
+         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
   
@@ -806,6 +926,10 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
            delete fStatus;
            fStatus = 0;
     }
+    if (fMatchingWindow){
+           delete [] fMatchingWindow;
+           fMatchingWindow = 0;
+    }
     return 14;//return error code for problems in storing Noise data 
   }
 
@@ -827,6 +951,10 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
              delete fStatus;
              fStatus = 0;
       }
+      if (fMatchingWindow){
+             delete [] fMatchingWindow;
+             fMatchingWindow = 0;
+      }
       return 12;//return error code for failure in storing Ref Data 
     }
   }
@@ -839,6 +967,11 @@ UInt_t AliTOFPreprocessor::ProcessNoiseData()
     fStatus = 0;
   }
 
+  if (fMatchingWindow){
+         delete [] fMatchingWindow;
+         fMatchingWindow = 0;
+  }
+
   return 0;
 }
 //_____________________________________________________________________________
@@ -858,18 +991,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 */
@@ -891,19 +1026,20 @@ UInt_t AliTOFPreprocessor::ProcessFEEData()
          /* 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)));
                  }
          }
   }
@@ -1018,3 +1154,87 @@ 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.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);
+           
+           /* 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);
+  
+}
+
+