Classes moved to STEERBase.
[u/mrichter/AliRoot.git] / TRD / AliTRDTriggerL1.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 ///////////////////////////////////////////////////////
17 //                                                   //
18 //                                                   //
19 //  TRD main trigger class for L1                    //
20 //                                                   //
21 //                                                   //
22 ///////////////////////////////////////////////////////
23
24 #include <TMath.h>
25
26 #include "AliRunLoader.h"
27 #include "AliConfig.h"
28 #include "AliTracker.h"
29 #include "AliTriggerInput.h"
30
31 #include "AliTRDTriggerL1.h"
32 #include "AliTRDtrigParam.h"
33 #include "AliTRDtrigger.h"
34 #include "AliTRDgtuTrack.h"
35 #include "AliTRDgeometry.h"
36
37 ClassImp(AliTRDTriggerL1)
38
39 //_____________________________________________________________________________
40 AliTRDTriggerL1::AliTRDTriggerL1()
41   :AliTriggerDetector()
42 {
43   //
44   // Default constructor
45   //
46
47   SetName("TRD");
48
49 }
50
51 //_____________________________________________________________________________
52 void AliTRDTriggerL1::CreateInputs()
53 {
54   //
55   // See TRIGGER/DAQ/HLT/DCS Techical Design Report,
56   // p. 58, Table 4.1 for the proposed inputs
57   //
58
59   fInputs.AddLast(new AliTriggerInput("TRD_Unlike_EPair_L1"
60                                      ,"Unlike electron pair"
61                                      ,0x01 ));
62   fInputs.AddLast(new AliTriggerInput("TRD_Like_EPair_L1"
63                                      ,"Like electron pair"
64                                      ,0x02 ));
65   fInputs.AddLast(new AliTriggerInput("TRD_Jet_LPt_L1"
66                                      ,"Jet low pt"
67                                      ,0x04 ));
68   fInputs.AddLast(new AliTriggerInput("TRD_Jet_HPt_L1"
69                                      ,"Jet high pt"
70                                      ,0x08 ));
71   fInputs.AddLast(new AliTriggerInput("TRD_Electron_L1"
72                                      ,"Single electron"
73                                      ,0x10 ));
74   fInputs.AddLast(new AliTriggerInput("TRD_HadrLPt_L1"
75                                      ,"Single hadron low pt "
76                                      ,0x20 ));
77   fInputs.AddLast(new AliTriggerInput("TRD_HadrHPt_L1"
78                                      ,"Single hadron high pt"
79                                      ,0x40 ));
80
81 }
82
83 //_____________________________________________________________________________
84 void AliTRDTriggerL1::Trigger()
85 {
86   // 
87   // Run the online tracking and trigger
88   // 
89
90   TString          evfoldname = AliConfig::GetDefaultEventFolderName();
91   AliRunLoader    *runLoader  = AliRunLoader::GetRunLoader(evfoldname);
92   AliLoader       *loader     = runLoader->GetLoader("TRDLoader");
93   AliTRDgeometry   geo;
94
95   AliTRDtrigger trdTrigger("Trigger","Trigger class"); 
96
97   Float_t field = AliTracker::GetBz() * 0.1; // Tesla
98   AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field));
99
100   trdTrigger.SetRunLoader(runLoader);
101   trdTrigger.Init();
102
103   trdTrigger.Open(runLoader->GetFileName(), runLoader->GetEventNumber());
104   trdTrigger.ReadDigits();
105   trdTrigger.MakeTracklets(kTRUE);
106   trdTrigger.WriteTracklets(-1);
107
108   // Trigger (tracks, GTU)
109
110   Float_t highPt    = AliTRDtrigParam::Instance()->GetHighPt();
111   Float_t jetLowPt  = AliTRDtrigParam::Instance()->GetJetLowPt();
112   Float_t jetHighPt = AliTRDtrigParam::Instance()->GetJetHighPt();
113
114   Float_t pid;
115   Float_t pt;
116   Int_t   det;
117   Int_t   sec;
118   Bool_t  isElectron;
119
120   const Int_t maxEle = 1000;
121
122   Int_t   electronPlus;
123   Int_t   electronMinus;
124   Int_t   sectorElePlus[maxEle];
125   Int_t   sectorEleMinus[maxEle];
126   Float_t ptElePlus[maxEle];   
127   Float_t ptEleMinus[maxEle];
128   Int_t   hadronLowPt;
129   Int_t   hadronHighPt;
130   Int_t   hadronJetLowPt;
131   Int_t   hadronJetHighPt;
132
133   hadronJetLowPt  = 0;
134   hadronJetHighPt = 0;
135
136   hadronLowPt     = 0;
137   hadronHighPt    = 0;
138
139   electronPlus    = 0;
140   electronMinus   = 0;
141
142   AliTRDgtuTrack *gtuTrack;
143   Int_t nTracks = trdTrigger.GetNumberOfTracks();
144   for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
145
146     gtuTrack = trdTrigger.GetTrack(iTrack);
147
148     pid        = gtuTrack->GetPID();
149     isElectron = gtuTrack->IsElectron();
150     pt         = gtuTrack->GetPt();
151     det        = gtuTrack->GetDetector();
152     sec        = geo.GetSector(det);
153
154     if (isElectron) {
155
156       if (pt < 0.0) {
157         sectorEleMinus[electronMinus] = sec;
158         ptEleMinus[electronMinus]     = pt;
159         electronMinus++;
160       } 
161       else {
162         sectorElePlus[electronPlus]   = sec;
163         ptElePlus[electronPlus]       = pt;
164         electronPlus++;
165       }
166
167     } 
168     else {
169
170       if (TMath::Abs(pt) < highPt) {
171         hadronLowPt++;
172       } 
173       else {
174         hadronHighPt++;
175       }
176
177       if (TMath::Abs(pt) > jetLowPt ) {
178         hadronJetLowPt++;
179       }
180       if (TMath::Abs(pt) > jetHighPt) {
181         hadronJetHighPt++;
182       }
183
184     }
185
186   }
187
188   loader->UnloadTracks();
189
190   // Hadrons
191   if (hadronLowPt) {
192     SetInput("TRD_Hadr_LPt_L1");
193   }
194   if (hadronHighPt) {
195     SetInput("TRD_Hadr_HPt_L1");
196   }
197
198   // Hadrons from jets
199   if (hadronJetLowPt  >= AliTRDtrigParam::Instance()->GetNPartJetLow() ) {
200     SetInput("TRD_Jet_LPt_L1");
201   }
202   if (hadronJetHighPt >= AliTRDtrigParam::Instance()->GetNPartJetHigh()) {
203     SetInput("TRD_Jet_HPt_L1");
204   }
205
206   // Electron-positron pairs (open angle > 80 deg)
207   Int_t  secPlus;
208   Int_t  secMinus;
209   Int_t  secDiff;
210   Bool_t electronUnlikePair    = kFALSE;
211   Bool_t electronUnlikePairHPt = kFALSE;
212
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);
220         if (secDiff >  9) {
221           secDiff = 18 - secDiff;
222         }
223         if (secDiff >= 5) {
224           electronUnlikePair = kTRUE;
225           if ((TMath::Abs(ptElePlus[iPlus]) > highPt) && 
226               (TMath::Abs(ptEleMinus[iMinus]) > highPt)) {
227             electronUnlikePairHPt = kTRUE;
228           }
229         }
230       }
231     }
232   }
233
234   if (electronUnlikePair) {
235     SetInput("TRD_Unlike_EPair_L1");
236   }
237   //if (electronUnlikePairHPt) {
238   //  SetInput("TRD_Unlike_EPair_HPt_L1");
239   //}
240
241   // Like electron/positron pairs
242   Bool_t ele1;
243   Bool_t ele1HPt;
244   Bool_t ele2;
245   Bool_t ele2HPt;
246
247   // Positive
248   ele1    = kFALSE;
249   ele2    = kFALSE;
250   ele1HPt = kFALSE;
251   ele2HPt = kFALSE;
252   if (electronPlus > 1) {
253     for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
254       if      (!ele1) {
255         ele1 = kTRUE;
256       } 
257       else if (!ele2) {
258         ele2 = kTRUE;
259       }
260       if (TMath::Abs(ptElePlus[iPlus]) > highPt) {
261         if      (!ele1HPt) {
262           ele1HPt = kTRUE;
263         } 
264         else if (!ele2HPt) {
265           ele2HPt = kTRUE;
266         }
267       }
268     }
269   }
270
271   if (ele1    && ele2   ) {
272     SetInput("TRD_Like_EPair_L1");
273   }
274   //if (ele1HPt && ele2HPt) {
275   //  SetInput("TRD_Like_EPair_HPt_L1");
276   //}  
277
278   // Negative
279   ele1    = kFALSE;
280   ele2    = kFALSE;
281   ele1HPt = kFALSE;
282   ele2HPt = kFALSE;
283   if (electronMinus > 1) {
284     for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
285       if      (!ele1) {
286         ele1 = kTRUE;
287       } 
288       else if (!ele2) {
289         ele2 = kTRUE;
290       }
291       if (TMath::Abs(ptEleMinus[iMinus]) > highPt) {
292         if      (!ele1HPt) {
293           ele1HPt = kTRUE;
294         } 
295         else if (!ele2HPt) {
296           ele2HPt = kTRUE;
297         }
298       }
299     }
300   }
301
302   if (ele1    && ele2   ) {
303     SetInput("TRD_Like_EPair_L1");
304   }
305   //if (ele1HPt && ele2HPt) {
306   //  SetInput("TRD_Like_EPair_HPt_L1");
307   //}
308   
309   // Single electron/positron
310
311   if ((electronPlus  > 0) || 
312       (electronMinus > 0)) {
313     SetInput("TRD_Electron_L1");
314     /*
315     for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
316       if (TMath::Abs(ptElePlus[iPlus]) > highPt) SetInput("TRD_Electron_HPt_L1");
317       break;
318     }
319     for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
320       if (TMath::Abs(ptEleMinus[iMinus]) > highPt) SetInput("TRD_Electron_HPt_L1");
321       break;
322     }
323     */
324   }
325
326 }
327