- Adding a new group for macros
[u/mrichter/AliRoot.git] / MUON / MUONGenerateBusPatch.C
CommitLineData
36903978 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
9cf33953 16// $Id$
17
18#if !defined(__CINT__) || defined(__MAKECINT__)
19// ROOT includes
20#include <Riostream.h>
21#include <TROOT.h>
22#include <TSystem.h>
23#include <TString.h>
24
25// MUON includes
26#include "AliMpBusPatch.h"
27
28#endif
29
30// Generates buspatch id and DDL id for given detection element id
31// station 1 & 2 assuming 24 buspatches per quadrant
32// station345, reading from DetElemIdToSlatType.dat file and calculates
33// the number of bus patches per slat (and also number of Translator and Bridge Boards).
34// Generates an output file DetElemIdToBusPatch.dat.out, preserve from overwriting
35// (Ch. Finck, July 05)
36// (Nov. 05, added DDL)
37// (June 06, correction for St123)
38// (Feb. 07, add 1st manu list for St12 (starting on NB !) and new ddl sharing for station 3)
fc8c4a6f 39// (June. 07, new numbering of station 345, and buspatch starts at 1)
9cf33953 40
36903978 41
42void MUONGenerateBusPatch()
43{
6e96542a 44
36903978 45 TString dirPath2 = gSystem->Getenv("ALICE_ROOT");
46 dirPath2 += "/MUON/mapping/data/";
47
48 TString dirPath1 = dirPath2 + "station345/";
49
50 TString infile = dirPath1 + "DetElemIdToSlatType.dat";
51 TString outfile = dirPath2 + "DetElemIdToBusPatch.dat.out";
52
53 ifstream in(infile, ios::in);
54 ofstream out(outfile, ios::out);
55 char line[80];
56 char nameSlat[82];
57 Int_t idDE;
58 Int_t i;
59 Int_t cursor = 0;
9cf33953 60 Int_t begin[900];
61 Int_t end[900];
36903978 62 Int_t nbBusPatch;
36903978 63 Int_t nbTB = 0;
64 Int_t nbBB = 0;
65 Int_t idSt12[] = {100, 101, 102, 103,
66 200, 201, 202, 203,
67 300, 301, 302, 303,
68 400, 401, 402, 403};
69
f2bc136f 70 Char_t manuListSt1[]
71 = " 1,27,53,79,105,131,157,183,201,214,224,232,1025,1051,1077,1103,1129,1155,1181,1207,1225,1238,1249,1257";
72
73 Char_t manuListSt2[]
74 = " 1,27,53,79,105,131,157,183,201,214,226,246,1025,1051,1077,1103,1129,1155,1181,1207,1225,1238,1251,1269";
75
f2bc136f 76
36903978 77
78 Int_t iDDL = 0;
79 // station 1 & 2
0a69c1eb 80 nbBusPatch = 24;
f2bc136f 81 Int_t nbHalfBusPatch = nbBusPatch/2;
36903978 82 cout << "#DE BusPatch DDL SlatName" << endl;
f2bc136f 83 out << "#DE BusPatch DDL 1st manu in buspatch" << endl;
36903978 84
85 for (Int_t j = 0; j < 16; j++) {
86
87 idDE = idSt12[j];
88 if (idDE % 100 == 0) {
42c7b335 89 iDDL++;
fc8c4a6f 90 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1);
36903978 91 cout << "# Chamber " << idDE/100 << endl;
92 out << "# Chamber " << idDE/100 << endl;
93 }
42c7b335 94 if (idDE % 100 == 1) {
95 iDDL++;
fc8c4a6f 96 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1);
42c7b335 97 }
f2bc136f 98
42c7b335 99 if (idDE % 100 == 3) {
100 iDDL--;
fc8c4a6f 101 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1) + nbBusPatch;
42c7b335 102 }
f2bc136f 103
36903978 104 end[cursor] = begin[cursor] + nbBusPatch - 1;
9cf33953 105 ++cursor; // it seems that vec[++i] does not work in Cint
106 begin[cursor] = end[cursor-1] + 1;
36903978 107
f2bc136f 108 cout << idDE << " " << begin[cursor-1] + nbHalfBusPatch << "-" <<end[cursor-1] << ";" <<
109 begin[cursor-1] << "-" << end[cursor-1] - nbHalfBusPatch << " " << iDDL-1 << endl;
110
111 if (idDE < 300 )
112 out << idDE << " " << begin[cursor-1] + nbHalfBusPatch << "-" <<end[cursor-1] << ";" <<
113 begin[cursor-1] << "-" << end[cursor-1] - nbHalfBusPatch << " " << iDDL-1 <<
114 manuListSt1 << endl;
115 else
116 out << idDE << " " << begin[cursor-1] + nbHalfBusPatch << "-" <<end[cursor-1] << ";" <<
117 begin[cursor-1] << "-" << end[cursor-1] - nbHalfBusPatch << " " << iDDL-1 <<
118 manuListSt2 << endl;
42c7b335 119 if (idDE % 100 == 3) iDDL++;
120
36903978 121 }
122
123 // station 345
124 nbBusPatch = 0;
fc8c4a6f 125 Int_t idCh5swp1 = 501; // 1/4 chamber for DDL on horizontal
126 Int_t idCh5swp2 = 505; // 1/4 chamber for DDL on horizontal
127 Int_t idCh5swp3 = 510; // 1/4 chamber for DDL on horizontal
128 Int_t idCh5swp4 = 514; // 1/4 chamber for DDL on horizontal
129
130 Int_t idCh6swp1 = 600; // 1/4 chamber for DDL on horizontal
131 Int_t idCh6swp2 = 605; // 1/4 chamber for DDL on horizontal
132 Int_t idCh6swp3 = 609; // 1/4 chamber for DDL on horizontal
133 Int_t idCh6swp4 = 614; // 1/4 chamber for DDL on horizontal
42c7b335 134
fc8c4a6f 135 Int_t idSt45swp1 = 7; // half chamber for DDL in vertical cutting twice the official numbering
136 Int_t idSt45swp2 = 20;
137
138 Int_t offsetBusCh5swp1 = 13; // number of buspatches between DE 501-504
139 Int_t offsetBusCh5swp2 = 17; // number of buspatches before DE 510
42c7b335 140
fc8c4a6f 141 Int_t offsetBusCh6swp1 = 17; // number of buspatches before DE 600-604
142 Int_t offsetBusCh6swp2 = 13; // number of buspatches between DE 614-617
42c7b335 143
fc8c4a6f 144 Int_t offsetBusSt4 = 25; // number of buspatches before DE 700-800
145 Int_t offsetBusSt4swp = 46; // number of buspatches between 801-806 (701-706)
42c7b335 146
fc8c4a6f 147 Int_t offsetBusSt5 = 27; // number of buspatches before DE 900-1000
148 Int_t offsetBusSt5swp = 50; // number of buspatches between 901-906 (1001-1006)
f2bc136f 149
42c7b335 150 // reads from file
36903978 151 while ( in.getline(line,80) ) {
152
153 if ( line[0] == '#' || line[0] == '\0' ) continue;
154 i = 0;
155 sscanf(line, "%d %s", &idDE, nameSlat);
156
157 // number of PCB's
158 while(nameSlat[i] < '4' && nameSlat[i] !='0') i++;
159 Int_t len = strlen(nameSlat);
160
161 // number of buspatch
162 if (i == 2 || i == 3)
163 nbBusPatch = 2;
164 else
165 nbBusPatch = 4;
166
167 // calculate the number of TB & BB
168 // R1: 2 bridges more per PCB
169 // R2 & R3: 1 translator more per PCB
170 if (i == 2) nbBB += 2;
171 if (i == 3) nbBB += 4;
172 if (i == 4) nbBB += 4;
173 if (i == 5) nbBB += 6;
174 if (i == 6) nbBB += 8;
175
176 nbTB += nbBusPatch;
08ce37ff 177 if (nameSlat[len-1] == '1') {
42c7b335 178 nbTB += 2;
179 nbBusPatch+=2;
08ce37ff 180 }
0a69c1eb 181 if (nameSlat[len-1] == '2' || nameSlat[len-1] == '3') {
36903978 182 nbTB += 1;
0a69c1eb 183 nbBusPatch++;
184 }
42c7b335 185
186 // station 3
187 // for buspatch length reasons, one ddl connects one 1/4 of two chambers
188 // really messy isn't it ?
f2bc136f 189 // much more with the new DDL sharing for station 3
42c7b335 190
191 if (idDE < 700 ) {
fc8c4a6f 192
42c7b335 193 if (idDE % 100 == 0) {
194 cout << "# Chamber " << idDE/100 << endl;
195 out << "# Chamber " << idDE/100 << endl;
196 }
197
fc8c4a6f 198 // chamber 5
199 if (idDE == 500 ) {
200 iDDL = (idDE/100)*2+2;
201 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1);
202
203 end[cursor] = begin[cursor] + nbBusPatch - 1;
204 ++cursor;
205 begin[cursor] = end[cursor-1] + 1;
206
207 cout << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
208 out << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] <<" " << iDDL-1 <<endl;
f2bc136f 209 }
fc8c4a6f 210
211 if (idDE >= idCh5swp1 && idDE < idCh5swp2) {
212
213 if ( idDE == idCh5swp1) {
214 iDDL = (idDE/100)*2 ;
215 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusCh5swp1, iDDL-1);
216 }
217
218 end[cursor] = begin[cursor] - nbBusPatch + 1;
219 ++cursor;
220 begin[cursor] = end[cursor-1] - 1;
221
222 cout << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
223 out << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 224 }
225
fc8c4a6f 226 if (idDE >= idCh5swp2 && idDE < idCh5swp3) {
227
228 if (idDE == idCh5swp2) {
229 iDDL = (idDE/100)*2-1;
230 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1);
231 }
232
233 end[cursor] = begin[cursor] + nbBusPatch - 1;
234 ++cursor;
235 begin[cursor] = end[cursor-1] + 1;
236
237 cout << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
238 out << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 239 }
fc8c4a6f 240
241 if (idDE >= idCh5swp3 && idDE < idCh5swp4) {
242
243 if (idDE == idCh5swp3) {
244 iDDL = (idDE/100)*2+1;
245 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1);
246 }
247
248 end[cursor] = begin[cursor] + nbBusPatch - 1;
249 ++cursor;
250 begin[cursor] = end[cursor-1] + 1;
251
252 cout << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
253 out << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 254 }
42c7b335 255
fc8c4a6f 256 if (idDE >= idCh5swp4 && idDE < 600) {
257
258 if ( idDE == idCh5swp4) {
259 iDDL = (idDE/100)*2+2 ;
260 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusCh5swp2, iDDL-1);
261 }
262
263 end[cursor] = begin[cursor] - nbBusPatch + 1;
264 ++cursor;
265 begin[cursor] = end[cursor-1] - 1;
266
267 cout << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
268 out << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 269 }
fc8c4a6f 270
271 // chamber 6
272 if (idDE >= idCh6swp1 && idDE < idCh6swp2) {
273
274 if ( idDE == idCh6swp1) {
275 iDDL = (idDE/100)*2-2 ;
276 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusCh5swp1+offsetBusCh6swp1, iDDL-1);
277 }
278
279 end[cursor] = begin[cursor] - nbBusPatch + 1;
280 ++cursor;
281 begin[cursor] = end[cursor-1] - 1;
282
283 cout << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
284 out << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 285 }
42c7b335 286
fc8c4a6f 287 if (idDE >= idCh6swp2 && idDE < idCh6swp3) {
288
289 if (idDE == idCh6swp2) {
290 iDDL = (idDE/100)*2-3;
291 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusCh5swp2+1, iDDL-1);
292 }
293
294 end[cursor] = begin[cursor] + nbBusPatch - 1;
295 ++cursor;
296 begin[cursor] = end[cursor-1] + 1;
42c7b335 297
fc8c4a6f 298 cout << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
299 out << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 300 }
42c7b335 301
fc8c4a6f 302 if (idDE >= idCh6swp3 && idDE < idCh6swp4) {
303
304 if (idDE == idCh6swp3) {
305 iDDL = (idDE/100)*2-1;
306 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusCh5swp1+1, iDDL-1);
307 }
308
309 end[cursor] = begin[cursor] + nbBusPatch - 1;
310 ++cursor;
311 begin[cursor] = end[cursor-1] + 1;
312
313 cout << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
314 out << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 315 }
316
fc8c4a6f 317 if (idDE >= idCh6swp4 && idDE < 700) {
318
319 if ( idDE == idCh6swp4) {
320 iDDL = (idDE/100)*2 ;
321 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusCh5swp2+offsetBusCh6swp2, iDDL-1);
322 }
323
324 end[cursor] = begin[cursor] - nbBusPatch + 1;
325 ++cursor;
326 begin[cursor] = end[cursor-1] - 1;
327
328 cout << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
329 out << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] <<" " << iDDL-1 <<endl;
330 }
42c7b335 331
42c7b335 332 }
fc8c4a6f 333
42c7b335 334 // station 4 & 5
335 // back to normal one ddl connects one 1/2 chamber
336 // finally !
fc8c4a6f 337
42c7b335 338 if (idDE >= 700) {
339
fc8c4a6f 340 if (idDE % 100 == 0) {
341 cout << "# Chamber " << idDE/100 << endl;
342 out << "# Chamber " << idDE/100 << endl;
42c7b335 343 }
fc8c4a6f 344
345 if ((idDE % 100) >= idSt45swp1 && (idDE % 100) < idSt45swp2) {
346 if ((idDE % 100) == idSt45swp1) {
347 iDDL = (idDE/100)*2-1;
348 begin[cursor] = AliMpBusPatch::GetGlobalBusID(1, iDDL-1);
349 }
350 end[cursor] = begin[cursor] + nbBusPatch - 1;
351 ++cursor;
352 begin[cursor] = end[cursor-1] + 1;
353
354 cout << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
355 out << idDE << " " << begin[cursor-1]<<"-"<<end[cursor-1] <<" " << iDDL-1 <<endl;
42c7b335 356 }
9cf33953 357
fc8c4a6f 358 if (idDE % 100 >= idSt45swp2) {
36903978 359
fc8c4a6f 360 if ((idDE % 100) == idSt45swp2 ) {
361 iDDL = (idDE/100)*2 ;
362 if (idDE/100 == 7 || idDE/100 == 8)
363 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusSt4swp, iDDL-1);
364 else
365 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusSt5swp, iDDL-1);
366
367 }
368 end[cursor] = begin[cursor] - nbBusPatch + 1;
369 ++cursor;
370 begin[cursor] = end[cursor-1] - 1;
371
372 cout << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
373 out << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] <<" " << iDDL-1 <<endl;
374 }
375
376 if ((idDE % 100) >= 0 && (idDE % 100) < idSt45swp1) {
377
378 if ((idDE % 100) == 0 ) {
379 iDDL = (idDE/100)*2;
380 if (idDE/100 == 7 || idDE/100 == 8)
381 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusSt4, iDDL-1);
382 else
383 begin[cursor] = AliMpBusPatch::GetGlobalBusID(offsetBusSt5, iDDL-1);
384
385 }
386 end[cursor] = begin[cursor] - nbBusPatch + 1;
387 ++cursor;
388 begin[cursor] = end[cursor-1] - 1;
389
390 cout << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] << " " << iDDL-1 << " " <<nameSlat <<endl;
391 out << idDE << " " << end[cursor-1]<<"-"<<begin[cursor-1] <<" " << iDDL-1 <<endl;
392 }
393
42c7b335 394 }
36903978 395
36903978 396 }
397 printf(" Slat: number of TB %d and BB %d\n", nbTB, nbBB);
398 in.close();
399 out.close();
400}