- Use of enum constants instead of litteral constants
[u/mrichter/AliRoot.git] / PHOS / AliPHOSTrigger.cxx
CommitLineData
25354ff4 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/* $Id$ */
16
17
18//_________________________________________________________________________
19//
20// Class for trigger analysis.
21// Digits are grouped in TRU's (16x28 crystals). The algorithm searches all
22// possible 4x4 crystal combinations and per each TRU, adding the digits
23// amplitude and finding the maximum. Maximums are compared to triggers threshold
24// and they are set.
25// FIRST ATTEMPT TO MAKE A TRIGGER CLASS. IT WILL CHANGE WHEN CENTRAL TRIGGER CLASS FIXES
26// THINGS
27//
28//*-- Author: Gustavo Conesa & Yves Schutz (IFIC, CERN)
29//////////////////////////////////////////////////////////////////////////////
30
31
32// --- ROOT system ---
b165f59d 33#include "TMatrixD.h"
25354ff4 34
35// --- ALIROOT system ---
36#include "AliPHOSTrigger.h"
37#include "AliPHOSGeometry.h"
38#include "AliPHOSGetter.h"
b165f59d 39#include "AliTriggerInput.h"
25354ff4 40
41
42ClassImp(AliPHOSTrigger)
43
b165f59d 44//______________________________________________________________________
45AliPHOSTrigger::AliPHOSTrigger()
46 : AliTriggerDetector(), fL0Threshold(50), fL1LowThreshold(1200),
47 fL1MediumThreshold(12000), fL1HighThreshold(30000)
25354ff4 48{
b165f59d 49 //ctor
50
51 SetName("PHOS");
52 CreateInputs();
53
54 Print("") ;
25354ff4 55}
56
b165f59d 57
58
25354ff4 59//____________________________________________________________________________
b165f59d 60AliPHOSTrigger::AliPHOSTrigger(const AliPHOSTrigger & trig)
61 : AliTriggerDetector(trig)
25354ff4 62{
63
64 // cpy ctor
65
25354ff4 66 fL0Threshold = trig.fL0Threshold ;
67 fL1LowThreshold = trig.fL1LowThreshold ;
68 fL1MediumThreshold = trig.fL1MediumThreshold ;
69 fL1HighThreshold = trig.fL1HighThreshold ;
70
71}
72
b165f59d 73//----------------------------------------------------------------------
74void AliPHOSTrigger::CreateInputs()
75{
76 // inputs
77
78 // Do not create inputs again!!
79 if( fInputs.GetEntriesFast() > 0 ) return;
80
81 fInputs.AddLast( new AliTriggerInput( "PHOS_MB_L0", "PHOS Minimum Bias L0", 0x01 ) );
82
83 fInputs.AddLast( new AliTriggerInput( "PHOS_HPt_L1", "PHOS High Pt L1", 0x02 ) );
84 fInputs.AddLast( new AliTriggerInput( "PHOS_MPt_L1", "PHOS Medium Pt L1", 0x04 ) );
85 fInputs.AddLast( new AliTriggerInput( "PHOS_LPt_L1", "PHOS Low Pt L1", 0x08 ) );
86
87}
88
25354ff4 89//____________________________________________________________________________
90TClonesArray * AliPHOSTrigger::FillTRU(const TClonesArray * digits){
91
92 //Orders digits ampitudes list in 8 TRUs (16x28 crystals) per module.
93 //Each TRU is a TMatrixD, and they are kept in TClonesArrays.
94
95 //Initilize variables
96
97 const AliPHOSGeometry * geom = AliPHOSGetter::Instance()->PHOSGeometry() ;
98
99 TClonesArray * matrix = new TClonesArray("TMatrixD",1000);
100 for(Int_t k = 0; k < 40 ; k++){
101 TMatrixD * trus = new TMatrixD(16,28) ;
102 for(Int_t i = 0; i < 16; i++)
103 for(Int_t j = 0; j < 28; j++)
104 (*trus)(i,j) = 0.0;
105 new((*matrix)[k]) TMatrixD(*trus) ;
106 }
107
108 AliPHOSDigit * dig ;
109
110 //Declare different variables
111 Int_t relid[4] ;
112 Float_t amp = 0;
113
114 for(Int_t idig = 0 ; idig < digits->GetEntriesFast() ; idig++){
115
116 dig = static_cast<AliPHOSDigit *>(digits->At(idig)) ;
117 amp = dig->GetAmp() ; //Energy of the digit (arbitrary units)
118 geom->AbsToRelNumbering(dig->GetId(), relid) ;//Transform digit number into 4 numbers
119 //relid[0] = module
120 //relid[1] = EMC (0) or CPV (-1)
121 //relid[2] = row <= 64 (fNPhi)
122 //relid[3] = column <= 56 (fNZ)
123
124 if(relid[1] == 0){
125
126 Int_t ntru = 1;
127 Int_t row = 1;
128 Int_t col = 1;
129 //Check which TRU in the module. It is divided in a (4,2) matrix.
130 //Fill the TRU matrix (16,28)
131 if(relid[3] > 28)
132 col = 2;
133
134 if(relid[2] > 16 && relid[2] <= 32)
135 row = 2;
136
137 if(relid[2] > 32 && relid[2] <= 48)
138 row = 3;
139
140 if(relid[2] > 48)
141 row = 4;
142
143 ntru = col*row + (relid[0]-1)*8 - 1;
144 TMatrixD * trus = dynamic_cast<TMatrixD *>(matrix->At(ntru)) ;
145
146 Int_t nrow = (relid[2]-1) - (row-1) * 16 ;
147 Int_t ncol = (relid[3]-1) - (col-1) * 28 ;
148
149 (*trus)(nrow,ncol) = amp ;
150 }
151 }
152 return matrix;
153}
154
155//____________________________________________________________________________
25354ff4 156void AliPHOSTrigger::MakeSlidingCell(const TClonesArray * trus, const Int_t mod,
157 Float_t *ampmax){
158
159 //Sums energy of all possible 4x4 crystals per each TRU. Fast signal
160 //in the experiment is given by 2x2 crystals, for this reason we loop
161 //inside the TRU crystals by 2.
162
163 Float_t amp = 0 ;
164
165 for(Int_t i = 0 ; i < 8 ; i++)
166 ampmax[i] = 0 ;
167
168 //Loop over all TRUS in a module
169 for(Int_t itru = 0 + (mod - 1) * 8 ; itru < mod*8 ; itru++){
170 TMatrixD * tru = dynamic_cast<TMatrixD *>(trus->At(itru)) ;
171 //Sliding 2x2 cell
172 //ampmax[itru-(mod-1)*8]=0.0;
173 for(Int_t irow = 0 ; irow < 16 ; irow += 2){
174 for(Int_t icol = 0 ; icol < 28 ; icol += 2){
175 amp = 0;
176 if( (irow+4) < 16 && (icol+4) < 28){//Avoid exit the TRU
177 for(Int_t i = irow; i < irow + 4 ; i++){
178 for(Int_t j = icol; j < icol + 4 ; j++){
179 amp += (*tru)(i,j) ;
180 }
181 }
182 }
183 if(amp > ampmax[itru-(mod-1)*8])
184 ampmax[itru-(mod-1)*8] = amp ;
185 }
186 }
187 }
188}
189
190//____________________________________________________________________________
b165f59d 191void AliPHOSTrigger::Trigger()
25354ff4 192{
193
194 //Main Method to select triggers.
195
b165f59d 196 //InitTriggers() ; //Initialize triggers to kFALSE
25354ff4 197
198 AliPHOSGetter * gime = AliPHOSGetter::Instance() ;
199
200 //Take the digits list and declare digits pointers
201 TClonesArray * digits = gime->Digits() ;
202 //Fill TRU Matrix
203 TClonesArray * trus = FillTRU(digits);
204
205 //Do Cell Sliding and select Trigger
206 Float_t max [8] ;
207 for(Int_t imod = 1 ; imod <= 5 ; imod++) {
208 MakeSlidingCell(trus, imod, max);
209 SetTriggers(max) ;
210 }
211
212}
213
214//____________________________________________________________________________
215void AliPHOSTrigger::Print(const Option_t * opt) const
216{
217
218 //Prints main parameters
219
220 if(! opt)
221 return;
b165f59d 222 AliTriggerInput* in = 0x0 ;
25354ff4 223
b165f59d 224 AliInfo("PHOS trigger information:") ;
225 printf( " Threshold for LO %d\n", fL0Threshold) ;
226 in = (AliTriggerInput*)fInputs.FindObject( "PHOS_MB_L0" );
227 if(in->GetValue())
228 printf( " PHOS MB LO is set\n") ;
229
230 printf( " Low Threshold for L1 %d\n", fL1LowThreshold) ;
231 in = (AliTriggerInput*)fInputs.FindObject( "PHOS_LPt_L1" );
232 if(in->GetValue())
233 printf( " PHOS Low Pt L1 is set\n") ;
234
235 printf( " Medium Threshold for L1 %d\n", fL1MediumThreshold) ;
236 in = (AliTriggerInput*) fInputs.FindObject( "PHOS_MPt_L1" );
237 if(in->GetValue())
238 printf( " PHOS Medium Pt L1 is set\n") ;
239
240 printf( " High Threshold for L1 %d\n", fL1HighThreshold) ;
241 in = (AliTriggerInput*) fInputs.FindObject( "PHOS_HPt_L1" );
242 if(in->GetValue())
243 printf( " PHOS High Pt L1 is set\n") ;
244
25354ff4 245}
246
247//____________________________________________________________________________
248void AliPHOSTrigger::SetTriggers(const Float_t * amp)
249{
250
251 //Checks the maximum amplitude per each TRU and compares with the
252 //different triggers thresholds
253
254 Float_t max = 0;
255 for(Int_t i = 0 ; i < 8 ; i++){
256 if(max < amp[i] )
257 max = amp[i] ;
258 }
25354ff4 259 if(max >= fL0Threshold){
b165f59d 260 SetInput("PHOS_MB_L0");
25354ff4 261 if(max >= fL1LowThreshold){
b165f59d 262 SetInput("PHOS_LPt_L1");
25354ff4 263 if(max >= fL1MediumThreshold){
b165f59d 264 SetInput("PHOS_MPt_L1");
25354ff4 265 if(max >= fL1HighThreshold){
b165f59d 266 SetInput("PHOS_HPt_L1");
25354ff4 267 }
268 }
269 }
270 }
271}