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