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 **************************************************************************/
21 Author: R. GUERNANE LPSC Grenoble CNRS/IN2P3
25 #include "AliEMCALTriggerTRU.h"
26 #include "AliEMCALTriggerPatch.h"
27 #include "AliEMCALTriggerTRUDCSConfig.h"
30 #include <TClonesArray.h>
32 #include <Riostream.h>
36 const Int_t kTimeBins = 16; // number of sampling bins of the FastOR signal
37 const Int_t kTimeWindowSize = 4; //
40 ClassImp(AliEMCALTriggerTRU)
43 AliEMCALTriggerTRU::AliEMCALTriggerTRU() : AliEMCALTriggerBoard(),
49 for (Int_t i=0;i<96;i++) for (Int_t j=0;j<256;j++) fADC[i][j] = 0;
53 AliEMCALTriggerTRU::AliEMCALTriggerTRU(AliEMCALTriggerTRUDCSConfig* dcsConf, const TVector2& rSize, Int_t mapType) :
54 AliEMCALTriggerBoard(rSize),
60 for (Int_t i=0;i<96;i++) for (Int_t j=0;j<256;j++) fADC[i][j] = 0;
64 if (dcsConf->GetL0SEL() & 0x0001) // 4-by-4
67 SetSubRegionSize( size );
75 SetSubRegionSize( size );
81 for (Int_t ietam=0;ietam<24;ietam++)
83 for (Int_t iphim=0;iphim<4;iphim++)
85 // idx: 0..95 since iphim: 0..11 ietam: 0..23
86 Int_t idx = ( !mapType ) ? ( 3 - iphim ) + ietam * 4 : iphim + (23 - ietam) * 4;
88 // Build a matrix used to get TRU digit id (ADC channel) from (eta,phi)|SM
89 fMap[ietam][iphim] = idx; // [0..11][0..3] namely [eta][phi] in SM
95 AliEMCALTriggerTRU::~AliEMCALTriggerTRU()
101 void AliEMCALTriggerTRU::ShowFastOR(Int_t iTimeWindow, Int_t iChannel)
105 Int_t iChanF, iChanL;
107 if (iChannel != -1) iChanF = iChanL = iChannel;
114 for (Int_t i=iChanF;i<iChanL+1;i++)
116 printf("\tChannel: %2d - ",i);
117 for (Int_t j=0;j<60;j++)
119 if (j == iTimeWindow)
120 printf(" | %4d",fADC[i][j]);
121 else if (j == iTimeWindow+kTimeWindowSize-1)
122 printf(" %4d |",fADC[i][j]);
124 printf(" %4d",fADC[i][j]);
132 Int_t AliEMCALTriggerTRU::L0()
134 // L0 algo depending on TRU fw version
136 const Int_t xsize = Int_t(fRegionSize->X());
137 const Int_t ysize = Int_t(fRegionSize->Y());
140 for (Int_t j = 0; j < xsize; j++) {
141 for (Int_t k = 0; k < ysize; k++) {
142 for (Int_t l = 0; l < kTimeBins; l++) {
143 asum += fADC[fMap[j][k]][l];
148 // TRU has no signal, return!
150 AliDebug(999,"=== TRU has no signal ===");
154 AliDebug(999,Form("=== TRU PF: %x",fDCSConfig->GetSELPF()));
156 UInt_t ma = fDCSConfig->GetSELPF() & 0xffff;
159 // for (int i = 0; i < 7; i++) {
160 // UInt_t bit = ma & (1 << i);
166 ma = (ma >> 8) & 0x7f;
168 AliDebug(999,Form("=== TRU fw version %x ===",fDCSConfig->GetFw()));
170 if (fDCSConfig->IsA()->GetClassVersion() >= 3) {
171 if (fDCSConfig->GetFw() < 0x4d) {
181 Int_t AliEMCALTriggerTRU::L0v0(int mask, int pattern)
183 // L0 issuing condition is: (2x2 PF) AND (4x4 > thres)
185 AliDebug(999,"=== Running TRU L0 algorithm version 0 ===");
187 const Int_t xsize = Int_t(fRegionSize->X());
188 const Int_t ysize = Int_t(fRegionSize->Y());
190 Int_t **othr = new Int_t*[xsize];
191 Int_t **patt = new Int_t*[xsize];
192 Int_t **buff = new Int_t*[xsize];
194 for (Int_t x = 0; x < xsize; x++) {
195 othr[x] = new Int_t[ysize];
196 patt[x] = new Int_t[ysize];
197 buff[x] = new Int_t[ysize];
200 for (Int_t i = 0; i < xsize; i++) {
201 for (Int_t j = 0; j < ysize; j++) {
208 // Time sliding window algorithm
209 for (int i = 0; i <= (kTimeBins - kTimeWindowSize); i++)
211 AliDebug(999,Form("----------- Time window: %d\n",i));
213 if (AliDebugLevel()) ShowFastOR(i, -1);
215 for (int j = 0; j < xsize; j++) {
216 for (int k = 0; k < ysize; k++) {
219 // !(j % int(fSubRegionSize->X()))
221 // !(k % int(fSubRegionSize->Y()))
223 // (j + int(fPatchSize->X() * fSubRegionSize->X()) <= xsize)
225 // (k + int(fPatchSize->Y() * fSubRegionSize->Y()) <= ysize)
230 // for (int l = 0; l < int(fPatchSize->X() * fSubRegionSize->X()); l++)
231 // for (int m = 0; m < int(fPatchSize->Y() * fSubRegionSize->Y()); m++) sum += fRegion[j + l][k + m];
233 // if (sum > int(fDCSConfig->GetGTHRL0())) {
234 // AliDebug(999,Form("----------- Patch (%2d,%2d) is over threshold\n", j, k));
239 buff[j][k] = fRegion[j][k];
242 for (Int_t l = i; l < i + kTimeWindowSize; l++) fRegion[j][k] += fADC[fMap[j][k]][l];
244 if (fRegion[j][k] > buff[j][k]) {
248 if (patt[j][k]) AliDebug(999,Form("----------- (%2d,%2d) New: %d Old: %d patt: %x / pattern: %x / mask: %x", j, k, fRegion[j][k], buff[j][k], patt[j][k], pattern, mask));
252 for (int j = 0; j <= int(fRegionSize->X() - fPatchSize->X() * fSubRegionSize->X()); j += int(fSubRegionSize->X())) {
253 for (int k = 0; k <= int(fRegionSize->Y() - fPatchSize->Y() * fSubRegionSize->Y()); k += int(fSubRegionSize->Y())) {
255 // if (!othr[j][k]) continue;
256 int sizeX = int(fPatchSize->X() * fSubRegionSize->X());
257 int sizeY = int(fPatchSize->Y() * fSubRegionSize->Y());
262 for (int l = 0; l < sizeX; l++) {
263 for (int m = 0; m < sizeY; m++) {
264 sum += fRegion[j + l][k + m];
266 if ((patt[j + l][k + m] & mask) == pattern) foundPeak++;
270 if (sum > int(fDCSConfig->GetGTHRL0())) othr[j][k] = sum;
272 if (foundPeak && othr[j][k]) {
274 new((*fPatches)[fPatches->GetEntriesFast()]) AliEMCALTriggerPatch(j, k, othr[j][k], i);
276 AliEMCALTriggerPatch* p = (AliEMCALTriggerPatch*)fPatches->At(fPatches->GetEntriesFast() - 1);
278 if (AliDebugLevel()) p->Print("");
280 const Int_t psize = sizeX * sizeY; // Number of FastOR in the patch
282 Int_t* idx = new Int_t[psize];
284 for (Int_t l = 0; l < sizeX; l++)
286 for (Int_t m = 0; m < sizeY; m++)
288 Int_t index = l * sizeY + m;
290 idx[index] = fMap[int(j * fSubRegionSize->X()) + l][int(k * fSubRegionSize->Y()) + m];
292 if ((patt[j + l][k + m] & mask) == pattern) {
293 // cout << "setting peak at " << l << " " << m << endl;
294 p->SetPeak(l, m, sizeX, sizeY);
297 if (AliDebugLevel() >= 999) ShowFastOR(i, idx[index]);
306 if (fPatches->GetEntriesFast() && !fL0Time) {
307 // Stop the algo when at least one patch is found ( thres & max )
313 for (int j = 0; j < xsize; j++)
314 for (int k = 0; k < ysize; k++) patt[j][k] <<= 1;
317 for (Int_t x = 0; x < xsize; x++) {
327 return fPatches->GetEntriesFast();
331 Int_t AliEMCALTriggerTRU::L0v1(int mask, int pattern)
333 // L0 issuing condition is: (4x4 PF) AND (4x4 > thres)
335 AliDebug(999,"=== Running TRU L0 algorithm version 1 ===");
337 const Int_t xsize = Int_t(fRegionSize->X());
338 const Int_t ysize = Int_t(fRegionSize->Y());
340 Int_t **othr = new Int_t*[xsize];
341 Int_t **buff = new Int_t*[xsize];
342 Int_t **patt = new Int_t*[xsize];
344 for (Int_t i = 0; i < xsize; i++) {
345 buff[i] = new Int_t[ysize];
346 patt[i] = new Int_t[ysize];
347 othr[i] = new Int_t[ysize];
350 for (Int_t i = 0; i < xsize; i++) for (Int_t j = 0; j < ysize; j++) {
356 // Time sliding window algorithm
357 for (Int_t i = 0; i <= (kTimeBins - kTimeWindowSize); i++) {
359 AliDebug(999,Form("----------- Time window: %d\n",i));
361 for (int j = 0; j < xsize; j++) {
362 for (int k = 0; k < ysize; k++) {
365 // !(j % int(fSubRegionSize->X()))
367 // !(k % int(fSubRegionSize->Y()))
369 // (j + int(fPatchSize->X() * fSubRegionSize->X()) <= xsize)
371 // (k + int(fPatchSize->Y() * fSubRegionSize->Y()) <= ysize)
376 // for (int l = 0; l < int(fPatchSize->X() * fSubRegionSize->X()); l++)
377 // for (int m = 0; m < int(fPatchSize->Y() * fSubRegionSize->Y()); m++) sum += fRegion[j + l][k + m];
379 // if (sum > buff[j][k]) patt[j][k] |= 0x1;
381 // AliDebug(999,Form("----------- Patch (%2d,%2d) has sum %d while its whole time pattern is %x\n", j, k, sum, patt[j][k]));
385 // if (sum > int(fDCSConfig->GetGTHRL0())) {
386 // AliDebug(999,Form("----------- Patch (%2d,%2d) is over threshold\n", j, k));
392 for (Int_t l = i; l < i + kTimeWindowSize; l++) fRegion[j][k] += fADC[fMap[j][k]][l];
396 for (int j = 0; j <= int(fRegionSize->X() - fPatchSize->X() * fSubRegionSize->X()); j += int(fSubRegionSize->X())) {
397 for (int k = 0; k <= int(fRegionSize->Y() - fPatchSize->Y() * fSubRegionSize->Y()); k += int(fSubRegionSize->Y())) {
401 for (int l = 0; l < int(fPatchSize->X() * fSubRegionSize->X()); l++)
402 for (int m = 0; m < int(fPatchSize->Y() * fSubRegionSize->Y()); m++) sum += fRegion[j + l][k + m];
404 if (sum > buff[j][k]) patt[j][k] |= 0x1;
406 if (sum > int(fDCSConfig->GetGTHRL0())) {
407 AliDebug(999,Form("----------- Patch (%2d,%2d) is over threshold\n", j, k));
412 AliDebug(999,Form("----------- Patch (%2d,%2d) has sum %d while its whole time pattern is %x\n", j, k, sum, patt[j][k]));
416 if (othr[j][k] && (patt[j][k] & mask) == pattern) {
418 new((*fPatches)[fPatches->GetEntriesFast()]) AliEMCALTriggerPatch(j, k, othr[j][k], i);
420 // AliDebug(999,Form("=== New L0 patch at (%2d,%2d) time: %2d",j, k, i));
422 int sizeX = int(fPatchSize->X() * fSubRegionSize->X());
423 int sizeY = int(fPatchSize->Y() * fSubRegionSize->Y());
425 for (int xx = 0; xx < sizeX; xx++) {
426 for (int yy = 0; yy < sizeY; yy++) {
427 ((AliEMCALTriggerPatch*)fPatches->At(fPatches->GetEntriesFast() - 1))->SetPeak(xx, yy, sizeX, sizeY);
431 AliEMCALTriggerPatch* p = (AliEMCALTriggerPatch*)fPatches->At(fPatches->GetEntriesFast() - 1);
433 if (AliDebugLevel()) p->Print("");
438 if (fPatches->GetEntriesFast() && !fL0Time) {
444 for (int j = 0; j < xsize; j++)
445 for (int k = 0; k < ysize; k++) patt[j][k] <<= 1;
448 for (Int_t x = 0; x < xsize; x++) {
458 return fPatches->GetEntriesFast();
462 void AliEMCALTriggerTRU::SetADC( Int_t channel, Int_t bin, Int_t sig )
465 if (channel > 95 || bin > 255) {
466 AliError("TRU has 96 ADC channels and 256 bins only!");
469 if (((fDCSConfig->GetMaskReg(int(channel / 16)) >> (channel % 16)) & 0x1) == 0) fADC[channel][bin] = sig;
474 void AliEMCALTriggerTRU::GetL0Region(const int time, Int_t arr[][4])
476 Int_t r0 = time - fDCSConfig->GetRLBKSTU();
480 AliError(Form("TRU buffer not accessible! time: %d rollback: %d", time, fDCSConfig->GetRLBKSTU()));
484 for (Int_t i = 0; i < fRegionSize->X(); i++)
486 for (Int_t j = 0; j < fRegionSize->Y(); j++)
488 for (Int_t k = r0; k < r0 + kTimeWindowSize; k++)
490 arr[i][j] += fADC[fMap[i][j]][k];
497 void AliEMCALTriggerTRU::SaveRegionADC(Int_t iTRU, Int_t iEvent)
501 gSystem->Exec(Form("mkdir -p Event%d",iEvent));
503 ofstream outfile(Form("Event%d/data_TRU%d.txt",iEvent,iTRU),ios_base::trunc);
505 for (Int_t i=0;i<96;i++)
507 Int_t ietam = 23 - i/4;
509 Int_t iphim = 3 - i%4;
511 outfile << fRegion[ietam][iphim] << endl;
518 void AliEMCALTriggerTRU::Reset()
526 for (Int_t i=0;i<96;i++) for (Int_t j=0;j<256;j++) fADC[i][j] = 0;