1 /**************************************************************************
2 * Copyright(c) 2013, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // evaluate TRD trigger conditions,
17 // potentially with hardened conditions to remove
18 // triggers caused by conversions of low-pt photons
21 // Author: Jochen Klein <jochen.klein@cern.ch>
24 #include "AliVTrack.h"
25 #include "AliVEvent.h"
26 #include "AliESDEvent.h"
27 #include "AliAODEvent.h"
28 #include "AliVTrdTrack.h"
29 #include "AliESDTrdTrigger.h"
31 #include "AliTRDTriggerAnalysis.h"
33 AliTRDTriggerAnalysis::AliTRDTriggerAnalysis() :
39 fRequireMatch(kFALSE),
40 fRequireMatchElectron(kFALSE),
41 fRequireInTime(kTRUE),
42 fJetTriggerMode(kHJTDefault),
58 memset(fTriggerFlags, 0, sizeof(fTriggerFlags));
59 memset(fTriggerContribs, 0, sizeof(fTriggerContribs));
62 AliTRDTriggerAnalysis::~AliTRDTriggerAnalysis()
67 void AliTRDTriggerAnalysis::ResetTriggers()
69 // reset internal cache of trigger status
71 memset(fTriggerFlags, 0, sizeof(fTriggerFlags));
72 fTriggerInputs = fTriggerClasses = 0;
75 Bool_t AliTRDTriggerAnalysis::CalcTriggers(const AliVEvent *event)
77 // evaluate the TRD trigger conditions,
78 // so far HCO, HSE, HQU, HJT, HEE
83 AliErrorClass("event pointer is null");
91 printf("******************************************************************\n");
92 const AliESDEvent *esdEvent = dynamic_cast<const AliESDEvent*> (event);
94 AliESDTrdTrigger* trdTriggerInfo = esdEvent->GetTrdTrigger();
97 for (Int_t iSector = 0; iSector < 18; ++iSector) {
98 UInt_t trgFlags = trdTriggerInfo->GetFlags(iSector);
100 UInt_t trgContribs = fTriggerContribs[iSector] = trgFlags & 0xfff;
101 header |= trgContribs;
103 printf("sector %2i: %5s %5s %5s %5s %5s %5s %5s %5s (0x%03x)\n", iSector,
104 trgContribs & (1 << 7) ? "TO" : "--",
105 trgContribs & (1 << 6) ? "E2" : "--",
106 trgContribs & (1 << 5) ? "E1" : "--",
107 trgContribs & (1 << 4) ? "J1" : "--",
108 trgContribs & (1 << 3) ? "H2" : "--",
109 trgContribs & (1 << 2) ? "H1" : "--",
110 trgContribs & (1 << 1) ? "E3" : "--",
111 trgContribs & (1 << 0) ? "M1" : "--",
114 // trackingDoneTimeSMU = ((trgFlags >> 12) & 0x3ff) * 1./120.;
116 // for (Int_t iStack = 0; iStack < 5; ++iStack) {
117 // trackingDoneTMU = ((trgFlags >> 27) & (1 << iStack)) ? kTRUE : kFALSE; // TMU-level tracking done flag
118 // trackingDoneSMUStack = ((trgFlags >> 22) & (1 << iStack)) ? kTRUE : kFALSE; // SMU-level stack-related tracking done flag
120 // lmeFlags = trdTriggerInfo->GetLME(iStack) & 0xffffff;
121 // crcErrorFlags = (~(trdTriggerInfo->GetLME(iStack) >> 24)) & 0x3;
125 if (fVerbosity > 0) {
126 printf("------------------------------------------------------------------\n");
127 printf("total : %5s %5s %5s %5s %5s %5s %5s %5s (0x%03x)\n",
128 header & (1 << 7) ? "TO" : "--",
129 header & (1 << 6) ? "E2" : "--",
130 header & (1 << 5) ? "E1" : "--",
131 header & (1 << 4) ? "J1" : "--",
132 header & (1 << 3) ? "H2" : "--",
133 header & (1 << 2) ? "H1" : "--",
134 header & (1 << 1) ? "E3" : "--",
135 header & (1 << 0) ? "M1" : "--",
140 // evaluate trigger classes
141 TString trgClasses = event->GetFiredTriggerClasses();
142 if (trgClasses.Contains("TRDCO2"))
144 if (trgClasses.Contains("WUHJT"))
146 if (trgClasses.Contains("WUHSE"))
148 if (trgClasses.Contains("WUHQU"))
150 if (trgClasses.Contains("WUHEE"))
153 // evaluate trigger inputs
154 UInt_t trgInputs = 0;
156 trgInputs = esdEvent->GetHeader()->GetL1TriggerInputs();
157 else if (const AliAODEvent *aodEvent = dynamic_cast<const AliAODEvent*> (event))
158 trgInputs = aodEvent->GetHeader()->GetL1TriggerInputs();
160 AliError("failed to retrieve L1 trigger inputs");
162 if (trgInputs & (1 << 8))
164 if (trgInputs & (1 << 9))
166 if (trgInputs & (1 << 10))
168 if (trgInputs & (1 << 12))
170 if (trgInputs & (1 << 13))
173 // evaluate TRD GTU tracks
174 const Int_t nStacks = (fJetTriggerMode == kHJTWindowZPhi) ? 360 : 90;
175 Int_t nTracks[360] = { 0 }; // stack-wise counted number of tracks above pt threshold
177 Int_t nTrdTracks = event->GetNumberOfTrdTracks();
179 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
180 AliVTrdTrack *trdTrack = event->GetTrdTrack(iTrack);
182 AliError(Form("Failed to get track %i", iTrack));
186 Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
188 MarkCondition(kHCO, globalStack);
190 for (Int_t iLayer = 0; iLayer < 6; ++iLayer) {
191 if (trdTrack->GetLayerMask() & (1 << iLayer)) {
192 AliVTrdTracklet *trkl = trdTrack->GetTracklet(iLayer);
194 AliError(Form("no tracklet in layer %i where one should be for track %i",
200 // ignore the track if it was not in time
202 if (fRequireInTime && !trdTrack->GetTrackInTime())
205 AliVTrack *match = trdTrack->GetTrackMatch();
206 AliDebug(2, Form("GTU track %2i with pt = %5.2f has match: %p (pt = %5.2f)",
207 iTrack, trdTrack->Pt(), match, match ? match->Pt() : 0));
209 // ignore the track if it does not have a matched global track
211 if (fRequireMatch && !match)
214 // stack-wise counting of tracks above pt threshold for jet trigger
215 if (TMath::Abs(trdTrack->Pt()) >= fTRDptHJT) {
216 if (fJetTriggerMode == kHJTDefault)
217 ++nTracks[globalStack];
218 else if (fJetTriggerMode == kHJTWindowZPhi) {
219 AliESDTrdTrack *esdTrdTrack = dynamic_cast<AliESDTrdTrack*> (trdTrack);
221 Double_t a = esdTrdTrack->GetA()/128.;
222 Double_t b = esdTrdTrack->GetB()/128.;
223 Double_t c = esdTrdTrack->GetC()/256. / TMath::Tan( -2.0 / 180.0 * TMath::Pi() );
224 Double_t x = 297.759; // L0: 297.759, L1: 309.17
226 Double_t ypos = -a + x*b + (a >= 0. ? -0.253 : 0.253);
227 Double_t zpos = c*x + (c >= 0. ? -0.84 : 0.84);
229 const Float_t zStackCenter[5] = {241, 117, 0, -117, -241};
231 Bool_t upperHalfPhi = ypos >= 0.;
232 Bool_t upperHalfZ = zpos >= zStackCenter[esdTrdTrack->GetStack()];
234 Int_t stackIdx = 20 * esdTrdTrack->GetSector() + (upperHalfPhi ? 10 : 0) + 2 * esdTrdTrack->GetStack() + (upperHalfZ ? 1 : 0);
236 ++nTracks[stackIdx - 10 + (((stackIdx - 10) < 0) ? 360 : 0)];
237 if ((stackIdx % 10) != 0) {
238 ++nTracks[stackIdx - 1];
239 ++nTracks[stackIdx - 11 + (((stackIdx - 11) < 0) ? 360 : 0)];
245 // ignore the track for the electron triggers
246 // if it does not have a matched global track
248 if (fRequireMatchElectron && !match)
251 // ignore the track for the electron triggers
252 // if it does not fulfill the tracklet requirement
253 if (trdTrack->GetNTracklets() < fTRDnTrackletsEl)
255 if ((trdTrack->GetLayerMask() & fTRDlayerMaskEl) != fTRDlayerMaskEl)
258 if ((TMath::Abs(trdTrack->Pt()) >= fTRDptHQU) && (trdTrack->GetPID() >= fTRDpidHQU))
259 MarkCondition(kHQU, globalStack);
261 if ((TMath::Abs(trdTrack->Pt()) >= fTRDptHSE) && (trdTrack->GetPID() >= fTRDpidHSE))
262 MarkCondition(kHSE, globalStack);
264 if ((trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
265 (TMath::Abs(trdTrack->Pt()) >= fTRDptHEE) && (trdTrack->GetPID() >= fTRDpidHEE))
266 MarkCondition(kHEE, globalStack);
269 // check if HJT condition is fulfilled in any stack
270 for (Int_t iStack = 0; iStack < nStacks; ++iStack) {
271 if (nTracks[iStack] >= fTRDnHJT) {
272 MarkCondition(kHJT, iStack);