]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - VZERO/AliVZEROTriggerSimulator.cxx
electron cut included (Prabhat Ranjan Pujahari <p.pujahari@cern.ch>)
[u/mrichter/AliRoot.git] / VZERO / AliVZEROTriggerSimulator.cxx
index 56b232ea06c8fe68ca172c4669424ba748e4d874..b8ef3c852314704f79adff8494f4bf10e0e03e7e 100644 (file)
@@ -35,6 +35,7 @@
 #include "AliVZEROdigit.h"\r
 #include "AliVZEROCalibData.h"\r
 #include "AliVZEROConst.h"\r
+#include "AliCTPTimeParams.h"\r
 \r
 ClassImp(AliVZEROTriggerSimulator)\r
 \r
@@ -44,6 +45,7 @@ TObject(),fTriggerData(NULL),fDigitsTree(digitsTree),fDigits(digits),fTriggerWor
 {\r
        // constructor\r
        fTriggerData = LoadTriggerData();\r
+       LoadClockOffset();\r
        \r
        for(int i=0;i<64;i++) {\r
                fBBFlags[i] = fBGFlags[i] = kFALSE;\r
@@ -64,6 +66,7 @@ TObject(),fTriggerData(NULL),fDigitsTree(NULL),fDigits(NULL),fTriggerWord(0)
 {\r
        // Default constructor\r
        fTriggerData = LoadTriggerData();\r
+       LoadClockOffset();\r
 \r
        for(int i=0;i<64;i++) {\r
                fBBFlags[i] = fBGFlags[i] = kFALSE;\r
@@ -82,33 +85,63 @@ TObject(),fTriggerData(NULL),fDigitsTree(NULL),fDigits(NULL),fTriggerWord(0)
 //_____________________________________________________________________________\r
 AliVZEROTriggerSimulator::~AliVZEROTriggerSimulator(){\r
 // Destructor\r
-       if(fBBGate) delete [] fBBGate;\r
-       if(fBGGate) delete [] fBGGate;\r
-       if(fBBLatch) delete [] fBBLatch;\r
-       if(fBBReset) delete [] fBBReset;\r
-       if(fBGLatch) delete [] fBGLatch;\r
-       if(fBGReset) delete [] fBGReset;\r
+  for (Int_t i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
+    delete fBBGate[i];\r
+    delete fBGGate[i];\r
+    delete fBBLatch[i];\r
+    delete fBBReset[i];\r
+    delete fBGLatch[i];\r
+    delete fBGReset[i];\r
+  }\r
 }\r
 \r
 //_____________________________________________________________________________\r
 void AliVZEROTriggerSimulator::GenerateBBWindows() \r
 {\r
-       // Generates the BB observation window\r
+  // Generates the BB observation window\r
+  // In case gates are open the windows are equal to 25ns\r
+  if (AreGatesOpen()) {\r
+       for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
+               fBBGate[i] = new AliVZEROLogicalSignal();\r
+               fBBGate[i]->SetStartTime(0.);\r
+               fBBGate[i]->SetStopTime(25.0);\r
+       }    \r
+  }\r
+  else {\r
        for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
                AliVZEROLogicalSignal clk1BB(fTriggerData->GetClk1Win1(i),fTriggerData->GetDelayClk1Win1(i));\r
                AliVZEROLogicalSignal clk2BB(fTriggerData->GetClk2Win1(i),fTriggerData->GetDelayClk2Win1(i));\r
                fBBGate[i] = new AliVZEROLogicalSignal(clk1BB & clk2BB);\r
        }\r
+  }\r
 }\r
 //_____________________________________________________________________________\r
 void AliVZEROTriggerSimulator::GenerateBGWindows() \r
 {\r
-       // Generates the BG observation window\r
+  // Generates the BG observation window\r
+  // In case gates are open the windows are equal to 25ns\r
+  if (AreGatesOpen()) {\r
+       for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
+               fBGGate[i] = new AliVZEROLogicalSignal();\r
+               fBGGate[i]->SetStartTime(0.);\r
+               fBGGate[i]->SetStopTime(25.0);\r
+       }    \r
+  }\r
+  else {\r
        for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
                AliVZEROLogicalSignal clk1BG(fTriggerData->GetClk1Win2(i),fTriggerData->GetDelayClk1Win2(i));\r
                AliVZEROLogicalSignal clk2BG(fTriggerData->GetClk2Win2(i),fTriggerData->GetDelayClk2Win2(i));\r
                fBGGate[i] = new AliVZEROLogicalSignal(clk1BG & clk2BG);\r
+               // In VZERO-A we have a shift by -25ns which is controlled by\r
+               // 'Delay Win2' = 7 instead of default 6.\r
+               // The flag is not stored in OCDB so we have manually shift the\r
+               // trigger windows\r
+               if (i < 4) {\r
+                 fBGGate[i]->SetStartTime(fBGGate[i]->GetStartTime()-25.0);\r
+                 fBGGate[i]->SetStopTime(fBGGate[i]->GetStopTime()-25.0);\r
+               }\r
        }\r
+  }\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -123,11 +156,8 @@ AliVZEROTriggerData * AliVZEROTriggerSimulator::LoadTriggerData() const
        \r
        entry = man->Get("VZERO/Trigger/Data");\r
        if(!entry){\r
-               AliWarning("Load of calibration data from default storage failed!");\r
-               AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)");\r
-               \r
-               man->SetDefaultStorage("local://$ALICE_ROOT/OCDB");\r
-               entry = man->Get("VZERO/Trigger/Data",0);\r
+               AliFatal("Load of trigger calibration data from default storage failed!");\r
+               return NULL;\r
        }\r
        \r
        // Retrieval of data in directory VZERO/Calib/Trigger:\r
