fZDCCutRefDeltaCorr(-2.1),
fZDCCutSigmaSumCorr(6.0),
fZDCCutSigmaDeltaCorr(1.2),
+ fASPDCvsTCut(65),
+ fBSPDCvsTCut(4),
fDoFMD(kTRUE),
fFMDLowCut(0.2),
fFMDHitCut(0.5),
fHistBitsSPD(0),
fHistFiredBitsSPD(0),
+ fHistSPDClsVsTrk(0),
fHistV0A(0),
fHistV0C(0),
fHistZDC(0),
fHistFMDC(0),
fHistFMDSingle(0),
fHistFMDSum(0),
+ fHistT0(0),
fTriggerClasses(0),
fMC(kFALSE),
- fEsdTrackCuts(0)
+ fEsdTrackCuts(0),
+ fTPCOnly(kFALSE)
{
// constructor
}
fHistFiredBitsSPD = 0;
}
+ if (fHistSPDClsVsTrk)
+ {
+ delete fHistSPDClsVsTrk;
+ fHistSPDClsVsTrk = 0;
+ }
+
if (fHistV0A)
{
delete fHistV0A;
fHistFMDSum = 0;
}
+ if (fHistT0)
+ {
+ delete fHistT0;
+ fHistT0 = 0;
+ }
+
if (fTriggerClasses)
{
fTriggerClasses->DeleteAll();
fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", 1202, -1.5, 1200.5, 1202, -1.5, 1200.5);
fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
+ fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
fHistTDCZDC = new TH1F("fHistTDCZDC", "ZDC;TDC bits;events", 32, -0.5, 32-0.5);
fHistTimeZDC = new TH2F("fHistTimeZDC", "ZDC;TDC timing A+C vs C-A; events", 120,-30,30,120,-600,-540);
- fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,120,-100,-40);
+ fHistTimeCorrZDC = new TH2F("fHistTimeCorrZDC", "ZDC;Corrected TDC timing A+C vs C-A; events", 120,-30,30,260,-100,30);
// TODO check limits
fHistFMDA = new TH1F("fHistFMDA", "FMDA;combinations above threshold;events", 102, -1.5, 100.5);
fHistFMDC = new TH1F("fHistFMDC", "FMDC;combinations above threshold;events", 102, -1.5, 100.5);
fHistFMDSingle = new TH1F("fHistFMDSingle", "FMD single;multiplicity value;counts", 1000, 0, 10);
fHistFMDSum = new TH1F("fHistFMDSum", "FMD sum;multiplicity value;counts", 1000, 0, 10);
+ fHistT0 = new TH1F("fHistT0", "T0;time (ns);events", 100, -25, 25);
fTriggerClasses = new TMap;
fTriggerClasses->SetOwner();
case kSPDGFOBits : str = "SPD GFO Bits"; break;
case kSPDGFOL0 : str = "SPD GFO L0 (first layer)"; break;
case kSPDGFOL1 : str = "SPD GFO L1 (second layer)"; break;
+ case kSPDClsVsTrkBG : str = "Cluster vs Tracklets"; break;
case kV0A : str = "V0 A BB"; break;
case kV0C : str = "V0 C BB"; break;
case kV0OR : str = "V0 OR BB"; break;
case kZDCTDCA : str = "ZDC TDC A"; break;
case kZDCTDCC : str = "ZDC TDC C"; break;
case kZDCTime : str = "ZDC Time Cut"; break;
+ case kCentral : str = "V0 Central"; break;
+ case kSemiCentral : str = "V0 Semi-central"; break;
default: str = ""; break;
}
{
decision = SPDFiredChips(aEsd, (offline) ? 0 : 1, kFALSE, 2);
break;
+ }
+ case kSPDClsVsTrkBG:
+ {
+ if(!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ decision = IsSPDClusterVsTrackletBG(aEsd);
+ break;
}
case kV0A:
{
decision = 1;
break;
}
+ case kT0:
+ {
+ if (T0Trigger(aEsd, !offline) == kT0BB)
+ decision = 1;
+ break;
+ }
+ case kT0BG:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (T0Trigger(aEsd, !offline) == kT0DecBG)
+ decision = 1;
+ break;
+ }
+ case kT0Pileup:
+ {
+ if (!offline)
+ AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+ if (T0Trigger(aEsd, !offline) == kT0DecPileup)
+ decision = 1;
+ break;
+ }
case kZDCA:
{
if (!offline)
AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
return IsLaserWarmUpTPCEvent(aEsd);
}
+ case kCentral:
+ {
+ if (offline)
+ AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
+ if (aEsd->GetVZEROData()) {
+ if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
+ if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA2andCTC2))
+ decision = kTRUE;
+ }
+ else
+ AliWarning("V0 centrality trigger bits were not filled!");
+ }
+ break;
+ }
+ case kSemiCentral:
+ {
+ if (offline)
+ AliFatal(Form("Offline trigger not available for trigger %d - use centrality selection", triggerNoFlags));
+ if (aEsd->GetVZEROData()) {
+ if (aEsd->GetVZEROData()->TestBit(AliESDVZERO::kTriggerChargeBitsFilled)) {
+ if (aEsd->GetVZEROData()->GetTriggerBits() & (1<<AliESDVZERO::kCTA1andCTC1))
+ decision = kTRUE;
+ }
+ else
+ AliWarning("V0 centrality trigger bits were not filled!");
+ }
+ break;
+ }
default:
{
AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
if (track->GetKinkIndex(0) > 0) continue;
UInt_t status = track->GetStatus();
- if ((status&AliESDtrack::kITSrefit)==1) continue; // explicitly ask for tracks without ITS refit
- if ((status&AliESDtrack::kTPCrefit)==0) continue;
+ if ((status&AliESDtrack::kITSrefit)==AliESDtrack::kITSrefit) continue; // explicitly ask for tracks without ITS refit
+ if ((status&AliESDtrack::kTPCrefit)!=AliESDtrack::kTPCrefit) continue;
if (track->GetTPCsignal() > 10) continue; // explicitly ask for tracks without dE/dx
if (vertex && vertex->GetNContributors() > 0 && (!vertex->IsFromVertexerZ() || vertex->GetDispersion() < 0.02) && TMath::Abs(vertex->GetZv()) < 10.) {
AliDebug(3,Form("Check on the vertex passed\n"));
for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
- if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
- AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
- decision = kTRUE;
- break;
- }
- }
- }
+ if (fTPCOnly == kFALSE){
+ if (fEsdTrackCuts->AcceptTrack(aEsd->GetTrack(i))){
+ AliDebug(2, Form("pt of track = %f --> check passed\n",aEsd->GetTrack(i)->Pt()));
+ decision = kTRUE;
+ break;
+ }
+ }
+ else {
+ // TPC only tracks
+ AliESDtrack *tpcTrack = fEsdTrackCuts->GetTPCOnlyTrack((AliESDEvent*)aEsd, i);
+ if (!tpcTrack){
+ AliDebug(3,Form("track %d is NOT a TPC track",i));
+ continue;
+ }
+ else{
+ AliDebug(3,Form("track %d IS a TPC track",i));
+ if (!(fEsdTrackCuts->AcceptTrack(tpcTrack))) {
+ AliDebug(2, Form("TPC track %d NOT ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
+ delete tpcTrack; tpcTrack = 0x0;
+ continue;
+ } // end if the TPC track is not accepted
+ else{
+ AliDebug(2, Form("TPC track %d ACCEPTED, pt = %f, eta = %f",i,tpcTrack->Pt(), tpcTrack->Eta()));
+ decision = kTRUE;
+ delete tpcTrack; tpcTrack = 0x0;
+ break;
+ } // end if the TPC track is accepted
+ } // end if it is a TPC track
+ } // end if you are looking at TPC only tracks
+ } // end loop on tracks
+ } // end check on vertex
else{
AliDebug(4,Form("Check on the vertex not passed\n"));
for (Int_t i=0; i<aEsd->GetNumberOfTracks(); ++i){
V0Trigger(aEsd, kASide, kFALSE, kTRUE);
V0Trigger(aEsd, kCSide, kFALSE, kTRUE);
+ T0Trigger(aEsd, kFALSE, kTRUE);
ZDCTDCTrigger(aEsd,kASide,kFALSE,kFALSE,kTRUE);
ZDCTimeTrigger(aEsd,kTRUE);
+ IsSPDClusterVsTrackletBG(aEsd, kTRUE);
AliESDZDC* zdcData = aEsd->GetESDZDC();
if (zdcData)
static UInt_t zpa = 0x02;
static UInt_t zna = 0x01;
- fHistZDC->Fill(1, quality & zna);
- fHistZDC->Fill(2, quality & zpa);
- fHistZDC->Fill(3, quality & zem2);
- fHistZDC->Fill(4, quality & zem1);
- fHistZDC->Fill(5, quality & znc);
- fHistZDC->Fill(6, quality & zpc);
+ fHistZDC->Fill(1, (quality & zna) ? 1 : 0);
+ fHistZDC->Fill(2, (quality & zpa) ? 1 : 0);
+ fHistZDC->Fill(3, (quality & zem2) ? 1 : 0);
+ fHistZDC->Fill(4, (quality & zem1) ? 1 : 0);
+ fHistZDC->Fill(5, (quality & znc) ? 1 : 0);
+ fHistZDC->Fill(6, (quality & zpc) ? 1 : 0);
}
else
{
return kFALSE;
}
+Bool_t AliTriggerAnalysis::IsSPDClusterVsTrackletBG(const AliESDEvent* aEsd, Bool_t fillHists){
+ //rejects BG based on the cluster vs tracklet correlation
+ // returns true if the event is BG
+ const AliMultiplicity* mult = aEsd->GetMultiplicity();
+ if (!mult){
+ AliFatal("No multiplicity object"); // TODO: Should this be fatal?
+ }
+ Int_t ntracklet = mult->GetNumberOfTracklets();
+
+ Int_t spdClusters = 0;
+ for(Int_t ilayer = 0; ilayer < 2; ilayer++){
+ spdClusters += mult->GetNumberOfITSClusters(ilayer);
+ }
+
+ if(fillHists) {
+ fHistSPDClsVsTrk->Fill(ntracklet,spdClusters);
+ }
+
+ Bool_t isCvsTOk = kFALSE;
+ Float_t limit = Float_t(fASPDCvsTCut) + Float_t(ntracklet) * fBSPDCvsTCut;
+ if (spdClusters > limit) isCvsTOk = kTRUE;
+ else isCvsTOk = kFALSE ;
+
+ return isCvsTOk;
+
+}
+
+
AliTriggerAnalysis::V0Decision AliTriggerAnalysis::V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists)
{
// Returns the V0 trigger decision in V0A | V0C
TObject* obj;
// collections of all histograms
- const Int_t nHists = 12;
+ const Int_t nHists = 14;
TList collections[nHists];
Int_t count = 0;
collections[n++].Add(entry->fHistFMDSum);
collections[n++].Add(entry->fHistBitsSPD);
collections[n++].Add(entry->fHistFiredBitsSPD);
+ collections[n++].Add(entry->fHistSPDClsVsTrk);
+ collections[n++].Add(entry->fHistT0);
// merge fTriggerClasses
TIterator* iter2 = entry->fTriggerClasses->MakeIterator();
fHistFMDSum->Merge(&collections[n++]);
fHistBitsSPD->Merge(&collections[n++]);
fHistFiredBitsSPD->Merge(&collections[n++]);
-
+ fHistSPDClsVsTrk->Merge(&collections[n++]);
+ fHistT0->Merge(&collections[n++]);
delete iter;
return count+1;
if (fHistFMDSum) fHistFMDSum->Write();
else Printf("Cannot save fHistFMDSum");
if (fSPDGFOEfficiency) fSPDGFOEfficiency->Write("fSPDGFOEfficiency");
+ if (fHistSPDClsVsTrk) fHistSPDClsVsTrk->Write("fHistSPDClsVsTrk");
+ if (fHistT0) fHistT0->Write("fHistT0");
+
// else Printf("Cannot save fSPDGFOEfficiency");
fTriggerClasses->Write("fTriggerClasses", TObject::kSingleKey);
}
+//----------------------------------------------------------------------------------------------------
+AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists)
+{
+ // Returns the T0 TVDC trigger decision
+ //
+ // argument 'online' is used as a switch between online and offline trigger algorithms
+ // in online mode return 0TVX
+ // in offline mode in addition check pile-up and background :
+ // pile-up readed from ESD: check if TVDC (0TVX module name) has more 1 hit;
+ // backgroud flag readed from ESD : check in given time interval OrA and OrC were correct but TVDC not
+ //
+ // Based on an algorithm by Alla Maevskaya
+
+ const AliESDTZERO* esdT0 = aEsd->GetESDTZERO();
+ if (!esdT0)
+ {
+ AliError("AliESDTZERO not available");
+ return kT0Invalid;
+ }
+ //???? AliDebug(2,Form("In T0Trigger: %f %f",esdV0->GetV0ATime(),esdV0->GetV0CTime()));
+ Float_t tvdc[5] ;
+ for (Int_t ii=0; ii<5; ii++)
+ tvdc[ii] = esdT0->GetTVDC(ii);
+ Int_t trig=esdT0->GetT0Trig();
+ // cout<<" T0 trig "<<trig<<endl;
+
+ if(fillHists) fHistT0->Fill(tvdc[0]);
+
+ if (online) {
+ if(trig&1) return kT0BB;
+ }
+ else {
+
+ if (esdT0->GetPileupFlag()) return kT0DecPileup;
+ if (esdT0->GetBackgroundFlag()) return kT0DecBG;
+ if (tvdc[0]>-5 && tvdc[0]<5 && tvdc[0] != 0) return kT0BB;
+ }
+
+ if (fMC)
+ if( esdT0->GetT0zVertex()>-12.3 && esdT0->GetT0zVertex() < 10.3) return kT0BB;
+
+ return kT0Empty;
+}