X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=VZERO%2FAliVZEROTriggerSimulator.cxx;h=b8ef3c852314704f79adff8494f4bf10e0e03e7e;hb=e2a398f545a223cfd7bbfdf59a547d7c10101db0;hp=015ea5bbe19efe0bc6308a3df4ba8f8fba3c18fd;hpb=00ff1707eb704e3659c24d0ab3bd3ae22de10f26;p=u%2Fmrichter%2FAliRoot.git diff --git a/VZERO/AliVZEROTriggerSimulator.cxx b/VZERO/AliVZEROTriggerSimulator.cxx index 015ea5bbe19..b8ef3c85231 100644 --- a/VZERO/AliVZEROTriggerSimulator.cxx +++ b/VZERO/AliVZEROTriggerSimulator.cxx @@ -22,6 +22,7 @@ #include #include +#include #include "AliLog.h" #include "AliCDBManager.h" @@ -32,6 +33,9 @@ #include "AliVZEROLogicalSignal.h" #include "AliVZEROTriggerSimulator.h" #include "AliVZEROdigit.h" +#include "AliVZEROCalibData.h" +#include "AliVZEROConst.h" +#include "AliCTPTimeParams.h" ClassImp(AliVZEROTriggerSimulator) @@ -41,10 +45,11 @@ TObject(),fTriggerData(NULL),fDigitsTree(digitsTree),fDigits(digits),fTriggerWor { // constructor fTriggerData = LoadTriggerData(); + LoadClockOffset(); for(int i=0;i<64;i++) { fBBFlags[i] = fBGFlags[i] = kFALSE; - fCharges[i] = 0; + fCharges[i] = 0.; } GenerateBBWindows(); GenerateBGWindows(); @@ -61,6 +66,7 @@ TObject(),fTriggerData(NULL),fDigitsTree(NULL),fDigits(NULL),fTriggerWord(0) { // Default constructor fTriggerData = LoadTriggerData(); + LoadClockOffset(); for(int i=0;i<64;i++) { fBBFlags[i] = fBGFlags[i] = kFALSE; @@ -79,33 +85,63 @@ TObject(),fTriggerData(NULL),fDigitsTree(NULL),fDigits(NULL),fTriggerWord(0) //_____________________________________________________________________________ AliVZEROTriggerSimulator::~AliVZEROTriggerSimulator(){ // Destructor - if(fBBGate) delete [] fBBGate; - if(fBGGate) delete [] fBGGate; - if(fBBLatch) delete [] fBBLatch; - if(fBBReset) delete [] fBBReset; - if(fBGLatch) delete [] fBGLatch; - if(fBGReset) delete [] fBGReset; + for (Int_t i=0; iSetStartTime(0.); + fBBGate[i]->SetStopTime(25.0); + } + } + else { for (int i=0; iGetClk1Win1(i),fTriggerData->GetDelayClk1Win1(i)); AliVZEROLogicalSignal clk2BB(fTriggerData->GetClk2Win1(i),fTriggerData->GetDelayClk2Win1(i)); fBBGate[i] = new AliVZEROLogicalSignal(clk1BB & clk2BB); } + } } //_____________________________________________________________________________ void AliVZEROTriggerSimulator::GenerateBGWindows() { - // Generates the BG observation window + // Generates the BG observation window + // In case gates are open the windows are equal to 25ns + if (AreGatesOpen()) { + for (int i=0; iSetStartTime(0.); + fBGGate[i]->SetStopTime(25.0); + } + } + else { for (int i=0; iGetClk1Win2(i),fTriggerData->GetDelayClk1Win2(i)); AliVZEROLogicalSignal clk2BG(fTriggerData->GetClk2Win2(i),fTriggerData->GetDelayClk2Win2(i)); fBGGate[i] = new AliVZEROLogicalSignal(clk1BG & clk2BG); + // In VZERO-A we have a shift by -25ns which is controlled by + // 'Delay Win2' = 7 instead of default 6. + // The flag is not stored in OCDB so we have manually shift the + // trigger windows + if (i < 4) { + fBGGate[i]->SetStartTime(fBGGate[i]->GetStartTime()-25.0); + fBGGate[i]->SetStopTime(fBGGate[i]->GetStopTime()-25.0); + } } + } } //_____________________________________________________________________________ @@ -120,11 +156,8 @@ AliVZEROTriggerData * AliVZEROTriggerSimulator::LoadTriggerData() const entry = man->Get("VZERO/Trigger/Data"); if(!entry){ - AliWarning("Load of calibration data from default storage failed!"); - AliWarning("Calibration data will be loaded from local storage ($ALICE_ROOT)"); - - man->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); - entry = man->Get("VZERO/Trigger/Data",0); + AliFatal("Load of trigger calibration data from default storage failed!"); + return NULL; } // Retrieval of data in directory VZERO/Calib/Trigger: @@ -137,6 +170,46 @@ AliVZEROTriggerData * AliVZEROTriggerSimulator::LoadTriggerData() const return triggerData; } + +//_____________________________________________________________________________ +void AliVZEROTriggerSimulator::LoadClockOffset() +{ + // This method is used in order to + // retrieve the TDC clock offset including + // roll-over, trig count and CTP L0->L1 delay + + AliCDBEntry *entry0 = AliCDBManager::Instance()->Get("VZERO/Calib/Data"); + if (!entry0) { + AliFatal("V0 Calib object is not found in OCDB !"); + return; + } + AliVZEROCalibData *calibdata = (AliVZEROCalibData*) entry0->GetObject(); + + AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming"); + if (!entry) { + AliFatal("CTP timing parameters are not found in OCDB !"); + return; + } + AliCTPTimeParams *ctpParams = (AliCTPTimeParams*)entry->GetObject(); + Float_t l1Delay = (Float_t)ctpParams->GetDelayL1L0()*25.0; + + AliCDBEntry *entry1 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign"); + if (!entry1) { + AliFatal("CTP time-alignment is not found in OCDB !"); + return; + } + AliCTPTimeParams *ctpTimeAlign = (AliCTPTimeParams*)entry1->GetObject(); + l1Delay += ((Float_t)ctpTimeAlign->GetDelayL1L0()*25.0); + + for(Int_t board = 0; board < AliVZEROTriggerData::kNCIUBoards; ++board) { + fClockOffset[board] = (((Float_t)calibdata->GetRollOver(board)- + (Float_t)calibdata->GetTriggerCountOffset(board))*25.0- + l1Delay+ + kV0Offset); + AliDebug(1,Form("Board %d Offset %f",board,fClockOffset[board])); + } +} + //_____________________________________________________________________________ void AliVZEROTriggerSimulator::Run() { //AliInfo("Generating VZERO Triggers"); @@ -153,26 +226,34 @@ void AliVZEROTriggerSimulator::Run() { Int_t integrator = digit->Integrator(); Int_t pmNumber = digit->PMNumber(); - Int_t board = pmNumber / 8; - Int_t channel = pmNumber % 8; + Int_t board = AliVZEROCalibData::GetBoardNumber(pmNumber); + Int_t channel = AliVZEROCalibData::GetFEEChannelNumber(pmNumber); + if (board < 0 || channel < 0) continue; if(fTriggerData->GetEnableCharge(board,channel)) { - fCharges[pmNumber] = digit->ADC(); + fCharges[pmNumber] = digit->ChargeADC(AliVZEROdigit::kNClocks/2); if(fTriggerData->GetPedestalSubtraction(board)) { - if(fCharges[pmNumber]>=fTriggerData->GetPedestalCut(integrator,board,channel)){ - fCharges[pmNumber] -= fTriggerData->GetPedestal(integrator,board,channel); + if(fCharges[pmNumber]>=(Float_t) fTriggerData->GetPedestalCut(integrator,board,channel)){ + fCharges[pmNumber] -= (Float_t) fTriggerData->GetPedestal(integrator,board,channel); } else { - fCharges[pmNumber] = 0; + fCharges[pmNumber] = 0.; } } } else { - fCharges[pmNumber] = 0; + fCharges[pmNumber] = 0.; } - Float_t time = (Float_t)digit->Time() / 10.; // digit->Time() in bin of 100 picoseconds. Divide by 10 to have it in nanoseconds - time += fTriggerData->GetDelayHit(board,channel); - - //AliInfo(Form(" PM nb : %d ; ADC= %d ; TDC= %f Enable Time %d charge %d",pmNumber,digit->ADC(),time,fTriggerData->GetEnableTiming(board,channel),fTriggerData->GetEnableCharge(board,channel))); + Float_t time = digit->Time(); + time -= fClockOffset[board]; + + AliDebug(10,Form(" Digit: %f %d %d %d %d %d %d %d %d",digit->Time(), + digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10), + digit->ChargeADC(11),digit->ChargeADC(12),digit->ChargeADC(13), + digit->ChargeADC(14),digit->ChargeADC(15))); + AliDebug(10,Form(" PM nb : %d ; TDC= %f(%f) Enable Time %d charge %d inCoin %d charge %f", + pmNumber,time,digit->Time(), + fTriggerData->GetEnableTiming(board,channel),fTriggerData->GetEnableCharge(board,channel), + fBBGate[board]->IsInCoincidence(time),fCharges[pmNumber])); fBBFlags[pmNumber] = fTriggerData->GetEnableTiming(board,channel) && fBBGate[board]->IsInCoincidence(time); fBGFlags[pmNumber] = fTriggerData->GetEnableTiming(board,channel) && fBGGate[board]->IsInCoincidence(time); @@ -183,21 +264,35 @@ void AliVZEROTriggerSimulator::Run() { Int_t nBBflagsV0C = 0; Int_t nBGflagsV0A = 0; Int_t nBGflagsV0C = 0; - Int_t chargeV0A = 0; - Int_t chargeV0C = 0; + Float_t chargeV0A = 0.; + Float_t chargeV0C = 0.; + Int_t aBBflagsV0A = 0; + Int_t aBBflagsV0C = 0; + Int_t aBGflagsV0A = 0; + Int_t aBGflagsV0C = 0; for(int i=0;i<64;i++) { if(i<32) { nBBflagsV0C += fBBFlags[i]; nBGflagsV0C += fBGFlags[i]; chargeV0C += fCharges[i]; + if (fBBFlags[i]) aBBflagsV0C |= (1 << i); + if (fBGFlags[i]) aBGflagsV0C |= (1 << i); } else { nBBflagsV0A += fBBFlags[i]; nBGflagsV0A += fBGFlags[i]; chargeV0A += fCharges[i]; + if (fBBFlags[i]) aBBflagsV0A |= (1 << (i-32)); + if (fBGFlags[i]) aBGflagsV0A |= (1 << (i-32)); } //AliInfo(Form("Ch %d BB=%d BG=%d",i,fBBFlags[i],fBGFlags[i] )); } + + // Store the BB and BG flags in the digits tree (user info) + fDigitsTree->GetUserInfo()->Add(new TParameter("BBflagsV0A",aBBflagsV0A)); + fDigitsTree->GetUserInfo()->Add(new TParameter("BBflagsV0C",aBBflagsV0C)); + fDigitsTree->GetUserInfo()->Add(new TParameter("BGflagsV0A",aBGflagsV0A)); + fDigitsTree->GetUserInfo()->Add(new TParameter("BGflagsV0C",aBGflagsV0C)); // BBA if(nBBflagsV0A>=fTriggerData->GetBBAThreshold()) SetBBA(); @@ -257,5 +352,34 @@ void AliVZEROTriggerSimulator::Run() { } +//_____________________________________________________________________________ +Bool_t AliVZEROTriggerSimulator::AreGatesOpen() const { + // The method check if the gates are suppossed to be open + // (corresponding to 'Test Window' flag in DCS). + // Since the flag is not stored in OCDB, we just check if + // all the clock delays are 0 or not. + // This rules should be followed when setting up the detector + // at the level of DCS + + for (int i=0; iGetDelayClk1Win1(i)!=0 || + fTriggerData->GetDelayClk2Win1(i)!=0 || + fTriggerData->GetDelayClk1Win2(i)!=0 || + fTriggerData->GetDelayClk2Win2(i)!=0) + return kFALSE; + } + return kTRUE; +} + +//_____________________________________________________________________________ +void AliVZEROTriggerSimulator::Print(Option_t* /* opt */) const +{ + // Prints the trigger windows as + // initialized from the OCDB + for (int i=0; iGetStartTime() << " -> " << fBBGate[i]->GetStopTime() << ") BG (" << fBGGate[i]->GetStartTime() << " -> " << fBGGate[i]->GetStopTime() << ")" << std::endl; + } + std::cout << std::endl; +}