1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 ///////////////////////////////////////////////////////
19 // TRD main trigger class for L1 //
22 ///////////////////////////////////////////////////////
26 #include "AliRunLoader.h"
27 #include "AliConfig.h"
28 #include "AliTracker.h"
29 #include "AliTriggerInput.h"
31 #include "AliTRDTriggerL1.h"
32 #include "AliTRDtrigParam.h"
33 #include "AliTRDtrigger.h"
34 #include "AliTRDgtuTrack.h"
35 #include "AliTRDgeometry.h"
37 ClassImp(AliTRDTriggerL1)
39 //_____________________________________________________________________________
40 AliTRDTriggerL1::AliTRDTriggerL1()
44 // Default constructor
51 //_____________________________________________________________________________
52 void AliTRDTriggerL1::CreateInputs()
55 // See TRIGGER/DAQ/HLT/DCS Techical Design Report,
56 // p. 58, Table 4.1 for the proposed inputs
59 fInputs.AddLast(new AliTriggerInput("TRD_Unlike_EPair_L1"
62 fInputs.AddLast(new AliTriggerInput("TRD_Like_EPair_L1"
65 fInputs.AddLast(new AliTriggerInput("TRD_Jet_LPt_L1"
68 fInputs.AddLast(new AliTriggerInput("TRD_Jet_HPt_L1"
71 fInputs.AddLast(new AliTriggerInput("TRD_Electron_L1"
74 fInputs.AddLast(new AliTriggerInput("TRD_HadrLPt_L1"
77 fInputs.AddLast(new AliTriggerInput("TRD_HadrHPt_L1"
83 //_____________________________________________________________________________
84 void AliTRDTriggerL1::Trigger()
87 // Run the online tracking and trigger
90 TString evfoldname = AliConfig::GetDefaultEventFolderName();
91 AliRunLoader *runLoader = AliRunLoader::GetRunLoader(evfoldname);
92 AliLoader *loader = runLoader->GetLoader("TRDLoader");
95 AliTRDtrigger trdTrigger("Trigger","Trigger class");
97 Float_t field = AliTracker::GetBz() * 0.1; // Tesla
98 AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field));
100 trdTrigger.SetRunLoader(runLoader);
103 trdTrigger.Open(runLoader->GetFileName(), runLoader->GetEventNumber());
104 trdTrigger.ReadDigits();
105 trdTrigger.MakeTracklets(kTRUE);
106 trdTrigger.WriteTracklets(-1);
108 // Trigger (tracks, GTU)
110 Float_t highPt = AliTRDtrigParam::Instance()->GetHighPt();
111 Float_t jetLowPt = AliTRDtrigParam::Instance()->GetJetLowPt();
112 Float_t jetHighPt = AliTRDtrigParam::Instance()->GetJetHighPt();
120 const Int_t kMaxEle = 1000;
124 Int_t sectorElePlus[kMaxEle];
125 Int_t sectorEleMinus[kMaxEle];
126 Float_t ptElePlus[kMaxEle];
127 Float_t ptEleMinus[kMaxEle];
130 Int_t hadronJetLowPt;
131 Int_t hadronJetHighPt;
142 AliTRDgtuTrack *gtuTrack;
143 Int_t nTracks = trdTrigger.GetNumberOfTracks();
144 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
146 gtuTrack = trdTrigger.GetTrack(iTrack);
148 pid = gtuTrack->GetPID();
149 isElectron = gtuTrack->IsElectron();
150 pt = gtuTrack->GetPt();
151 det = gtuTrack->GetDetector();
152 sec = geo.GetSector(det);
157 sectorEleMinus[electronMinus] = sec;
158 ptEleMinus[electronMinus] = pt;
162 sectorElePlus[electronPlus] = sec;
163 ptElePlus[electronPlus] = pt;
170 if (TMath::Abs(pt) < highPt) {
177 if (TMath::Abs(pt) > jetLowPt ) {
180 if (TMath::Abs(pt) > jetHighPt) {
188 loader->UnloadTracks();
192 SetInput("TRD_Hadr_LPt_L1");
195 SetInput("TRD_Hadr_HPt_L1");
199 if (hadronJetLowPt >= AliTRDtrigParam::Instance()->GetNPartJetLow() ) {
200 SetInput("TRD_Jet_LPt_L1");
202 if (hadronJetHighPt >= AliTRDtrigParam::Instance()->GetNPartJetHigh()) {
203 SetInput("TRD_Jet_HPt_L1");
206 // Electron-positron pairs (open angle > 80 deg)
210 Bool_t electronUnlikePair = kFALSE;
211 Bool_t electronUnlikePairHPt = kFALSE;
213 if ((electronMinus > 0) &&
214 (electronPlus > 0)) {
215 for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
216 secPlus = sectorElePlus[iPlus];
217 for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
218 secMinus = sectorEleMinus[iMinus];
219 secDiff = TMath::Abs(secPlus-secMinus);
221 secDiff = 18 - secDiff;
224 electronUnlikePair = kTRUE;
225 if ((TMath::Abs(ptElePlus[iPlus]) > highPt) &&
226 (TMath::Abs(ptEleMinus[iMinus]) > highPt)) {
227 electronUnlikePairHPt = kTRUE;
234 if (electronUnlikePair) {
235 SetInput("TRD_Unlike_EPair_L1");
237 //if (electronUnlikePairHPt) {
238 // SetInput("TRD_Unlike_EPair_HPt_L1");
241 // Like electron/positron pairs
252 if (electronPlus > 1) {
253 for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
260 if (TMath::Abs(ptElePlus[iPlus]) > highPt) {
272 SetInput("TRD_Like_EPair_L1");
274 //if (ele1HPt && ele2HPt) {
275 // SetInput("TRD_Like_EPair_HPt_L1");
283 if (electronMinus > 1) {
284 for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
291 if (TMath::Abs(ptEleMinus[iMinus]) > highPt) {
303 SetInput("TRD_Like_EPair_L1");
305 //if (ele1HPt && ele2HPt) {
306 // SetInput("TRD_Like_EPair_HPt_L1");
309 // Single electron/positron
311 if ((electronPlus > 0) ||
312 (electronMinus > 0)) {
313 SetInput("TRD_Electron_L1");
315 for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
316 if (TMath::Abs(ptElePlus[iPlus]) > highPt) SetInput("TRD_Electron_HPt_L1");
319 for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
320 if (TMath::Abs(ptEleMinus[iMinus]) > highPt) SetInput("TRD_Electron_HPt_L1");