@@ -140,6 +170,46 @@ AliVZEROTriggerData * AliVZEROTriggerSimulator::LoadTriggerData() const
        return triggerData;\r
 }\r
 \r
+\r
+//_____________________________________________________________________________\r
+void AliVZEROTriggerSimulator::LoadClockOffset()\r
+{\r
+  // This method is used in order to\r
+  // retrieve the TDC clock offset including\r
+  // roll-over, trig count and CTP L0->L1 delay\r
+\r
+  AliCDBEntry *entry0 = AliCDBManager::Instance()->Get("VZERO/Calib/Data");\r
+  if (!entry0) {\r
+    AliFatal("V0 Calib object is not found in OCDB !");\r
+    return;\r
+  }\r
+  AliVZEROCalibData *calibdata = (AliVZEROCalibData*) entry0->GetObject();\r
+\r
+  AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");\r
+  if (!entry) {\r
+    AliFatal("CTP timing parameters are not found in OCDB !");\r
+    return;\r
+  }\r
+  AliCTPTimeParams *ctpParams = (AliCTPTimeParams*)entry->GetObject();\r
+  Float_t l1Delay = (Float_t)ctpParams->GetDelayL1L0()*25.0;\r
+\r
+  AliCDBEntry *entry1 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");\r
+  if (!entry1) {\r
+    AliFatal("CTP time-alignment is not found in OCDB !");\r
+    return;\r
+  }\r
+  AliCTPTimeParams *ctpTimeAlign = (AliCTPTimeParams*)entry1->GetObject();\r
+  l1Delay += ((Float_t)ctpTimeAlign->GetDelayL1L0()*25.0);\r
+\r
+  for(Int_t board = 0; board < AliVZEROTriggerData::kNCIUBoards; ++board) {\r
+    fClockOffset[board] = (((Float_t)calibdata->GetRollOver(board)-\r
+                           (Float_t)calibdata->GetTriggerCountOffset(board))*25.0-\r
+                          l1Delay+\r
+                          kV0Offset);\r
+    AliDebug(1,Form("Board %d Offset %f",board,fClockOffset[board]));\r
+  }\r
+}\r
+\r
 //_____________________________________________________________________________\r
 void AliVZEROTriggerSimulator::Run() {\r
        //AliInfo("Generating VZERO Triggers");\r
@@ -158,6 +228,7 @@ void AliVZEROTriggerSimulator::Run() {
                        Int_t pmNumber   = digit->PMNumber();\r
                        Int_t board   = AliVZEROCalibData::GetBoardNumber(pmNumber);\r
                        Int_t channel = AliVZEROCalibData::GetFEEChannelNumber(pmNumber);\r
+                       if (board < 0 || channel < 0) continue;\r
                        \r
                        if(fTriggerData->GetEnableCharge(board,channel)) {\r
                                fCharges[pmNumber] = digit->ChargeADC(AliVZEROdigit::kNClocks/2);\r
@@ -173,7 +244,7 @@ void AliVZEROTriggerSimulator::Run() {
                        }\r
                        \r
                        Float_t time = digit->Time();\r
-                       time -= kClockOffset;\r
+                       time -= fClockOffset[board];\r
 \r
                        AliDebug(10,Form(" Digit: %f %d %d %d %d %d %d %d %d",digit->Time(),\r
                                         digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10),\r
@@ -281,5 +352,34 @@ void AliVZEROTriggerSimulator::Run() {
        \r
 }\r
 \r
+//_____________________________________________________________________________\r
+Bool_t AliVZEROTriggerSimulator::AreGatesOpen() const {\r
+  // The method check if the gates are suppossed to be open\r
+  // (corresponding to 'Test Window' flag in DCS).\r
+  // Since the flag is not stored in OCDB, we just check if\r
+  // all the clock delays are 0 or not.\r
+  // This rules should be followed when setting up the detector\r
+  // at the level of DCS\r
+\r
+  for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
+    if (fTriggerData->GetDelayClk1Win1(i)!=0 ||\r
+       fTriggerData->GetDelayClk2Win1(i)!=0 ||\r
+       fTriggerData->GetDelayClk1Win2(i)!=0 ||\r
+       fTriggerData->GetDelayClk2Win2(i)!=0)\r
+      return kFALSE;\r
+  }\r
+  return kTRUE;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AliVZEROTriggerSimulator::Print(Option_t* /* opt */) const\r
+{\r
+  // Prints the trigger windows as\r
+  // initialized from the OCDB\r
+  for (int i=0; i<AliVZEROTriggerData::kNCIUBoards; i++) {\r
+    std::cout << "Board=" << i << "   BB (" << fBBGate[i]->GetStartTime() << " -> " << fBBGate[i]->GetStopTime() << ")   BG (" << fBGGate[i]->GetStartTime() << " -> " << fBGGate[i]->GetStopTime() << ")" << std::endl;\r
+  }\r
+  std::cout << std::endl;\r
+}\r
 \r
 \r