]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EMCAL/macros/GeneratePedestalScriptSRU.C
CMake: Retrieve Git information
[u/mrichter/AliRoot.git] / EMCAL / macros / GeneratePedestalScriptSRU.C
CommitLineData
74a49dc3 1// some global var/constants
2const Int_t kNSM = 12; //
3const Int_t kNRCU = 2;
4const Int_t kNDTC = 40; // links for full SRU (corresponding to two readout crates or RCUs)
5AliCaloAltroMapping *fMapping[4]; // 1 for each side (A/C) and each RCU (0/1), i.e. 2*2 total
6const Int_t kNBranch = 2;
7const Int_t kNFEC = 10; // 0..9, when including LED Ref
8const Int_t kNChip = 5; // really 0,2..4, i.e. skip #1
9const Int_t kNChan = 16;
10Float_t fMeanPed[kNSM][kNRCU][kNBranch][kNFEC][kNChip][kNChan];
11Float_t fRmsPed[kNSM][kNRCU][kNBranch][kNFEC][kNChip][kNChan];
12//
13const int kNStrips = 24; // per SM
14Int_t fHWAddrLEDRef[kNStrips][2]; // [2] is for Low/High gain
15
16const Bool_t kDebug = kFALSE;
17const Float_t kBadRMS = 20;
18
19// help methods
20void GetPedVal(const Int_t iSM, const Int_t igain, const TProfile2D *h2);
21void GetPedValLEDRef(const Int_t iSM, const Int_t igain, const TProfile *h);
22void PrintScript(const Int_t runno);
23void Clear();
24Int_t GetHWAddress(Int_t iside, Int_t icol, Int_t irow, Int_t igain);
25Int_t GetHWAddressLEDRef(Int_t istrip, Int_t igain);
26void DecodeHWAddress(Int_t hwAddr, Int_t & branch, Int_t & FEC, Int_t & chip, Int_t & chan);
27void GetMapping();
28void CreateMappingLEDRef();
29
30// main method
31void
32GeneratePedestalScriptSRU(const char * filename = "EMCALPED.root") // from DA node
33{
34 // get the DA info/object
35 TFile *file = TFile::Open(filename);
36 //TMP AliCaloCalibPedestal *emcCalibPedestal = AliCDBEntry->GetObject();
37 if (kDebug) {
38 file->ls();
39 }
40 int runno = emcCalibPedestal->GetRunNumber();
41
42 // Get mapping file info, and clear arrays
43 Clear();
44 GetMapping();
45 CreateMappingLEDRef();
46
47 // Store the pedestal info
48 for (Int_t iSM=0; iSM<kNSM; iSM++) {
49 GetPedVal( iSM, 0, emcCalibPedestal->GetPedProfileLowGain(iSM) );
50 GetPedVal( iSM, 1, emcCalibPedestal->GetPedProfileHighGain(iSM) );
51 GetPedValLEDRef( iSM, 0, emcCalibPedestal->GetPedLEDRefProfileLowGain(iSM) );
52 GetPedValLEDRef( iSM, 1, emcCalibPedestal->GetPedLEDRefProfileHighGain(iSM) );
53 }
54
55 // Generate the needed scripts
56 PrintScript(runno);
57
58}
59
60void
61GetPedVal(const Int_t iSM, const Int_t igain, const TProfile2D *h2)
62{
63 Int_t isect = iSM / 2; //
64 Int_t iside = iSM % 2; // A or C side
65 Int_t nCols = h2->GetNbinsX();
66 Int_t nRows = h2->GetNbinsY();
67 if (kDebug) {
68 printf("GetPedVal: iSM %d isect %d iside %d igain %d nRows %d nCols %d\n",
69 iSM, isect, iside, igain, nRows, nCols);
70 }
71 Int_t hwAddress = 0;
72 Int_t iRCU = 0;
73 Int_t branch = 0;
74 Int_t FEC = 0;
75 Int_t chip = 0;
76 Int_t chan = 0;
77
78 Int_t icol = 0;
79 Int_t irow = 0;
80 Int_t bin = 0;
81
82 for (icol=0; icol<nCols; icol++) {
83 for (irow=0; irow<nRows; irow++) {
84
85 hwAddress = GetHWAddress(iside, icol, irow, igain, iRCU);
86 DecodeHWAddress(hwAddress, branch, FEC, chip, chan);
87 bin = h2->FindBin(icol, irow);
88
89 // store the values
90 fMeanPed[iSM][iRCU][branch][FEC][chip][chan] = h2->GetBinContent(bin);
91 fRmsPed[iSM][iRCU][branch][FEC][chip][chan] = h2->GetBinError(bin);
92
93 // report bad RMS channels:
94 if (h2->GetBinError(bin) > kBadRMS) {
95 printf(" bad pedestal RMS: iSM %d icol %d irow %d igain %d iRCU %d branch %d FEC %d chip %d chan %d - mean %4.1f rms %4.1f\n",
96 iSM, icol, irow, igain, iRCU, branch, FEC, chip, chan,
97 h2->GetBinContent(bin), h2->GetBinError(bin));
98 }
99 }
100 }
101
102 return;
103}
104
105
106void
107GetPedValLEDRef(const Int_t iSM, const Int_t igain, const TProfile *h)
108{
109 Int_t isect = iSM / 2; //
110 Int_t iside = iSM % 2; // A or C side
111 Int_t nStrips = h->GetNbinsX();
112
113 if (kDebug) {
114 printf("GetPedValLEDRef: iSM %d isect %d iside %d igain %d nStrips %d\n",
115 iSM, isect, iside, igain, nStrips);
116 }
117 Int_t hwAddress = 0;
118 Int_t iRCU = 0; // always true for LED Ref FEE
119 Int_t branch = 0;
120 Int_t FEC = 0;
121 Int_t chip = 0;
122 Int_t chan = 0;
123
124 Int_t icol = 0;
125 Int_t irow = 0;
126 Int_t bin = 0;
127
128 for (int istrip=0; istrip<nStrips; istrip++) {
129
130 hwAddress = GetHWAddressLEDRef(istrip, igain);
131 DecodeHWAddress(hwAddress, branch, FEC, chip, chan);
132 bin = h->FindBin(istrip);
133
134 // store the values
135 fMeanPed[iSM][iRCU][branch][FEC][chip][chan] = h->GetBinContent(bin);
136 fRmsPed[iSM][iRCU][branch][FEC][chip][chan] = h->GetBinError(bin);
137 }
138
139 return;
140}
141
142void
143PrintScript(const int runno)
144{
145 const char * sideStr[] = {"A","C"};
146 const char * branchStr[] = {"A","B"};
147 int VFPED = 0x06;
148 int SRUAltroWrite = 0x40000000;
149 int Port = 0x1001; // 4097
150
151 char dirname[40];
152 sprintf(dirname,"scriptsSRU_Run%d", runno);
153
154 char cmd[500];
155 sprintf(cmd,"mkdir -p %s/SM{A,C}{0,1,2,3,4,5}", dirname);
156 gSystem->Exec(cmd);
157
158 sprintf(cmd,"echo \"cp info.txt GeneratePedestalScriptSRU.C %s/.\" > scp.sh", dirname);
159 gSystem->Exec(cmd);
160 sprintf(cmd,"echo \"scp -r -p %s aldaqacr50:pedestals/.\" >> scp.sh", dirname);
161 gSystem->Exec(cmd);
162 sprintf(cmd,"echo \"ssh -t aldaqacr50 \'cd pedestals; scp -r -p %s emc@alidcscom702:srudcs/scripts/pedestals/.\'\" >> scp.sh", dirname);
163 gSystem->Exec(cmd);
164
165 char filename[100];
166 char scriptLine[200];
167
168 Int_t iSM = 0;
169 Int_t iRCU = 0;
170 Int_t ibranch = 0;
171 Int_t iFEC = 0;
172 Int_t ichip = 0;
173 Int_t ichan = 0;
174 Int_t Ped = 0;
175 Int_t iDTC = 0;
176
177 for (iSM=0; iSM<kNSM; iSM++) {
178 int iside = iSM % 2;
179 int isect = iSM / 2;
180
181 char IP[100];
182 if (iSM == 0) { sprintf(IP, "10.160.132.100"); } // SMA0
183 else if (iSM == 1) { sprintf(IP, "10.160.132.102"); } // SMC0
184 else if (iSM == 2) { sprintf(IP, "10.160.132.104"); } // SMA1
185 else if (iSM == 3) { sprintf(IP, "10.160.132.106"); } // SMC1
186 else if (iSM == 4) { sprintf(IP, "10.160.132.108"); } // SMA2
187 else if (iSM == 5) { sprintf(IP, "10.160.132.110"); } // SMC2
188 else if (iSM == 6) { sprintf(IP, "10.160.132.112"); } // SMA3
189 else if (iSM == 7) { sprintf(IP, "10.160.132.114"); } // SMC3
190 else if (iSM == 8) { sprintf(IP, "10.160.132.116"); } // SMA4
191 else if (iSM == 9) { sprintf(IP, "10.160.132.118"); } // SMC4
192 else if (iSM == 10) { sprintf(IP, "10.160.36.155"); } // SMA5
193 else if (iSM == 11) { sprintf(IP, "10.160.36.156"); } // SMC5
194
195 // only do instrumented parts..
196 int activeDTC[kNDTC] = {0};
197 for (iDTC=0; iDTC<kNDTC; iDTC++) {
198 if (iDTC==10 || iDTC==20 || iDTC==30) { // skip TRU
199 activeDTC[iDTC] = 0;
200 }
201 else {
202 if (iSM<10) { // not special third SM
203 activeDTC[iDTC] = 1;
204 }
205 else {
206 if (iSM==10) { // SMA5
207 if (iDTC<14) { activeDTC[iDTC] = 1; }
208 else { activeDTC[iDTC] = 0; }
209 }
210 else if (iSM==11) { // SMC5
211 if (iDTC==0 || iDTC>=27) { activeDTC[iDTC] = 1; }
212 else { activeDTC[iDTC] = 0; }
213 }
214
215 }
216 }
217 }
218
219 // OK, let's generate the files for all active FECs/DTCs
220 for (iDTC=0; iDTC<kNDTC; iDTC++) {
221 if (activeDTC[iDTC] == 0) { continue; }
222 sprintf(filename, "%s/SM%1s%d/set_ped_DTC%02d.txt",
223 dirname, sideStr[iside], isect, iDTC);
224 ofstream fout(filename);
225
226 iRCU = iDTC / 20;
227 ibranch = (iDTC % 20) / 10;
228 iFEC = iDTC % 10;
229 int ipos = iFEC + 10*ibranch;
230
231 // write DTC file header..
232 sprintf(scriptLine, "%s # IP\n%d #UDP port", IP, Port);
233 fout << scriptLine << endl;
234
235 int dtcselUpper = 0;
236 int dtcselLower = 0;
237 if (iRCU == 0) {
238 dtcselLower = (1 << ipos);
239 }
240 else { // crate == 1
241 dtcselUpper = (1 << ipos);
242 }
243 sprintf(scriptLine, "%08x # DTC SEL Upper\n%08x # DTC SEL Lower",
244 dtcselUpper, dtcselLower);
245 fout << scriptLine << endl;
246 sprintf(scriptLine, "%08x # FEE GTL Address\n%08x # Branch %s, Card %d",
247 0x3, iFEC + 16*ibranch, branchStr[ibranch], iFEC);
248 fout << scriptLine << endl;
249 // end header
250
251 for (ichip=0; ichip<kNChip; ichip++) { // ALTRO 0,2,3,4
252 if (ichip!=1) {
253 for (ichan=0; ichan<kNChan; ichan++) {
254
255 if (iFEC!=0 || (ichan<8 || ichan>11)) {
256
257 Ped = TMath::Nint(fMeanPed[iSM][iRCU][ibranch][iFEC][ichip][ichan]);
258 // raise Ped value to max for channels with exceptionally large RMS
259 if (fRmsPed[iSM][iRCU][ibranch][iFEC][ichip][ichan] > kBadRMS) {
260 printf(" bad pedestal RMS: iSM %d iRCU %d ibranch %d iFEC %d ichip %d ichan %d - raising from %d to 0x3ff\n",
261 iSM, iRCU, ibranch, iFEC, ichip, ichan, Ped);
262 Ped = 0x3ff;
263 }
264 //
265 int writeAddr = SRUAltroWrite | (ibranch << 16) | (iFEC << 12) | (ichip << 9) | (ichan << 5) | VFPED;
266 sprintf(scriptLine, "%08x # Branch %s, Card %d, Altro %d, Chan %d",
267 writeAddr, branchStr[ibranch], iFEC, ichip, ichan);
268 fout << scriptLine << endl;
269
270 int writeVal = Ped;
271 sprintf(scriptLine, "%08x # Pedestal 0x%x = %d",
272 writeVal, Ped, Ped);
273 fout << scriptLine << endl;
274
275 }
276 }
277 }
278 } // chip
279
280 fout.close();
281 } // iDTC
282 }// iSM
283
284 return;
285}
286
287void
288Clear()
289{
290 for (Int_t iSM=0; iSM<kNSM; iSM++) {
291 for (Int_t iRCU=0; iRCU<kNRCU; iRCU++) {
292 for (Int_t ibranch=0; ibranch<kNBranch; ibranch++) {
293 for (Int_t iFEC=0; iFEC<kNFEC; iFEC++) {
294 for (Int_t ichip=0; ichip<kNChip; ichip++) {
295 for (Int_t ichan=0; ichan<kNChan; ichan++) {
296 fMeanPed[iSM][iRCU][ibranch][iFEC][ichip][ichan] = 0;
297 fRmsPed[iSM][iRCU][ibranch][iFEC][ichip][ichan] = 0;
298 }
299 }
300 }
301 }
302 }
303 }
304
305 for (int istrip=0; istrip<kNStrips; istrip++) {
306 fHWAddrLEDRef[istrip][0] = 0;
307 fHWAddrLEDRef[istrip][1] = 0;
308 }
309
310 return;
311}
312
313void
314DecodeHWAddress(Int_t hwAddr, Int_t & branch, Int_t & FEC, Int_t & chip, Int_t & chan)
315{
316 chan = hwAddr & 0xf;
317 chip = (hwAddr >> 4) & 0x7;
318 FEC = (hwAddr >> 7) & 0xf;
319 branch = (hwAddr >> 11) & 0x1;
320 return;
321}
322
323Int_t
324GetHWAddress(Int_t iside, Int_t icol, Int_t irow, Int_t igain, Int_t & iRCU)
325{
326 iRCU = -111;
327
328 //RCU0
329 if (0<=irow&&irow<8) iRCU=0; // first cable row
330 else if (8<=irow&&irow<16 && 0<=icol&&icol<24) iRCU=0; // first half;
331 //second cable row
332 //RCU1
333 else if(8<=irow&&irow<16 && 24<=icol&&icol<48) iRCU=1; // second half;
334 //second cable row
335 else if(16<=irow&&irow<24) iRCU=1; // third cable row
336
337 // swap for odd=C side, to allow us to cable both sides the same
338 Int_t iRCUSide = iRCU;
339 if (iside == 1) {
340 iRCU = 1 - iRCU;
341 iRCUSide = iRCU + 2; // to make it map file index
342 }
343 Int_t hwAddress = fMapping[iRCUSide]->GetHWAddress(irow, icol, igain);
344
345 return hwAddress;
346}
347
348Int_t
349GetHWAddressLEDRef(Int_t istrip, Int_t igain)
350{
351 Int_t iRCU = 0; // for both sides; LED ref info is the same for both sides
352 Int_t caloflag = 3; // AliCaloRawStreamV3::kLEDMonData;
353
354 Int_t hwAddress = fHWAddrLEDRef[istrip][igain];
355
356 return hwAddress;
357}
358
359void
360GetMapping()
361{
362 TString sides[]={"A","C"};
363 // Read mapping files from $ALICE_ROOT/CALO/mapping/*.data
364 TString path = gSystem->Getenv("ALICE_ROOT");
365 path += "/EMCAL/mapping/RCU";
366 TString path2;
367 for(Int_t j = 0; j < 2; j++){ // sides
368 for(Int_t i = 0; i < 2; i++) { // RCU
369 path2 = path;
370 path2 += i;
371 path2 += sides[j];
372 path2 += ".data";
373 if (kDebug) { printf("Mapping file: %s\n",path2.Data()); }
374 fMapping[j*2 + i] = new AliCaloAltroMapping(path2.Data());
375 }
376 }
377 return;
378}
379
380void
381CreateMappingLEDRef()
382{
383 Int_t iRCU = 0; // for both sides; LED ref info is the same for both sides
384 Int_t caloflag = 3; // AliCaloRawStreamV3::kLEDMonData;
385
386 Int_t maxAddr = 1 << 7; // LED Ref FEE is in FEC pos 0, i.e. addr space 0..127
387
388 int nLEDRefFEEChan = 0;
389
390 Int_t branch = 0;
391 Int_t FEC = 0;
392 Int_t chip = 0;
393 Int_t chan = 0;
394 for (int hwaddr = 0; hwaddr<maxAddr; hwaddr++) {
395
396 DecodeHWAddress(hwaddr, branch, FEC, chip, chan);
397 if ( (chip!=1 && chip<kNChip) && // ALTROs 0,2,3,4
398 (chan<8 || chan>11) ) { // actual installed LED Ref FEE channels
399
400 int istrip = fMapping[iRCU]->GetPad(hwaddr);
401 int igain = fMapping[iRCU]->GetPadRow(hwaddr);
402 int iflag = fMapping[iRCU]->GetSector(hwaddr);
403 if (iflag == caloflag) {
404 fHWAddrLEDRef[istrip][igain] = hwaddr;
405 nLEDRefFEEChan++;
406 }
407 }
408 }
409
410 if (kDebug) { cout << " nLEDRefFEEChan " << nLEDRefFEEChan << endl; }
411}