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"
60 ,"Unlike electron pair"
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"
75 ,"Single hadron low pt "
77 fInputs.AddLast(new AliTriggerInput("TRD_HadrHPt_L1"
78 ,"Single hadron high pt"
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");
93 AliTRDgeometry *geo = AliTRDgeometry::GetGeometry(runLoader);
94 AliTRDtrigParam *trigp = new AliTRDtrigParam("TRDtrigParam","TRD Trigger parameters");
96 AliTRDtrigger trdTrigger("Trigger","Trigger class");
98 Float_t field = AliTracker::GetBz() * 0.1; // Tesla
99 AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field));
101 trigp->SetField(field);
104 trdTrigger.SetParameter(trigp);
105 trdTrigger.SetRunLoader(runLoader);
108 trdTrigger.Open(runLoader->GetFileName(), runLoader->GetEventNumber());
109 trdTrigger.ReadDigits();
110 trdTrigger.MakeTracklets(kTRUE);
111 trdTrigger.WriteTracklets(-1);
113 // Trigger (tracks, GTU)
115 Float_t highPt = trigp->GetHighPt();
116 Float_t jetLowPt = trigp->GetJetLowPt();
117 Float_t jetHighPt = trigp->GetJetHighPt();
125 const Int_t maxEle = 1000;
129 Int_t sectorElePlus[maxEle];
130 Int_t sectorEleMinus[maxEle];
131 Float_t ptElePlus[maxEle];
132 Float_t ptEleMinus[maxEle];
135 Int_t hadronJetLowPt;
136 Int_t hadronJetHighPt;
147 AliTRDgtuTrack *gtuTrack;
148 Int_t nTracks = trdTrigger.GetNumberOfTracks();
149 for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
151 gtuTrack = trdTrigger.GetTrack(iTrack);
153 pid = gtuTrack->GetPID();
154 isElectron = gtuTrack->IsElectron();
155 pt = gtuTrack->GetPt();
156 det = gtuTrack->GetDetector();
157 sec = geo->GetSector(det);
162 sectorEleMinus[electronMinus] = sec;
163 ptEleMinus[electronMinus] = pt;
167 sectorElePlus[electronPlus] = sec;
168 ptElePlus[electronPlus] = pt;
175 if (TMath::Abs(pt) < highPt) {
182 if (TMath::Abs(pt) > jetLowPt ) {
185 if (TMath::Abs(pt) > jetHighPt) {
193 loader->UnloadTracks();
197 SetInput("TRD_Hadr_LPt_L1");
200 SetInput("TRD_Hadr_HPt_L1");
204 if (hadronJetLowPt >= trigp->GetNPartJetLow() ) {
205 SetInput("TRD_Jet_LPt_L1");
207 if (hadronJetHighPt >= trigp->GetNPartJetHigh()) {
208 SetInput("TRD_Jet_HPt_L1");
211 // Electron-positron pairs (open angle > 80 deg)
215 Bool_t electronUnlikePair = kFALSE;
216 Bool_t electronUnlikePairHPt = kFALSE;
218 if ((electronMinus > 0) &&
219 (electronPlus > 0)) {
220 for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
221 secPlus = sectorElePlus[iPlus];
222 for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
223 secMinus = sectorEleMinus[iMinus];
224 secDiff = TMath::Abs(secPlus-secMinus);
226 secDiff = 18 - secDiff;
229 electronUnlikePair = kTRUE;
230 if ((TMath::Abs(ptElePlus[iPlus]) > highPt) &&
231 (TMath::Abs(ptEleMinus[iMinus]) > highPt)) {
232 electronUnlikePairHPt = kTRUE;
239 if (electronUnlikePair) {
240 SetInput("TRD_Unlike_EPair_L1");
242 //if (electronUnlikePairHPt) {
243 // SetInput("TRD_Unlike_EPair_HPt_L1");
246 // Like electron/positron pairs
257 if (electronPlus > 1) {
258 for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
265 if (TMath::Abs(ptElePlus[iPlus]) > highPt) {
277 SetInput("TRD_Like_EPair_L1");
279 //if (ele1HPt && ele2HPt) {
280 // SetInput("TRD_Like_EPair_HPt_L1");
288 if (electronMinus > 1) {
289 for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
296 if (TMath::Abs(ptEleMinus[iMinus]) > highPt) {
308 SetInput("TRD_Like_EPair_L1");
310 //if (ele1HPt && ele2HPt) {
311 // SetInput("TRD_Like_EPair_HPt_L1");
314 // Single electron/positron
316 if ((electronPlus > 0) ||
317 (electronMinus > 0)) {
318 SetInput("TRD_Electron_L1");
320 for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
321 if (TMath::Abs(ptElePlus[iPlus]) > highPt) SetInput("TRD_Electron_HPt_L1");
324 for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
325 if (TMath::Abs(ptEleMinus[iMinus]) > highPt) SetInput("TRD_Electron_HPt_L1");