Line data Source code
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 : #include "AliEMCALTriggerRawDigitMaker.h"
18 : #include "AliEMCALTriggerSTURawStream.h"
19 : #include "AliCaloRawAnalyzerFakeALTRO.h"
20 : #include "AliEMCALTriggerRawDigit.h"
21 : #include "AliCaloRawStreamV3.h"
22 : #include "AliRun.h"
23 : #include "AliRunLoader.h"
24 : #include "AliEMCAL.h"
25 : #include "AliCaloBunchInfo.h"
26 : #include "AliRawReader.h"
27 : #include "AliEMCALTriggerDCSConfigDB.h"
28 : #include "AliEMCALTriggerDCSConfig.h"
29 : #include "AliEMCALTriggerTRUDCSConfig.h"
30 : #include "AliEMCALTriggerSTUDCSConfig.h"
31 : #include "AliEMCALTriggerData.h"
32 : //#include "AliEMCALTriggerPatch.h"
33 : #include "AliLog.h"
34 :
35 : #include "AliRawVEvent.h"
36 : #include "AliRawEventHeaderBase.h"
37 : #include "AliRawEvent.h"
38 : #include "AliRawVEquipment.h"
39 : #include "AliRawEquipmentHeader.h"
40 : #include "AliDAQ.h"
41 :
42 : #include "Riostream.h"
43 :
44 : #include "AliCaloRawAnalyzerFactory.h"
45 :
46 42 : ClassImp(AliEMCALTriggerRawDigitMaker)
47 :
48 : //_______________
49 6 : AliEMCALTriggerRawDigitMaker::AliEMCALTriggerRawDigitMaker() : TObject(),
50 6 : fGeometry(0x0),
51 6 : fRawReader(0x0),
52 6 : fCaloRawStream(0x0),
53 6 : fSTURawStream(0x0),
54 6 : fRawDigits(0x0),
55 6 : fRawAnalyzer(0x0),
56 6 : fDCSConfig(0x0),
57 6 : fTriggerData(0x0)
58 30 : {
59 : // def ctor
60 :
61 6 : AliRunLoader* rl = AliRunLoader::Instance();
62 18 : if (rl && rl->GetAliRun()){
63 25 : AliEMCAL * emcal = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"));
64 15 : if(emcal) fGeometry = emcal->GetGeometry();
65 5 : }
66 :
67 6 : if(!fGeometry)
68 : {
69 : // AliDebug(1, Form("Using default geometry"));
70 2 : fGeometry = AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaultGeometryName());
71 1 : }
72 :
73 : // fRawAnalyzer = new AliCaloRawAnalyzerFakeALTRO ();
74 :
75 12 : fRawAnalyzer = (AliCaloRawAnalyzerFakeALTRO*)AliCaloRawAnalyzerFactory::CreateAnalyzer(kFakeAltro);
76 :
77 12 : fDCSConfig = AliEMCALTriggerDCSConfigDB::Instance();
78 :
79 : //Int_t nRawDigits = 5952; //fGeometry->GetNTotalTRU() * 96;
80 71436 : for (Int_t i=kMaxDigitIndex;i--;) fRawDigitIndex[i] = -1;
81 12 : }
82 :
83 : //_______________
84 : AliEMCALTriggerRawDigitMaker::~AliEMCALTriggerRawDigitMaker()
85 24 : {
86 : // dtor
87 24 : }
88 :
89 : //_______________
90 : void AliEMCALTriggerRawDigitMaker::SetIO(AliRawReader* reader, AliCaloRawStreamV3& in, AliEMCALTriggerSTURawStream& inSTU, TClonesArray* digits, TClonesArray *data)
91 : {
92 : // Connect I/O
93 :
94 8 : fRawReader = reader;
95 4 : fCaloRawStream = ∈
96 4 : fRawDigits = digits;
97 4 : fSTURawStream = &inSTU;
98 4 : fTriggerData = data;
99 4 : }
100 :
101 : ///
102 : /// Add bunch list of type AliCaloBunchInfo
103 : ///
104 : //_________________
105 : void AliEMCALTriggerRawDigitMaker::Add(const std::vector<AliCaloBunchInfo> &bunchlist)
106 : {
107 0 : Int_t hwAdd = fCaloRawStream->GetHWAddress();
108 0 : UShort_t iRCU = fCaloRawStream->GetDDLNumber() % 2; // 0/1
109 0 : Int_t iSM = fCaloRawStream->GetModule();
110 :
111 0 : Int_t iTRU = fGeometry->GetTriggerMapping()->GetTRUIndexFromOnlineHwAdd(hwAdd,iRCU,iSM);
112 :
113 : // if (AliDebugLevel())
114 : // {
115 : // UShort_t iBranch = ( hwAdd >> 11 ) & 0x1; // 0/1
116 : // printf("===\n");
117 : // printf("| Hw Adress: 0x%x => SM# %2d / RCU# %d / Branch# %d / TRU# %2d / ADC# %2d\n",
118 : // hwAdd, fCaloRawStream->GetModule(), iRCU, iBranch, iTRU, fCaloRawStream->GetColumn());
119 : // }
120 :
121 0 : Int_t idx;
122 :
123 : AliEMCALTriggerRawDigit* dig = 0x0;
124 :
125 0 : Int_t timeSamples[256]; for (Int_t j=0; j<256; j++) timeSamples[j] = 0;
126 : Int_t nSamples = 0;
127 :
128 0 : UInt_t iBin = bunchlist.at(0).GetStartBin();
129 : Int_t iBunch = 0;
130 :
131 0 : for (UInt_t i = 0; i < bunchlist.size(); i++)
132 : {
133 0 : AliCaloBunchInfo bunch = bunchlist.at(i);
134 :
135 0 : if (iBin > bunch.GetStartBin())
136 : {
137 0 : iBin = bunch.GetStartBin();
138 : iBunch = i;
139 0 : }
140 :
141 0 : if (fCaloRawStream->GetColumn() < 96)
142 : {
143 0 : const UShort_t* sig = bunch.GetData();
144 0 : Int_t startBin = bunch.GetStartBin();
145 :
146 0 : for (Int_t iS = 0; iS < bunch.GetLength(); iS++)
147 : {
148 0 : Int_t time = startBin--;
149 0 : Int_t amp = sig[iS];
150 :
151 0 : if (amp) timeSamples[nSamples++] = ((time << 16) & 0xFF0000) | (amp & 0xFFFF);
152 :
153 : // if (AliDebugLevel())
154 : // {
155 : // printf("ADC# %2d / time: %2d amplitude: %d\n", fCaloRawStream->GetColumn(), time, amp);
156 : // }
157 :
158 : }
159 0 : }
160 0 : }
161 :
162 0 : if (fCaloRawStream->GetColumn() > 95 && fCaloRawStream->GetColumn() < 106)
163 : {
164 0 : Int_t nBits = (fCaloRawStream->GetColumn() == 105) ? 6 : 10;
165 :
166 0 : const UShort_t* sig = bunchlist.at(iBunch).GetData();
167 :
168 : // if (AliDebugLevel()) printf("| L0 id in F-ALTRO => bunch length is: %d\n", bunchlist.at(iBunch).GetLength());
169 :
170 0 : for (Int_t i = 0; i < bunchlist.at(iBunch).GetLength(); i++)
171 : {
172 : // if (AliDebugLevel()) printf("| sig[%3d]: %x\n",i,sig[i]);
173 :
174 0 : for (Int_t j = 0; j < nBits; j++)
175 : {
176 0 : if (sig[i] & ( 1 << j ))
177 : {
178 : // if (AliDebugLevel())
179 : // {
180 : // printf("| Add L0 patch index in TRU# %2d position %2d\n",iTRU,(fCaloRawStream->GetColumn() - 96) * 10 + j);
181 : // }
182 :
183 0 : if (fGeometry->GetAbsFastORIndexFromTRU(iTRU, (fCaloRawStream->GetColumn() - 96) * 10 + j, idx))
184 : {
185 0 : if (fRawDigitIndex[idx] >= 0)
186 : {
187 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
188 0 : }
189 : else
190 : {
191 : // AliDebug(100,"L0: Trying to update trigger info of a non-existent digit!");
192 :
193 0 : fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
194 0 : new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, 0x0, 0);
195 :
196 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
197 : }
198 :
199 0 : dig->SetL0Time(iBin);
200 0 : }
201 : }
202 : }
203 :
204 : // FIX ME
205 : // if (fCaloRawStream->GetColumn() == 105 && (sig[i] & (1 << 6)))
206 : // {
207 : // fTriggerData->SetL0Trigger(1, iTRU, 1);
208 : //
209 : // if (AliDebugLevel()) printf("=======TRU# %2d has issued a L0\n",iTRU);
210 : // }
211 :
212 0 : iBin--;
213 : }
214 0 : }
215 : else
216 : {
217 0 : if (nSamples && fGeometry->GetAbsFastORIndexFromTRU(iTRU, fCaloRawStream->GetColumn(), idx))
218 : {
219 0 : if (fRawDigitIndex[idx] < 0)
220 : {
221 0 : fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
222 0 : new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, timeSamples, nSamples);
223 : }
224 : else
225 : {
226 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
227 0 : dig->SetTimeSamples(timeSamples, nSamples);
228 : }
229 :
230 : // if (AliDebugLevel())
231 : // {
232 : // printf("| Add TRG digit of id# %4d from TRU# %2d ADC# %2d\n", idx, iTRU, fCaloRawStream->GetColumn());
233 : //
234 : // dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
235 : // dig->Print("");
236 : //
237 : // Int_t iSm, iTru, iEta, iPhi, iD[4], iFor;
238 : // if (fGeometry->GetPositionInTRUFromAbsFastORIndex(idx, iTru, iEta, iPhi))
239 : // {
240 : // printf("| Position => TRU: %2d Eta: %2d Phi: %2d\n", iTru, iEta, iPhi);
241 : // }
242 : //
243 : // if (fGeometry->GetPositionInSMFromAbsFastORIndex(idx, iSm, iEta, iPhi))
244 : // {
245 : // printf("| Position => SM: %2d Eta: %2d Phi: %2d\n", iSm, iEta, iPhi);
246 : // }
247 : //
248 : // if (fGeometry->GetCellIndexFromFastORIndex(idx, iD))
249 : // {
250 : // printf("| tower iDs: ");
251 : // for (Int_t i = 0; i < 4; i++)
252 : // {
253 : // printf("%5d ",iD[i]);
254 : // }
255 : // printf("\n");
256 : //
257 : // for (Int_t i = 0; i < 4; i++)
258 : // {
259 : // if (fGeometry->GetFastORIndexFromCellIndex(iD[i], iFor))
260 : // {
261 : // printf("| tower %d to F-OR %d\n",iD[i],iFor);
262 : // }
263 : // }
264 : // }
265 : // }
266 : }
267 : }
268 0 : }
269 :
270 : //_______________
271 : void AliEMCALTriggerRawDigitMaker::PostProcess()
272 : {
273 : // Post process digits
274 :
275 : // AliDebug(2,"Start post processing the raw digit maker");
276 8 : Int_t idx;
277 4 : const Int_t offsetEMCAL = AliDAQ::DdlIDOffset("EMCAL");
278 :
279 : AliEMCALTriggerRawDigit* dig = 0x0;
280 :
281 : // Loop over both STU DDLs in order to read out both EMCAL and DCAL (if available)
282 : Int_t detectorID = 0; // 0 - EMCAL, 1 - DCAL
283 24 : for(Int_t istu = AliDAQ::GetFirstSTUDDL(); istu <= AliDAQ::GetLastSTUDDL(); istu++){
284 8 : detectorID = istu - AliDAQ::GetFirstSTUDDL();
285 :
286 8 : AliEMCALTriggerData *trgData = (AliEMCALTriggerData*)fTriggerData->At(detectorID);
287 :
288 8 : fRawReader->Reset();
289 8 : fRawReader->Select("EMCAL",istu,istu);
290 :
291 8 : AliRawVEvent *event = (AliRawEvent*)fRawReader->GetEvent();
292 8 : if (!event) {
293 0 : AliError(Form("STU DDL# %d not available!",istu));
294 0 : continue;
295 : }
296 :
297 : Bool_t isSTUin = kFALSE;
298 :
299 8 : Int_t nSubEv = fRawReader->GetEvent()->GetNSubEvents();
300 :
301 1912 : for ( Int_t iSubEv=0; iSubEv<nSubEv; iSubEv++)
302 : {
303 948 : AliRawVEvent *subEv = ((AliRawEvent*)fRawReader->GetEvent())->GetSubEvent(iSubEv);
304 948 : if ( !subEv ) continue;
305 :
306 8380 : for (Int_t iEquip = 0; iEquip < subEv->GetNEquipments(); iEquip++)
307 : {
308 3242 : Int_t eqId = subEv->GetEquipment(iEquip)->GetEquipmentHeader()->GetId();
309 :
310 3242 : if (eqId == offsetEMCAL + istu) isSTUin = kTRUE;
311 : }
312 948 : }
313 :
314 8 : fRawReader->Reset();
315 :
316 8 : if (isSTUin && fSTURawStream && fSTURawStream->ReadPayLoad())
317 : {
318 0 : trgData->SetL1DataDecoded(1);
319 :
320 0 : for (int i = 0; i < 2; i++) {
321 0 : trgData->SetL1GammaThreshold(i, fSTURawStream->GetL1GammaThreshold(i));
322 0 : trgData->SetL1JetThreshold( i, fSTURawStream->GetL1JetThreshold(i) );
323 : }
324 :
325 0 : Int_t v0[2] = { static_cast<Int_t>(fSTURawStream->GetV0A()), static_cast<Int_t>(fSTURawStream->GetV0C())};
326 :
327 0 : Int_t type[19] =
328 0 : {
329 0 : static_cast<Int_t>(fSTURawStream->GetG(0, 0)),
330 0 : static_cast<Int_t>(fSTURawStream->GetG(1, 0)),
331 0 : static_cast<Int_t>(fSTURawStream->GetG(2, 0)),
332 0 : static_cast<Int_t>(fSTURawStream->GetJ(0, 0)),
333 0 : static_cast<Int_t>(fSTURawStream->GetJ(1, 0)),
334 0 : static_cast<Int_t>(fSTURawStream->GetJ(2, 0)),
335 0 : static_cast<Int_t>(fSTURawStream->GetG(0, 1)),
336 0 : static_cast<Int_t>(fSTURawStream->GetG(1, 1)),
337 0 : static_cast<Int_t>(fSTURawStream->GetG(2, 1)),
338 0 : static_cast<Int_t>(fSTURawStream->GetJ(0, 1)),
339 0 : static_cast<Int_t>(fSTURawStream->GetJ(1, 1)),
340 0 : static_cast<Int_t>(fSTURawStream->GetJ(2, 1)),
341 0 : static_cast<Int_t>(fSTURawStream->GetRawData()),
342 0 : static_cast<Int_t>(fSTURawStream->GetRegionEnable()),
343 0 : static_cast<Int_t>(fSTURawStream->GetFwVersion())
344 : };
345 :
346 : // Modify DCS config from STU payload content
347 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetG(0, 0, type[0]);
348 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetG(1, 0, type[1]);
349 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetG(2, 0, type[2]);
350 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetJ(0, 0, type[3]);
351 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetJ(1, 0, type[4]);
352 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetJ(2, 0, type[5]);
353 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetG(0, 1, type[6]);
354 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetG(1, 1, type[7]);
355 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetG(2, 1, type[8]);
356 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetJ(0, 1, type[9]);
357 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetJ(1, 1, type[10]);
358 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetJ(2, 1, type[11]);
359 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetRawData(type[12]);
360 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetRegion(type[13]);
361 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->SetFw(type[14]);
362 :
363 0 : if (detectorID) {
364 0 : for (int i=0;i<4;i++) {
365 0 : type[15+i]=static_cast<Int_t>(fSTURawStream->GetPHOSScale(i));
366 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetPHOSScale(i,type[15+i]);
367 : }
368 : // Modify DCS config from STU payload content
369 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetG(0, 0, type[0]);
370 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetG(1, 0, type[1]);
371 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetG(2, 0, type[2]);
372 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetJ(0, 0, type[3]);
373 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetJ(1, 0, type[4]);
374 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetJ(2, 0, type[5]);
375 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetG(0, 1, type[6]);
376 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetG(1, 1, type[7]);
377 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetG(2, 1, type[8]);
378 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetJ(0, 1, type[9]);
379 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetJ(1, 1, type[10]);
380 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetJ(2, 1, type[11]);
381 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetRawData(type[12]);
382 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetRegion(type[13]);
383 : // fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig(kTRUE)->SetFw(type[14]);
384 0 : }
385 :
386 0 : trgData->SetL1FrameMask(fSTURawStream->GetFrameReceived());
387 0 : trgData->SetL1V0(v0);
388 0 : trgData->SetL1TriggerType(type);
389 :
390 0 : trgData->SetL1RawData(fSTURawStream->GetRawData());
391 :
392 0 : Int_t iTRU, jTRU, x, y, jADC;
393 :
394 0 : TVector2 sizeL1gsubr, sizeL1gpatch, sizeL1jsubr, sizeL1jpatch;
395 0 : fDCSConfig->GetTriggerDCSConfig()->GetSTUDCSConfig()->GetSegmentation(sizeL1gsubr, sizeL1gpatch, sizeL1jsubr, sizeL1jpatch);
396 :
397 0 : if (fSTURawStream->GetRawData())
398 : {
399 : // if (AliDebugLevel()) printf("| STU => TRU raw data are there!\n");
400 :
401 0 : Int_t nTRU = fSTURawStream->GetnTRU();
402 0 : for (Int_t i = 0; i < nTRU; i++)
403 : {
404 0 : iTRU = fGeometry->GetTRUIndexFromSTUIndex(i, detectorID);
405 :
406 0 : UInt_t adc[96]; for (Int_t j = 0; j < 96; j++) adc[j] = 0;
407 :
408 0 : fSTURawStream->GetADC(i, adc);
409 :
410 0 : for (Int_t j = 0; j < 96; j++)
411 : {
412 0 : if (adc[j] <= 0) continue;
413 :
414 : // AliDebug(10,Form("| STU => TRU# %2d raw data: ADC# %2d: %d\n", iTRU, j, adc[j]));
415 :
416 0 : if(fGeometry->GetTriggerMappingVersion() == 1){
417 0 : fGeometry->GetAbsFastORIndexFromTRU(iTRU, j, idx);
418 : } else {
419 0 : fGeometry->GetTRUFromSTU(i, j, jTRU, jADC, detectorID);
420 0 : fGeometry->GetAbsFastORIndexFromTRU(jTRU, jADC, idx);
421 : }
422 :
423 0 : if (fRawDigitIndex[idx] >= 0)
424 : {
425 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
426 :
427 : // if (!dig->GetNSamples()) AliDebug(10,Form("TRG digit of id: %4d found in STU but has no time sample in F-ALTRO!",idx));
428 0 : }
429 : else
430 : {
431 : // AliDebug(10,Form("TRG digit of id: %4d found in STU but not in F-ALTRO! Create a new digit!",idx));
432 :
433 0 : fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
434 0 : new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, 0x0, 0);
435 :
436 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
437 : }
438 :
439 0 : dig->SetL1TimeSum(adc[j]);
440 : }
441 0 : }
442 0 : }
443 :
444 : // List of patches in EMCal coordinate system
445 :
446 : // for (Int_t i = 0; i < fSTURawStream->GetNL0GammaPatch(); i++)
447 : // {
448 : // fSTURawStream->GetL0GammaPatch(i, iTRU, x);
449 : //
450 : // iTRU = fGeometry->GetTRUIndexFromSTUIndex(iTRU, detectorID);
451 : //
452 : // const Int_t sizePatchL0 =
453 : // ((AliEMCALTriggerTRUDCSConfig*)fDCSConfig->GetTriggerDCSConfig()->GetTRUArr()->At(fGeometry->GetOnlineIndexFromTRUIndex(iTRU)))->GetSegmentation()
454 : // *
455 : // ((AliEMCALTriggerTRUDCSConfig*)fDCSConfig->GetTriggerDCSConfig()->GetTRUArr()->At(fGeometry->GetOnlineIndexFromTRUIndex(iTRU)))->GetSegmentation();
456 : //
457 : // if (AliDebugLevel()) printf("| STU => Found L0 patch id: %2d in TRU# %2d\n", x, iTRU);
458 : //
459 : // Int_t idFastOR[4];
460 : // for (Int_t j = 0; j < 4; j++) idFastOR[j] = -1;
461 : //
462 : // if (fGeometry->GetFastORIndexFromL0Index(iTRU, x, idFastOR, sizePatchL0))
463 : // {
464 : // idx = idFastOR[1];
465 : //
466 : // Int_t px, py;
467 : // if (fGeometry->GetPositionInEMCALFromAbsFastORIndex(idx, px, py))
468 : // {
469 : // if (AliDebugLevel()) printf("| STU => Add L0 patch at (%2d , %2d)\n", px, py);
470 : //
471 : // if (fRawDigitIndex[idx] >= 0)
472 : // {
473 : // dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
474 : // }
475 : // else
476 : // {
477 : // fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
478 : // new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, 0x0, 0);
479 : //
480 : // dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
481 : // }
482 : //
483 : // dig->SetTriggerBit(kL0,1);
484 : // }
485 : // }
486 : // }
487 :
488 0 : for (int ithr = 0; ithr < 2; ithr++) {
489 0 : for (Int_t i = 0; i < fSTURawStream->GetNL1GammaPatch(ithr); i++) {
490 0 : if (fSTURawStream->GetL1GammaPatch(i, ithr, iTRU, x, y)) { // col (0..23), row (0..3)
491 : // if (AliDebugLevel()) printf("| STU => Found L1 gamma patch at (%2d , %2d) in TRU# %2d\n", x, y, iTRU);
492 :
493 0 : Int_t vx, vy, lphi;
494 :
495 0 : if (fGeometry->GetTriggerMappingVersion() == 1) {
496 0 : iTRU = fGeometry->GetTRUIndexFromSTUIndex(iTRU, detectorID);
497 0 : vx = 23 - x;
498 0 : vy = y + 4 * int(iTRU / 2); // Position in EMCal frame
499 0 : if (iTRU % 2) vx += 24; // C side
500 0 : vx = vx - int(sizeL1gsubr.X()) * int(sizeL1gpatch.X()) + 1;
501 :
502 0 : fGeometry->GetAbsFastORIndexFromPositionInEMCAL(vx, vy, idx);
503 : lphi = 63;
504 0 : }
505 : else {
506 0 : fGeometry->GetTRUFromSTU(iTRU, x, y, jTRU, vx, vy, detectorID);
507 0 : fGeometry->GetAbsFastORIndexFromPositionInTRU(jTRU, vx, vy, idx);
508 : lphi = 103;
509 : }
510 :
511 0 : if (vx >= 0 && vy < lphi) {
512 : // if (AliDebugLevel()) printf("| STU => Add L1 gamma [%d] patch at (%2d , %2d)\n", ithr, vx, vy);
513 :
514 0 : if (fRawDigitIndex[idx] >= 0) {
515 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
516 0 : }
517 : else {
518 0 : fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
519 0 : new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, 0x0, 0);
520 :
521 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
522 : }
523 :
524 0 : dig->SetTriggerBit(kL1GammaHigh + ithr,1);
525 0 : }
526 0 : }
527 : }
528 :
529 0 : for (Int_t i = 0; i < fSTURawStream->GetNL1JetPatch(ithr); i++) {
530 0 : if (fSTURawStream->GetL1JetPatch(i, ithr, x, y)) { // col (0,15), row (0,11)
531 : Int_t vx, vy;
532 0 : if (fGeometry->GetTriggerMappingVersion() == 1) {
533 0 : vx = 11 - y - int(sizeL1jpatch.X()) + 1;
534 0 : vy = 15 - x - int(sizeL1jpatch.Y()) + 1;
535 0 : }
536 : else {
537 : vx = y;
538 0 : vy = x;
539 : }
540 :
541 0 : vx *= int(sizeL1jsubr.X());
542 0 : vy *= int(sizeL1jsubr.Y());
543 :
544 : // AliDebug(1, Form("| STU => Found L1 jet [%d] patch at (%2d , %2d)\n", ithr, x, y));
545 :
546 0 : if (x >= 0 && y >= 0) {
547 0 : if (fGeometry->GetAbsFastORIndexFromPositionInEMCAL(vx, vy, idx)) {
548 : // if (AliDebugLevel()) printf("| STU => Add L1 jet patch at (%2d , %2d)\n", x, y);
549 :
550 0 : if (fRawDigitIndex[idx] >= 0) {
551 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
552 0 : }
553 : else {
554 0 : fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
555 0 : new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, 0x0, 0);
556 :
557 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
558 : }
559 :
560 0 : dig->SetTriggerBit(kL1JetHigh + ithr,1);
561 0 : }
562 : }
563 0 : }
564 : }
565 : }
566 :
567 0 : if (detectorID) {
568 0 : UInt_t sregion[36] = {0};
569 0 : fSTURawStream->GetPHOSSubregion(sregion);
570 0 : for (int isr=0;isr<36;isr++) {
571 0 : if (fGeometry->GetAbsFastORIndexFromPHOSSubregion(isr, idx)) {
572 0 : if (fRawDigitIndex[idx] >= 0) {
573 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
574 0 : }
575 : else {
576 0 : fRawDigitIndex[idx] = fRawDigits->GetEntriesFast();
577 0 : new((*fRawDigits)[fRawDigits->GetEntriesFast()]) AliEMCALTriggerRawDigit(idx, 0x0, 0);
578 :
579 0 : dig = (AliEMCALTriggerRawDigit*)fRawDigits->At(fRawDigitIndex[idx]);
580 : }
581 :
582 0 : dig->SetL1SubRegion(sregion[isr]);
583 : }
584 : }
585 0 : }
586 0 : }
587 8 : }
588 4 : }
589 :
590 : //_______________
591 : void AliEMCALTriggerRawDigitMaker::Reset()
592 : {
593 : // Reset
594 :
595 : Int_t nRawDigits = 4992;
596 39948 : for (Int_t i = 0; i < nRawDigits; i++) fRawDigitIndex[i] = -1;
597 4 : }
598 :
599 :
|