#include <AliMultiplicity.h>
#include <AliESDVZERO.h>
+#include <AliESDZDC.h>
ClassImp(AliOfflineTrigger)
return kTRUE;
break;
}
+ case AliPWG0Helper::kZDC:
+ {
+ if (ZDCTrigger(aEsd, kASide) || ZDCTrigger(aEsd, kCentralBarrel) || ZDCTrigger(aEsd, kCSide))
+ return kTRUE;
+ break;
+ }
case AliPWG0Helper::kZDCA:
{
if (ZDCTrigger(aEsd, kASide))
return kFALSE;
}
-Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* /* aEsd */, AliceSide /* side */) const
+Bool_t AliOfflineTrigger::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
{
// Returns if ZDC triggered
- AliFatal("Not implemented");
+ AliESDZDC* zdcData = aEsd->GetESDZDC();
+ if (!zdcData)
+ {
+ AliError("AliESDZDC not available");
+ return kFALSE;
+ }
+
+ UInt_t quality = zdcData->GetESDQuality();
+
+ // from Nora's presentation, general first physics meeting 16.10.09
+ static UInt_t zpc = 0x20;
+ static UInt_t znc = 0x10;
+ static UInt_t zem1 = 0x08;
+ static UInt_t zem2 = 0x04;
+ static UInt_t zpa = 0x02;
+ static UInt_t zna = 0x01;
+
+ if (side == kASide && ((quality & zpa) || (quality & zna)))
+ return kTRUE;
+ if (side == kCentralBarrel && ((quality & zem1) || (quality & zem2)))
+ return kTRUE;
+ if (side == kCSide && ((quality & zpc) || (quality & znc)))
+ return kTRUE;
return kFALSE;
}
class AliOfflineTrigger : public TObject
{
public:
- enum AliceSide { kASide = 1, kCSide };
+ enum AliceSide { kASide = 1, kCSide, kCentralBarrel };
AliOfflineTrigger();
virtual ~AliOfflineTrigger() {}
case kSPDGFO : str = "SPD GFO"; break;
case kV0A : str = "V0 A"; break;
case kV0C : str = "V0 C"; break;
+ case kZDC : str = "ZDC"; break;
case kZDCA : str = "ZDC A"; break;
case kZDCC : str = "ZDC C"; break;
case kFMD : str = "FMD"; break;
class AliPWG0Helper : public TObject
{
public:
- enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kV0A, kV0C, kZDCA, kZDCC, kFMD, kStartOfFlags = 0x0100, kOfflineFlag = 0x8000 }; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
+ enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kV0A, kV0C, kZDC, kZDCA, kZDCC, kFMD, kStartOfFlags = 0x0100, kOfflineFlag = 0x8000 }; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
enum AnalysisMode { kInvalid = -1, kSPD = 0x1, kTPC = 0x2, kTPCITS = 0x4, kFieldOn = 0x8 };
// in case we want to use bitmaps...
enum MCProcessType { kInvalidProcess = -1, kND = 0x1, kDD = 0x2, kSD = 0x4 };
fESD(0),
fOutput(0),
fOption(opt),
+ fStartTime(0),
+ fEndTime(0),
fNTriggers(0),
fTriggerList(0),
fStats(0)
DefineInput(0, TChain::Class());
DefineOutput(0, TList::Class());
- fNTriggers = 6;
+ fNTriggers = 10;
- static AliPWG0Helper::Trigger triggerList[] = { AliPWG0Helper::kMB1, AliPWG0Helper::kMB2, AliPWG0Helper::kMB3, AliPWG0Helper::kSPDGFO, AliPWG0Helper::kV0A, AliPWG0Helper::kV0C };
+ static AliPWG0Helper::Trigger triggerList[] = { AliPWG0Helper::kAcceptAll, AliPWG0Helper::kMB1, AliPWG0Helper::kMB2, AliPWG0Helper::kMB3, AliPWG0Helper::kSPDGFO, AliPWG0Helper::kV0A, AliPWG0Helper::kV0C, AliPWG0Helper::kZDC, AliPWG0Helper::kZDCA, AliPWG0Helper::kZDCC };
fTriggerList = triggerList;
fStats = new TH1*[fNTriggers];
fOutput = new TList;
fOutput->SetOwner();
+
+ if (fStartTime == fEndTime)
+ AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");
+ Int_t nBins = 1000;
+ if (fEndTime - fStartTime > 0)
+ nBins = fEndTime - fStartTime;
for (Int_t i=0; i<fNTriggers; i++)
{
- fStats[i] = new TH1F(Form("fStats_%d", i), Form("%s;time;counts", AliPWG0Helper::GetTriggerName(fTriggerList[i])), 100, 0, 0);
+ fStats[i] = new TH1F(Form("fStats_%d", i), Form("%s;time;counts", AliPWG0Helper::GetTriggerName(fTriggerList[i])), nBins, 0, fEndTime - fStartTime);
fOutput->Add(fStats[i]);
}
}
//Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
- UInt_t timeStamp = fESD->GetTimeStamp() - 1257961181;
+ UInt_t timeStamp = fESD->GetTimeStamp() - fStartTime;
//Printf("%d", timeStamp);
for (Int_t i = 0; i < fNTriggers; i++)
fout->Write();
fout->Close();
+ Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
+ Int_t nY = nX;
+
+ while (nX * nY < fNTriggers)
+ {
+ if (nX == nY)
+ nX++;
+ else
+ nY++;
+ }
+
TCanvas* c = new TCanvas("c", "c", 800, 800);
- c->Divide((Int_t) TMath::Sqrt(fNTriggers) + 1, (Int_t) TMath::Sqrt(fNTriggers));
+ c->Divide(nX, nY);
+
+ Printf("+++++++++ TRIGGER STATS:");
for (Int_t i=0; i<fNTriggers; i++)
if (fStats[i])
{
c->cd(i+1);
fStats[i]->Draw();
+ Printf("%s: %d triggers", AliPWG0Helper::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[i]->Integral());
}
Printf("Writting result to trigger.root");
virtual void Terminate(Option_t*);
void SetOption(const char* opt) { fOption = opt; }
+ void SetTimes(UInt_t start, UInt_t end) { fStartTime = start; fEndTime = end; }
protected:
AliESDEvent *fESD; //! ESD object
TList* fOutput; //! list send on output slot 0
TString fOption; // option string
+ UInt_t fStartTime; // run start time
+ UInt_t fEndTime; // run end time
Int_t fNTriggers; //! number triggers
AliPWG0Helper::Trigger* fTriggerList; //! list of triggers
AliLog::SetClassDebugLevel(taskName, AliLog::kWarning);
}
-void run(const Char_t* data, Int_t nRuns=20, Int_t offset=0, Bool_t aDebug = kFALSE, Int_t aProof = kFALSE, const char* option = "")
+void GetTimes(UInt_t run, UInt_t* startTime = 0, UInt_t* endTime = 0)
+{
+ gSystem->Load("libXMLParser");
+ gSystem->Load("libXMLIO");
+ gSystem->Load("libCDB");
+ gSystem->Load("libSTEER");
+
+ AliCDBManager * man = AliCDBManager::Instance();
+ man->SetDefaultStorage("raw://");
+ man->SetRun(run);
+ AliCDBPath cdb("GRP", "GRP", "Data");
+ obj = man->Get(cdb);
+ grp = (AliGRPObject*) obj->GetObject();
+
+ if (startTime)
+ *startTime = grp->GetTimeStart();
+ if (endTime)
+ *endTime = grp->GetTimeEnd();
+
+ Printf("Got start and endtime from OCDB: %d, %d", grp->GetTimeStart(), grp->GetTimeEnd());
+}
+
+void run(const Char_t* data, Int_t nRuns=20, Int_t offset=0, Bool_t aDebug = kFALSE, Int_t aProof = kFALSE, UInt_t startTime = 0, UInt_t endTime = 0, const char* option = "")
{
// aProof option: 0 no proof
// 1 proof with chain
// 2 proof with dataset
//
// option is passed to the task(s)
+
+/*
+ .x run.C("/PWG0/jgrosseo/ERP_run98097", -1, 0, kFALSE, 2, 1258045012, 1258045458)
+ .x run.C("/PWG0/jgrosseo/ERP_run98576", -1, 0, kFALSE, 2, 1258123911, 1258124103)
+ .x run.C("/PWG0/jgrosseo/ERP_run98569", -1, 0, kFALSE, 2, 1258122187, 1258122524)
+*/
if (nRuns < 0)
nRuns = 1234567890;
gSystem->Load("libANALYSISalice");
gSystem->Load("libPWG0base");
}
+
+ if (startTime == endTime && startTime > 0)
+ {
+ // get times from OCDB, startTime must be run number
+
+ // WARNING only works if your par files loaded above are compatible with the libraries loaded here...
+ GetTimes(startTime, &startTime, &endTime);
+ }
// Create the analysis manager
mgr = new AliAnalysisManager;
Load("AliTriggerTask", aDebug);
TString optStr(option);
task = new AliTriggerTask(optStr);
+ task->SetTimes(startTime, endTime);
mgr->AddTask(task);