916f1e76 |
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 | |
20 | |
21 | Author: R. GUERNANE LPSC Grenoble CNRS/IN2P3 |
22 | */ |
23 | |
24 | #include "AliEMCALTriggerSTU.h" |
25 | #include "AliCDBManager.h" |
26 | #include "AliCDBEntry.h" |
fff39dd1 |
27 | #include "AliEMCALTriggerSTUDCSConfig.h" |
916f1e76 |
28 | #include "AliVZEROCalibData.h" |
29 | #include "AliVZEROdigit.h" |
30 | #include "AliEMCALTriggerPatch.h" |
31 | #include "AliESDVZERO.h" |
32 | #include "AliLog.h" |
33 | |
34 | #include <TClonesArray.h> |
35 | #include <TSystem.h> |
36 | #include <TH2F.h> |
37 | #include <TFile.h> |
38 | #include <TTree.h> |
39 | |
40 | #include <fstream> |
41 | #include <Riostream.h> |
c58cfdff |
42 | #include <cstdlib> |
916f1e76 |
43 | |
44 | ClassImp(AliEMCALTriggerSTU) |
45 | |
46 | //_______________ |
47 | AliEMCALTriggerSTU::AliEMCALTriggerSTU() : AliEMCALTriggerBoard() |
fff39dd1 |
48 | ,fGammaTh(0) |
49 | ,fJetTh(0) |
50 | ,fDCSConfig(0x0) |
916f1e76 |
51 | { |
52 | // |
916f1e76 |
53 | } |
54 | |
55 | //_______________ |
fff39dd1 |
56 | AliEMCALTriggerSTU::AliEMCALTriggerSTU(AliEMCALTriggerSTUDCSConfig *dcsConf, const TVector2& RS) : AliEMCALTriggerBoard(RS) |
57 | ,fGammaTh(0) |
58 | ,fJetTh(0) |
59 | ,fDCSConfig(dcsConf) |
916f1e76 |
60 | { |
61 | // |
916f1e76 |
62 | } |
63 | |
64 | //_______________ |
65 | AliEMCALTriggerSTU::~AliEMCALTriggerSTU() |
66 | { |
67 | // |
68 | } |
69 | |
70 | //_______________ |
de39a0ff |
71 | Int_t AliEMCALTriggerSTU::GetRawData() const |
916f1e76 |
72 | { |
73 | // |
de39a0ff |
74 | return fDCSConfig->GetRawData(); |
75 | } |
76 | |
77 | //_______________ |
78 | void AliEMCALTriggerSTU::Build( TString& str, Int_t iTRU, Int_t** M, const TVector2* rSize ) |
79 | { |
80 | // |
81 | str.ToLower(); |
82 | |
83 | Int_t ix = (iTRU % 2) ? 24 : 0; |
84 | |
85 | Int_t iy = iTRU / 2; |
916f1e76 |
86 | |
de39a0ff |
87 | Int_t** v = 0x0; |
916f1e76 |
88 | |
de39a0ff |
89 | if (str.Contains("map")) |
916f1e76 |
90 | { |
de39a0ff |
91 | v = fMap; |
916f1e76 |
92 | } |
de39a0ff |
93 | else if (str.Contains("region")) |
916f1e76 |
94 | { |
de39a0ff |
95 | v = fRegion; |
96 | } |
97 | else |
98 | { |
99 | AliError("Operation not allowed: STU won't be configured properly!"); |
100 | } |
101 | |
102 | for (Int_t i=0; i<rSize->X(); i++) |
103 | for (Int_t j=0; j<rSize->Y(); j++) v[i + ix][j + iy * 4] = M[i][j]; |
916f1e76 |
104 | } |
105 | |
106 | //_______________ |
de39a0ff |
107 | void AliEMCALTriggerSTU::L1(TriggerType_t type) |
916f1e76 |
108 | { |
109 | // |
de39a0ff |
110 | TVector2 s1, s2, s3, s4; |
111 | fDCSConfig->GetSegmentation(s1, s2, s3, s4); |
112 | |
113 | switch (type) |
114 | { |
115 | case kL1Gamma: |
116 | SetSubRegionSize(s1); |
117 | SetPatchSize(s2); |
118 | break; |
119 | case kL1Jet: |
120 | SetSubRegionSize(s3); |
121 | SetPatchSize(s4); |
122 | break; |
123 | default: |
124 | AliError("Not supported L1 trigger type"); |
125 | return; |
126 | break; |
127 | } |
128 | |
129 | SlidingWindow(type, GetThreshold(type)); |
916f1e76 |
130 | } |
131 | |
132 | //________________ |
de39a0ff |
133 | void AliEMCALTriggerSTU::PrintADC( TriggerType_t type, TVector2& pos, TVector2& idx ) |
916f1e76 |
134 | { |
135 | // |
de39a0ff |
136 | Int_t ix = (Int_t) (( pos.X() + fPatchSize->X() ) * fSubRegionSize->X()); |
137 | |
138 | Int_t iy = (Int_t) (( pos.Y() + fPatchSize->Y() ) * fSubRegionSize->Y()); |
916f1e76 |
139 | |
140 | TString subRegionADC[] = {"0->15", "16->31", "32->47", "48->63", "64->79", "80->95"}; |
141 | |
142 | switch ( type ) |
143 | { |
de39a0ff |
144 | case kL1Gamma: |
916f1e76 |
145 | { |
146 | Int_t iTRU = ( (ix-1) < 24 ) ? 31 - int(pos.Y() / 4) : 15 - int(pos.Y() / 4); |
147 | |
148 | printf("TRU #%d row #%d col #%d fastor: ",iTRU,int(idx.Y()),int(idx.X())); |
149 | |
da509d54 |
150 | for (Int_t i=(Int_t)(pos.X() * fSubRegionSize->X());i<ix;i++) |
916f1e76 |
151 | { |
da509d54 |
152 | for (Int_t j=(Int_t) (pos.Y() * fSubRegionSize->Y());j<iy;j++) |
916f1e76 |
153 | { |
154 | Int_t jtru = ( i < 24 ) ? 31 - j / 4 : 15 - j / 4; |
155 | printf("TRU#%d_%d ",jtru,fMap[i][j]); |
156 | } |
157 | } |
158 | |
159 | cout << endl; |
160 | } |
161 | break; |
de39a0ff |
162 | case kL1Jet: |
916f1e76 |
163 | { |
164 | //Int_t jTRU = ( (ix-1) < 24 ) ? 31 - (iy-1) / 4 : 15 - (iy-1) / 4; |
165 | |
166 | printf("jet found at row : %d and col : %d",int(idx.X()),int(idx.Y())); |
167 | |
de39a0ff |
168 | Char_t vPair[100]; |
916f1e76 |
169 | Int_t nSubRegion = 0; |
170 | |
da509d54 |
171 | for (Int_t i=(Int_t)(pos.X() * fSubRegionSize->X());i<ix;i++) |
916f1e76 |
172 | { |
da509d54 |
173 | for (Int_t j=(Int_t)(pos.Y() * fSubRegionSize->Y());j<iy;j++) |
916f1e76 |
174 | { |
175 | Int_t itru = ( i < 24 ) ? 31 - j / 4 : 15 - j / 4; |
176 | |
177 | Int_t idSR = fMap[i][j]/16; |
178 | |
179 | Char_t value = ((itru << 3) & 0xF8) | (idSR & 0x7); |
180 | |
181 | Bool_t isFound = kFALSE; |
182 | |
183 | for (Int_t k=0;k<nSubRegion && nSubRegion;k++) |
184 | { |
185 | if (vPair[k] == value) isFound = kTRUE; |
186 | } |
187 | |
188 | if (!isFound) |
189 | { |
190 | nSubRegion++; |
916f1e76 |
191 | |
192 | vPair[nSubRegion-1] = value; |
193 | } |
194 | } |
195 | } |
196 | |
197 | cout << " fastor:"; |
198 | for (Int_t i=0;i<nSubRegion;i++) |
199 | { |
200 | cout << " TRU#" << ((vPair[i] & 0xF8) >> 3) << "_" << subRegionADC[(vPair[i] & 0x7)]; |
201 | } |
202 | |
203 | cout << endl; |
916f1e76 |
204 | } |
205 | break; |
206 | default: |
207 | AliError("AliEMCALTriggerSTU::PrintADC(): Undefined trigger type, pls check!"); |
208 | } |
209 | } |
210 | |
916f1e76 |
211 | //___________ |
212 | void AliEMCALTriggerSTU::PatchGenerator(const TClonesArray* lpos, Int_t val) |
213 | { |
214 | ZeroRegion(); |
215 | |
216 | Int_t vTRU[32][24][4] ;//= {0}; |
217 | |
218 | for (Int_t i = 0; i < 32; i++) |
219 | for (Int_t j = 0; j < 24; j++) |
220 | for (Int_t k = 0; k < 4; k++) vTRU[i][j][k]=0; |
221 | |
222 | |
223 | AliWarning("AliEMCALTriggerSTU::PatchGenerator(): STU region has been reset!"); |
224 | |
225 | // Fill the patch FOR at 'pos' w/ value 'val' |
226 | |
227 | TIter NextPosition( lpos ); |
228 | |
229 | while ( TVector2 *pos = (TVector2*)NextPosition() ) |
230 | { |
231 | pos->Print(); |
da509d54 |
232 | for (Int_t i=(Int_t)(pos->X()*fSubRegionSize->X()); i<int((pos->X()+fPatchSize->X())*fSubRegionSize->X()); i++) |
233 | for (Int_t j=(Int_t)(pos->Y()*fSubRegionSize->Y()); j<int((pos->Y()+fPatchSize->Y())*fSubRegionSize->Y()); j++) |
916f1e76 |
234 | fRegion[i][j] = val; |
235 | } |
236 | |
237 | for (Int_t i=0; i<2; i++) |
238 | { |
239 | for (Int_t j=0; j<16; j++) |
240 | { |
241 | Int_t iTRU = ( !i ) ? 31 - j : 15 - j; |
242 | |
243 | for (Int_t i1=24*i; i1<24*(i+1); i1++) |
244 | { |
245 | for (Int_t j1=4*j; j1<4*(j+1); j1++) |
246 | { |
247 | vTRU[iTRU][i1%24][j1%4] = fRegion[i1][j1]; |
248 | } |
249 | } |
250 | } |
251 | } |
252 | |
253 | gSystem->Exec(Form("mkdir -p GP")); |
254 | |
255 | for (Int_t i=0; i<32; i++) |
256 | { |
257 | std::ofstream outfile(Form("GP/data_TRU%d.txt",i),std::ios::trunc); |
258 | |
259 | for (Int_t j=0;j<96;j++) |
260 | { |
261 | Int_t ietam, iphim; |
262 | |
263 | if ( int(i / 16) ) |
264 | { |
265 | ietam = j/4; |
266 | iphim = 3 - j%4; |
267 | } |
268 | else |
269 | { |
270 | ietam = 23 - j/4; |
271 | iphim = j%4; |
272 | } |
273 | |
274 | outfile << vTRU[i][ietam][iphim] << endl; |
275 | } |
276 | |
277 | outfile.close(); |
278 | } |
279 | } |
280 | |
281 | //___________ |
de39a0ff |
282 | void AliEMCALTriggerSTU::ComputeThFromV0(const Int_t M[]) |
fff39dd1 |
283 | { |
284 | // |
de39a0ff |
285 | if (!(M[0] + M[1])) AliWarning("V0A + V0C is null!"); // 0/1: V0C/V0A |
fff39dd1 |
286 | |
fff39dd1 |
287 | |
de39a0ff |
288 | fGammaTh = fDCSConfig->GetGA()*(M[0] + M[1])*(M[0] + M[1]) + fDCSConfig->GetGB()*(M[0] + M[1]) + fDCSConfig->GetGC(); |
fff39dd1 |
289 | |
de39a0ff |
290 | fJetTh = fDCSConfig->GetJA()*(M[0] + M[1])*(M[0] + M[1]) + fDCSConfig->GetJB()*(M[0] + M[1]) + fDCSConfig->GetJC(); |
291 | } |
292 | |
293 | //___________ |
294 | void AliEMCALTriggerSTU::SetThreshold(TriggerType_t type, Int_t v) |
295 | { |
296 | switch (type) |
297 | { |
298 | case kL1Gamma: |
299 | fGammaTh = v; |
300 | break; |
301 | case kL1Jet: |
302 | fJetTh = v; |
303 | break; |
304 | default: |
305 | AliError("AliEMCALTriggerSTU::SetThreshold(): Undefined trigger type, pls check!"); |
306 | } |
fff39dd1 |
307 | } |
308 | |
309 | //___________ |
de39a0ff |
310 | Int_t AliEMCALTriggerSTU::GetThreshold(TriggerType_t type) |
916f1e76 |
311 | { |
312 | // Compute threshold FIXME: need an access to the OCDB |
313 | // to get f(V0) parameters depending on trigger type |
314 | |
de39a0ff |
315 | |
316 | switch (type) |
916f1e76 |
317 | { |
de39a0ff |
318 | case kL1Gamma: |
fff39dd1 |
319 | return fGammaTh; |
916f1e76 |
320 | break; |
de39a0ff |
321 | case kL1Jet: |
fff39dd1 |
322 | return fJetTh; |
916f1e76 |
323 | break; |
324 | default: |
fff39dd1 |
325 | AliError("AliEMCALTriggerSTU::GetThreshold(): Undefined trigger type, pls check!"); |
916f1e76 |
326 | } |
327 | |
fff39dd1 |
328 | return 0; |
916f1e76 |
329 | } |
330 | |
331 | //__________ |
332 | void AliEMCALTriggerSTU::Reset() |
333 | { |
334 | fPatches->Delete(); |
335 | } |