#include "AliVZEROdigit.h"\r
#include "AliVZEROCalibData.h"\r
#include "AliVZEROConst.h"\r
+#include "AliCTPTimeParams.h"\r
\r
ClassImp(AliVZEROTriggerSimulator)\r
\r
{\r
// constructor\r
fTriggerData = LoadTriggerData();\r
+ LoadClockOffset();\r
\r
for(int i=0;i<64;i++) {\r
fBBFlags[i] = fBGFlags[i] = kFALSE;\r
{\r
// Default constructor\r
fTriggerData = LoadTriggerData();\r
+ LoadClockOffset();\r
\r
for(int i=0;i<64;i++) {\r
fBBFlags[i] = fBGFlags[i] = kFALSE;\r
//_____________________________________________________________________________\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
\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
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
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
}\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
\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