X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=VZERO%2FAliVZEROReconstructor.cxx;h=412dac43b905abcb9498674673a64f0f45a4f849;hb=b6e08e3ec1d99e48ad0ffae625fc863a0060991f;hp=0e8f763edd72414ff42e2ed0c04002d0a7b7a53b;hpb=30d5d6472219f9a261a13d2165a239b4447ba680;p=u%2Fmrichter%2FAliRoot.git diff --git a/VZERO/AliVZEROReconstructor.cxx b/VZERO/AliVZEROReconstructor.cxx index 0e8f763edd7..412dac43b90 100644 --- a/VZERO/AliVZEROReconstructor.cxx +++ b/VZERO/AliVZEROReconstructor.cxx @@ -52,7 +52,10 @@ AliVZEROReconstructor:: AliVZEROReconstructor(): AliReconstructor(), fESD(0x0), fESDVZEROfriend(0x0), fCalibData(NULL), + fTriggerData(NULL), fTimeSlewing(NULL), + fSaturationCorr(NULL), + fEqFactors(NULL), fCollisionMode(0), fBeamEnergy(0.), fDigitsArray(0) @@ -86,14 +89,26 @@ AliVZEROReconstructor:: AliVZEROReconstructor(): AliReconstructor(), for(Int_t i = 0 ; i < 64; ++i) { Int_t board = AliVZEROCalibData::GetBoardNumber(i); - fTimeOffset[i] = (((Float_t)fCalibData->GetTriggerCountOffset(board)- - (Float_t)fCalibData->GetRollOver(board))*25.0+ + fTimeOffset[i] = (((Float_t)fCalibData->GetRollOver(board)- + (Float_t)fCalibData->GetTriggerCountOffset(board))*25.0+ fCalibData->GetTimeOffset(i)- l1Delay- phase->GetMeanPhase()+ delays->GetBinContent(i+1)+ kV0Offset); } + + AliCDBEntry *entry5 = AliCDBManager::Instance()->Get("VZERO/Calib/Saturation"); + if (!entry5) AliFatal("Saturation entry is not found in OCDB !"); + fSaturationCorr = (TObjArray*)entry5->GetObject(); + + AliCDBEntry *entry6 = AliCDBManager::Instance()->Get("VZERO/Trigger/Data"); + if (!entry6) AliFatal("VZERO trigger config data is not found in OCDB !"); + fTriggerData = (AliVZEROTriggerData*)entry6->GetObject(); + + AliCDBEntry *entry7 = AliCDBManager::Instance()->Get("VZERO/Calib/EqualizationFactors"); + if (!entry7) AliFatal("VZERO equalization factors are not found in OCDB !"); + fEqFactors = (TH1F*)entry7->GetObject(); } @@ -112,8 +127,11 @@ AliVZEROReconstructor::~AliVZEROReconstructor() { // destructor - delete fESDVZERO; + if(fESDVZERO) + delete fESDVZERO; + if(fESDVZEROfriend) delete fESDVZEROfriend; + if(fDigitsArray) delete fDigitsArray; } @@ -191,10 +209,14 @@ void AliVZEROReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits fESDVZEROfriend->SetBBMBFlag(offlineCh,iBunch,rawStream.GetBBMBFlag(iChannel,iBunch)); fESDVZEROfriend->SetBGMBFlag(offlineCh,iBunch,rawStream.GetBGMBFlag(iChannel,iBunch)); } - + for (Int_t iEv = 0; iEv < AliESDVZEROfriend::kNEvOfInt; iEv++) { + fESDVZEROfriend->SetBBFlag(offlineCh,iEv,rawStream.GetBBFlag(iChannel,iEv)); + fESDVZEROfriend->SetBGFlag(offlineCh,iEv,rawStream.GetBGFlag(iChannel,iEv)); + } } // Filling the global part of esd friend object that is available only for raw data + rawStream.FillTriggerBits(fTriggerData); fESDVZEROfriend->SetTriggerInputs(rawStream.GetTriggerInputs()); fESDVZEROfriend->SetTriggerInputsMask(rawStream.GetTriggerInputsMask()); @@ -210,6 +232,12 @@ void AliVZEROReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits digitsTree->GetUserInfo()->Add(new TParameter("BGflagsV0A",aBGflagsV0A)); digitsTree->GetUserInfo()->Add(new TParameter("BGflagsV0C",aBGflagsV0C)); + UShort_t chargeA,chargeC; + rawStream.CalculateChargeForCentrTriggers(fTriggerData,chargeA,chargeC); + digitsTree->GetUserInfo()->Add(new TParameter("ChargeA",(Int_t)chargeA)); + digitsTree->GetUserInfo()->Add(new TParameter("ChargeC",(Int_t)chargeC)); + digitsTree->GetUserInfo()->Add(new TParameter("TriggerInputs",(Int_t)rawStream.GetTriggerInputs())); + digitsTree->Fill(); } @@ -254,27 +282,35 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/, if (digitsTree->GetUserInfo()->FindObject("BBflagsV0A")) { aBBflagsV0A = ((TParameter*)digitsTree->GetUserInfo()->FindObject("BBflagsV0A"))->GetVal(); } - else - AliWarning("V0A beam-beam flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!"); + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0A beam-beam flags not found in digits tree UserInfo!"); + } if (digitsTree->GetUserInfo()->FindObject("BBflagsV0C")) { aBBflagsV0C = ((TParameter*)digitsTree->GetUserInfo()->FindObject("BBflagsV0C"))->GetVal(); } - else - AliWarning("V0C beam-beam flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!"); + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0C beam-beam flags not found in digits tree UserInfo!"); + } if (digitsTree->GetUserInfo()->FindObject("BGflagsV0A")) { aBGflagsV0A = ((TParameter*)digitsTree->GetUserInfo()->FindObject("BGflagsV0A"))->GetVal(); } - else - AliWarning("V0A beam-gas flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!"); + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0A beam-gas flags not found in digits tree UserInfo!"); + } if (digitsTree->GetUserInfo()->FindObject("BGflagsV0C")) { aBGflagsV0C = ((TParameter*)digitsTree->GetUserInfo()->FindObject("BGflagsV0C"))->GetVal(); } - else - AliWarning("V0C beam-gas flags not found in digits tree UserInfo! The flags will not be written to the raw-data stream!"); - + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0C beam-gas flags not found in digits tree UserInfo!"); + } + // Beam-beam and beam-gas flags (hardware) for (Int_t iChannel = 0; iChannel < 64; ++iChannel) { if(iChannel < 32) { @@ -287,6 +323,39 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/, } } + // Fill the trigger charges and bits + UShort_t chargeA = 0; + UShort_t chargeC = 0; + UShort_t triggerInputs = 0; + if (digitsTree->GetUserInfo()->FindObject("ChargeA")) { + chargeA = (UShort_t)(((TParameter*)digitsTree->GetUserInfo()->FindObject("ChargeA"))->GetVal()); + } + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0A trigger charge not found in digits tree UserInfo!"); + } + + if (digitsTree->GetUserInfo()->FindObject("ChargeC")) { + chargeC = (UShort_t)(((TParameter*)digitsTree->GetUserInfo()->FindObject("ChargeC"))->GetVal()); + } + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0C trigger charge not found in digits tree UserInfo!"); + } + + if (digitsTree->GetUserInfo()->FindObject("TriggerInputs")) { + triggerInputs = (UShort_t)(((TParameter*)digitsTree->GetUserInfo()->FindObject("TriggerInputs"))->GetVal()); + } + else { + if (esd && (esd->GetEventType() == 7)) + AliWarning("V0C trigger charge not found in digits tree UserInfo!"); + } + + fESDVZERO->SetTriggerChargeA(chargeA); + fESDVZERO->SetTriggerChargeC(chargeC); + fESDVZERO->SetTriggerBits(triggerInputs); + fESDVZERO->SetBit(AliESDVZERO::kTriggerChargeBitsFilled,kTRUE); + Int_t nEntries = (Int_t)digitsTree->GetEntries(); for (Int_t e=0; eGetEvent(e); @@ -333,23 +402,31 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/, time[pmNumber] = CorrectLeadingTime(pmNumber,digit->Time(),adc[pmNumber]); width[pmNumber] = digit->Width(); - if (adc[pmNumber] > 0) AliDebug(1,Form("PM = %d ADC = %f TDC %f (%f) Int %d (%d %d %d %d %d) %f %f %f %f %d %d",pmNumber, adc[pmNumber], - digit->Time(),time[pmNumber], - integrator, - digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10), - digit->ChargeADC(11),digit->ChargeADC(12), - fCalibData->GetPedestal(pmNumber),fCalibData->GetSigma(pmNumber), - fCalibData->GetPedestal(pmNumber+64),fCalibData->GetSigma(pmNumber+64), - aBBflag[pmNumber],aBGflag[pmNumber])); - - mult[pmNumber] = adc[pmNumber]*fCalibData->GetMIPperADC(pmNumber); + if (adc[pmNumber] > 0) { + AliDebug(1,Form("PM = %d ADC = %.2f (%.2f) TDC %.2f (%.2f) Int %d (%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d) %.2f %.2f %.2f %.2f %d %d",pmNumber, adc[pmNumber], + digit->ChargeADC(11)+digit->ChargeADC(10)+digit->ChargeADC(9)+digit->ChargeADC(8)+ + digit->ChargeADC(7)+digit->ChargeADC(6)+digit->ChargeADC(5)+digit->ChargeADC(4)- + 4.*fCalibData->GetPedestal(pmNumber)-4.*fCalibData->GetPedestal(pmNumber+64), + digit->Time(),time[pmNumber], + integrator, + digit->ChargeADC(0),digit->ChargeADC(1),digit->ChargeADC(2),digit->ChargeADC(3),digit->ChargeADC(4),digit->ChargeADC(5),digit->ChargeADC(6),digit->ChargeADC(7), + digit->ChargeADC(8),digit->ChargeADC(9),digit->ChargeADC(10), + digit->ChargeADC(11),digit->ChargeADC(12), + digit->ChargeADC(13),digit->ChargeADC(14),digit->ChargeADC(15),digit->ChargeADC(16),digit->ChargeADC(17),digit->ChargeADC(18),digit->ChargeADC(19),digit->ChargeADC(20), + fCalibData->GetPedestal(pmNumber),fCalibData->GetSigma(pmNumber), + fCalibData->GetPedestal(pmNumber+64),fCalibData->GetSigma(pmNumber+64), + aBBflag[pmNumber],aBGflag[pmNumber])); + }; + + TF1 *saturationFunc = (TF1*)fSaturationCorr->UncheckedAt(pmNumber); + if (!saturationFunc) AliFatal(Form("Saturation correction for channel %d is not found!",pmNumber)); + AliDebug(1,Form("Saturation PM=%d %f %f",pmNumber,adc[pmNumber],saturationFunc->Eval(adc[pmNumber]))); + mult[pmNumber] = saturationFunc->Eval(adc[pmNumber])*fCalibData->GetMIPperADC(pmNumber); // Fill ESD friend object for (Int_t iEv = 0; iEv < AliESDVZEROfriend::kNEvOfInt; iEv++) { fESDVZEROfriend->SetPedestal(pmNumber,iEv,(Float_t)digit->ChargeADC(iEv)); fESDVZEROfriend->SetIntegratorFlag(pmNumber,iEv,(iEv%2 == 0) ? integrator : !integrator); - fESDVZEROfriend->SetBBFlag(pmNumber,iEv,aBBflag[pmNumber]); - fESDVZEROfriend->SetBGFlag(pmNumber,iEv,aBGflag[pmNumber]); } fESDVZEROfriend->SetTime(pmNumber,digit->Time()); fESDVZEROfriend->SetWidth(pmNumber,digit->Width()); @@ -365,16 +442,32 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/, fESDVZERO->SetBit(AliESDVZERO::kOnlineBitsFilled,kTRUE); fESDVZERO->SetBBFlag(aBBflag); fESDVZERO->SetBGFlag(aBGflag); + fESDVZERO->SetBit(AliESDVZERO::kCorrectedForSaturation,kTRUE); // now fill the V0 decision and channel flags { AliVZEROTriggerMask triggerMask; + triggerMask.SetRecoParam(GetRecoParam()); triggerMask.FillMasks(fESDVZERO, fCalibData, fTimeSlewing); } if (esd) { AliDebug(1, Form("Writing VZERO data to ESD tree")); esd->SetVZEROData(fESDVZERO); + const AliESDRun *esdRun = esd->GetESDRun(); + if (esdRun) { + Float_t factors[64]; + Float_t factorSum = 0; + for(Int_t i = 0; i < 64; ++i) { + factors[i] = fEqFactors->GetBinContent(i+1)*fCalibData->GetMIPperADC(i); + factorSum += factors[i]; + } + for(Int_t i = 0; i < 64; ++i) factors[i] *= (64./factorSum); + + esd->SetVZEROEqFactors(factors); + } + else + AliError("AliESDRun object is not available! Cannot write the equalization factors!"); } if (esd) { @@ -476,7 +569,7 @@ Float_t AliVZEROReconstructor::CorrectLeadingTime(Int_t i, Float_t time, Float_t if (adc < 1e-6) return time; // Slewing correction - Float_t thr = fCalibData->GetDiscriThr(i); + Float_t thr = fCalibData->GetCalibDiscriThr(i,kTRUE); time -= fTimeSlewing->Eval(adc/thr); return time;