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