Coding conventions
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALTriggerElectronics.cxx
CommitLineData
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
19EMCal trigger electronics manager L0/L1
20can handle both simulated digits and raw data
21Author: R. GUERNANE LPSC Grenoble CNRS/IN2P3
22*/
23
24#include "AliEMCALTriggerElectronics.h"
25#include "AliEMCALTriggerTRU.h"
26#include "AliEMCALTriggerSTU.h"
27#include "AliEMCALGeometry.h"
28#include "AliRunLoader.h"
29#include "AliEMCAL.h"
30#include "AliRun.h"
31#include "AliEMCALTriggerData.h"
32#include "AliEMCALDigit.h"
33#include "AliCaloRawStreamV3.h"
34//#include "AliVZERORawStream.h"
35#include "AliEMCALTriggerSTURawStream.h"
36#include "AliEMCALDigit.h"
37#include "AliEMCALRawDigit.h"
38
39#include <TVector2.h>
40#include <TClonesArray.h>
41//#include <Riostream.h>
42
43namespace
44{
45 const Int_t kNTRU = 32;
46}
47
48ClassImp(AliEMCALTriggerElectronics)
49
50//__________________
51AliEMCALTriggerElectronics::AliEMCALTriggerElectronics(AliEMCALCalibData *calibData) : TObject(),
52fTRU(new TClonesArray("AliEMCALTriggerTRU",32)),
53fSTU(0x0)
54{
55 TVector2 rSize;
56
57 rSize.Set( 24., 4. );
58
59 // 32 TRUs
60 for (Int_t i=0;i<kNTRU;i++) new ((*fTRU)[i]) AliEMCALTriggerTRU(calibData, rSize, int(i/3) % 2);
61
62 rSize.Set( 48., 64. );
63
64 // 1 STU
65 fSTU = new AliEMCALTriggerSTU(calibData, rSize);
66
67 for (Int_t i=0;i<kNTRU;i++) fSTU->BuildMap( i,
68 (static_cast<AliEMCALTriggerTRU*>(fTRU->At(i)))->Map(),
69 (static_cast<AliEMCALTriggerTRU*>(fTRU->At(i)))->RegionSize()
70 );
71}
72
73//________________
74AliEMCALTriggerElectronics::~AliEMCALTriggerElectronics()
75{
76 //
77 fTRU->Delete();
78 delete fSTU;
79}
80
81//__________________
82void AliEMCALTriggerElectronics::Digits2Trigger(const TClonesArray* digits, const TTree* treeV0, AliEMCALTriggerData* data)
83{
84 //
85 AliEMCALGeometry* geom = 0x0;
86
87 AliRunLoader *rl = AliRunLoader::Instance();
88 if (rl->GetAliRun() && rl->GetAliRun()->GetDetector("EMCAL"))
89 geom = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"))->GetGeometry();
90 else
91 geom = AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaultGeometryName());
92
93 if (!geom) AliError("Cannot access geometry!");
94
95 TIter NextDigit(digits);
96 while (AliEMCALRawDigit* digit = (AliEMCALRawDigit*)NextDigit())
97 {
98 if ( digit )
99 {
100 Int_t id = digit->GetId();
101
102// digit->Print();
103
104 Int_t iTRU, iADC;
105 Bool_t isOK1 = geom->GetTRUFromAbsFastORIndex(id, iTRU, iADC);
106
107 for (Int_t i = 0; i < digit->GetNSamples(); i++)
108 {
109 Int_t time, amp;
110 Bool_t isOK2 = digit->GetTimeSample(i, time, amp);
111
112 if (isOK1 && isOK2 && amp) (static_cast<AliEMCALTriggerTRU*>(fTRU->At(iTRU)))->SetADC(iADC, time, amp);
113 }
114 }
115 }
116 /*
117 for (Int_t i=0; i<kNTRU; i++)
118 {
119 printf("===========< TRU %2d >============\n",i);
120 (static_cast<AliEMCALTriggerTRU*>(fTRU->At(i)))->Scan();
121 }
122 */
123 Int_t iL0 = 0;
124
125 // At this point all FastOR are available for digitization
126 // digitization is done in the TRU and produces time samples
127 // Now run the trigger algo & consecutively write trigger outputs in TreeD dedicated branch
128
129 for (Int_t i=0; i<kNTRU; i++)
130 {
131 AliDebug(1,Form("===========< TRU %2d >============\n",i));
132
133 AliEMCALTriggerTRU *iTRU = static_cast<AliEMCALTriggerTRU*>(fTRU->At(i));
134
135 iL0 += iTRU->L0v1();
136
137 Int_t vL0Peaks[96][2]; iTRU->Peaks( vL0Peaks );
138
139 data->SetL0Patches( i , iTRU->Patches() );
140 data->SetL0Peaks( i , vL0Peaks );
141
142 if ( !i ) // do it once since identical for all TRU
143 {
144 data->SetL0RegionSize( *iTRU->RegionSize() );
145 data->SetL0SubRegionSize( *iTRU->SubRegionSize() );
146 data->SetL0PatchSize( *iTRU->PatchSize() );
147 }
148
149 // if ( i == 31 ) i = 35;
150 //
151 // if ( ( i / 3 ) % 2 ) {
152 // TRU->Print( 15 - 2 + ( i - int( i / 3 ) * 3 ) - 3 * ( (i / 3) / 2 ) , runLoader->GetEventNumber() );
153 // printf("print data of TRU: from %2d to %2d\n",i,15 - 2 + ( i - int( i / 3 ) * 3 ) - 3 * ( (i / 3) / 2));
154 // }
155 // else
156 // {
157 // TRU->Print( 31 - i % 3 - 3 * ( (i / 3) / 2 ) , runLoader->GetEventNumber() );
158 // printf("print data of TRU: from %2d to %2d\n",i,31 - i % 3 - 3 * ( (i / 3) / 2 ));
159 // }
160 }
161
162 // A L0 has been issued, run L1
163 if ( iL0 )
164 {
165 for (Int_t i=0; i<kNTRU; i++) fSTU->FetchFOR( i,
166 (static_cast<AliEMCALTriggerTRU*>(fTRU->At(i)))->Region(),
167 (static_cast<AliEMCALTriggerTRU*>(fTRU->At(i)))->RegionSize()
168 );
169
170// fSTU->Scan();
171
172 TTree* tr = const_cast<TTree*>(treeV0);
173 if ( tr ) fSTU->V0Multiplicity( *tr );
174
175 TVector2 size;
176
177 size.Set( 1. , 1. );
178 fSTU->SetSubRegionSize( size ); data->SetL1GammaSubRegionSize( size );
179
180 size.Set( 2. , 2. );
181 fSTU->SetPatchSize( size ); data->SetL1GammaPatchSize( size );
182
183 fSTU->L1( kGamma );
184
185 data->SetL1GammaPatches( fSTU->Patches() );
186
187 fSTU->Reset();
188
189 size.Set( 4. , 4. );
190 fSTU->SetSubRegionSize( size ); data->SetL1JetSubRegionSize( size );
191
192 size.Set( 2. , 2. );
193 fSTU->SetPatchSize( size ); data->SetL1JetPatchSize( size );
194
195 fSTU->L1( kJet );
196
197 data->SetL1JetPatches( fSTU->Patches() );
198 data->SetL1RegionSize( *fSTU->RegionSize() );
199
200 Int_t** region = fSTU->Region();
201 data->SetL1Region( region );
202 const Int_t* mv0 = fSTU->V0();
203 data->SetL1V0( mv0 );
204 }
205
206 // Now reset the electronics for a fresh start with next event
207 Reset();
208}
209
210//__________________
211void AliEMCALTriggerElectronics::Reset()
212{
213 //
214 TIter NextTRU(fTRU);
215 while ( AliEMCALTriggerTRU *TRU = (AliEMCALTriggerTRU*)NextTRU() ) TRU->Reset();
216
217 fSTU->Reset();
218}