--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+
+///////////////////////////////////////////////////////////////////////////////
+// //
+// Recalculate VZERO timing and decision using the tender //
+// (in case the LHC phase drift is updated in OCDB) //
+// //
+///////////////////////////////////////////////////////////////////////////////
+
+#include <TList.h>
+#include <TObjString.h>
+#include <TChain.h>
+#include <TF1.h>
+
+#include <AliLog.h>
+#include <AliESDEvent.h>
+#include <AliESDVZERO.h>
+#include <AliCDBId.h>
+#include <AliCDBManager.h>
+#include <AliCDBEntry.h>
+#include <AliTender.h>
+#include <AliLHCClockPhase.h>
+#include <AliVZEROCalibData.h>
+#include <AliVZEROTriggerMask.h>
+
+#include "AliVZEROTenderSupply.h"
+
+ClassImp(AliVZEROTenderSupply)
+
+AliVZEROTenderSupply::AliVZEROTenderSupply() :
+ AliTenderSupply(),
+ fCalibData(NULL),
+ fTimeSlewing(NULL),
+ fLHCClockPhase(0),
+ fDebug(kFALSE)
+{
+ //
+ // default ctor
+ //
+}
+
+//_____________________________________________________
+AliVZEROTenderSupply::AliVZEROTenderSupply(const char *name, const AliTender *tender) :
+ AliTenderSupply(name,tender),
+ fCalibData(NULL),
+ fTimeSlewing(NULL),
+ fLHCClockPhase(0),
+ fDebug(kFALSE)
+{
+ //
+ // named ctor
+ //
+}
+
+//_____________________________________________________
+void AliVZEROTenderSupply::Init()
+{
+ //
+ // Initialise VZERO tender
+ //
+}
+
+//_____________________________________________________
+void AliVZEROTenderSupply::ProcessEvent()
+{
+ //
+ // Reapply the LHC-clock phase drift
+ //
+
+ AliESDEvent *event=fTender->GetEvent();
+ if (!event) return;
+
+ //load gain correction if run has changed
+ if (fTender->RunChanged()){
+ if (fDebug) printf("AliVZEROTenderSupply::ProcessEvent - Run Changed (%d)\n",fTender->GetRun());
+ GetPhaseCorrection();
+
+ AliCDBEntry *entryCal = fTender->GetCDBManager()->Get("VZERO/Calib/Data",fTender->GetRun());
+ if (!entryCal) {
+ AliError("No VZERO calibration entry is found");
+ fCalibData = NULL;
+ return;
+ } else {
+ fCalibData = (AliVZEROCalibData*)entryCal->GetObject();
+ if (fDebug) printf("AliVZEROTenderSupply::Used VZERO calibration entry: %s\n",entryCal->GetId().ToString().Data());
+ }
+
+ AliCDBEntry *entrySlew = fTender->GetCDBManager()->Get("VZERO/Calib/TimeSlewing",fTender->GetRun());
+ if (!entrySlew) {
+ AliError("VZERO time slewing function is not found in OCDB !");
+ fTimeSlewing = NULL;
+ return;
+ } else {
+ fTimeSlewing = (TF1*)entrySlew->GetObject();
+ if (fDebug) printf("AliVZEROTenderSupply::Used VZERO time slewing entry: %s\n",entrySlew->GetId().ToString().Data());
+ }
+ }
+
+ if (!fCalibData || !fTimeSlewing) return;
+
+ //
+ // correct VZERO time signals and decision
+ //
+ AliESDVZERO *esdVZERO = event->GetVZEROData();
+ if (!esdVZERO) {
+ AliError("No VZERO object is found inside ESD!");
+ return;
+ }
+ if (!esdVZERO->TestBit(AliESDVZERO::kDecisionFilled)) {
+ AliWarning("VZERO offline trigger decisions were not filled in ESD, the tender supply is disabled");
+ return;
+ }
+
+ Float_t time[64];
+ for(Int_t i = 0; i < 64; ++i) {
+ time[i] = esdVZERO->GetTime(i);
+ time[i] += fLHCClockPhase;
+ }
+ esdVZERO->SetTime(time);
+
+ {
+ AliVZEROTriggerMask triggerMask;
+ triggerMask.FillMasks(esdVZERO, fCalibData, fTimeSlewing);
+ }
+
+}
+
+//_____________________________________________________
+void AliVZEROTenderSupply::GetPhaseCorrection()
+{
+ //
+ // Get Gain splines from OCDB
+ //
+
+ AliInfo("Get LHC-clock phase correction");
+
+ //
+ //find previous entry from the UserInfo
+ //
+ TTree *tree=((TChain*)fTender->GetInputData(0))->GetTree();
+ if (!tree) {
+ AliError("Tree not found in ESDhandler");
+ return;
+ }
+
+ TList *userInfo=(TList*)tree->GetUserInfo();
+ if (!userInfo) {
+ AliError("No UserInfo found in tree");
+ return;
+ }
+
+ TList *cdbList=(TList*)userInfo->FindObject("cdbList");
+ if (!cdbList) {
+ AliError("No cdbList found in UserInfo");
+ if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
+ return;
+ }
+
+ Float_t oldPhase = 0;
+
+ TIter nextCDB(cdbList);
+ TObjString *os=0x0;
+ while ( (os=(TObjString*)nextCDB()) ){
+ if (!(os->GetString().Contains("GRP/Calib/LHCClockPhase"))) continue;
+ AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
+
+ AliCDBEntry *entry=fTender->GetCDBManager()->Get(*id);
+ if (!entry) {
+ AliError("The previous LHC-clock phase entry is not found");
+ delete id;
+ return;
+ }
+
+ if (fDebug) printf("AliVZEROTenderSupply::Used old LHC-clock phase entry: %s\n",entry->GetId().ToString().Data());
+
+ AliLHCClockPhase *phase = (AliLHCClockPhase*)entry->GetObject();
+ if (!phase) {
+ AliError("Phase object is not found in the calibration entry");
+ delete id;
+ return;
+ }
+
+ oldPhase = phase->GetMeanPhase();
+
+ delete id;
+ break;
+ }
+
+ //
+ //new LHC-clock phase entry
+ //
+ Float_t newPhase = 0;
+ AliCDBEntry *entryNew=fTender->GetCDBManager()->Get("GRP/Calib/LHCClockPhase",fTender->GetRun());
+ if (!entryNew) {
+ AliError("No new LHC-clock phase calibration entry is found");
+ return;
+ }
+ if (fDebug) printf("AliVZEROTenderSupply::Used new LHC-clock phase entry: %s\n",entryNew->GetId().ToString().Data());
+
+ AliLHCClockPhase *phase2 = (AliLHCClockPhase*)entryNew->GetObject();
+ if (!phase2) {
+ AliError("Phase object is not found in the calibration entry");
+ return;
+ }
+
+ newPhase = phase2->GetMeanPhase();
+
+ fLHCClockPhase = newPhase - oldPhase;
+}
--- /dev/null
+#ifndef ALIVZEROTENDERSUPPLY_H
+#define ALIVZEROTENDERSUPPLY_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+////////////////////////////////////////////////////////////////////////
+// //
+// Recalculate VZERO timing and decision using the tender //
+// (in case the LHC phase drift is updated in OCDB) //
+// //
+////////////////////////////////////////////////////////////////////////
+
+
+
+#include <AliTenderSupply.h>
+
+class TF1;
+class AliVZEROCalibData;
+
+class AliVZEROTenderSupply: public AliTenderSupply {
+
+public:
+ AliVZEROTenderSupply();
+ AliVZEROTenderSupply(const char *name, const AliTender *tender=NULL);
+
+ virtual ~AliVZEROTenderSupply(){;}
+
+ virtual void Init();
+ virtual void ProcessEvent();
+
+ void GetPhaseCorrection();
+
+ void SetDebug(Bool_t flag) { fDebug = flag; }
+
+private:
+ AliVZEROCalibData* fCalibData; //! calibration data
+ TF1* fTimeSlewing; //! Function for time slewing correction
+ Float_t fLHCClockPhase; //! the correction to the LHC-clock phase
+ Bool_t fDebug; // debug on/off
+
+ AliVZEROTenderSupply(const AliVZEROTenderSupply&c);
+ AliVZEROTenderSupply& operator= (const AliVZEROTenderSupply&c);
+
+ ClassDef(AliVZEROTenderSupply, 1) // VZERO tender task
+};
+
+
+#endif
+