1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 ////////////////////////////////////////////////////////////
17 // Factory for muon chambers, segmentations and response //
18 ////////////////////////////////////////////////////////////
22 #include "AliMUONFactoryV2.h"
27 #include "AliMUONConstants.h"
28 #include "AliMUONTriggerConstants.h"
29 #include "AliMUONChamber.h"
30 #include "AliMUONResponseV0.h"
31 #include "AliMUONGeometryModule.h"
32 #include "AliMUONGeometryStore.h"
33 #include "AliMUONGeometrySegmentation.h"
34 #include "AliMUONVGeometryDEIndexing.h"
35 #include "AliMUONSt12QuadrantSegmentation.h"
36 #include "AliMUONSt345SlatSegmentation.h"
37 #include "AliMUONTriggerSegmentation.h"
38 #include "AliMUONResponseTrigger.h"
40 ClassImp(AliMUONFactoryV2)
42 //__________________________________________________________________________
43 AliMUONFactoryV2::AliMUONFactoryV2(const char* name)
49 // FactoryV2 inherite from Factory for switching in AliMUONv1::Init()
50 // to be changed when old segmentation will be removed.
52 fDESegmentations = new TObjArray();
53 fDESegmentations->SetOwner(kTRUE);
56 //__________________________________________________________________________
57 AliMUONFactoryV2::AliMUONFactoryV2()
63 // Default constructor
66 //__________________________________________________________________________
67 AliMUONFactoryV2::AliMUONFactoryV2(const AliMUONFactoryV2& rhs)
70 // Protected copy constructor
72 AliFatal("Not implemented.");
75 //__________________________________________________________________________
77 AliMUONFactoryV2::~AliMUONFactoryV2()
81 delete fDESegmentations;
84 //__________________________________________________________________________
85 AliMUONFactoryV2& AliMUONFactoryV2::operator=(const AliMUONFactoryV2& rhs)
87 // Protected assignement operator
89 if (this == &rhs) return *this;
91 AliFatal("Not implemented.");
96 //__________________________________________________________________________
97 Bool_t AliMUONFactoryV2::IsGeometryDefined(Int_t ichamber)
99 // Return true, if det elements for the chamber with the given ichamber Id
100 // are defined in geometry (the geometry builder for this chamber was activated)
103 ! fMUON->Chamber(ichamber).GetGeometry() ||
104 ! fMUON->Chamber(ichamber).GetGeometry()->GetDEIndexing() ||
105 ! fMUON->Chamber(ichamber).GetGeometry()->GetDEIndexing()->GetNofDetElements() )
112 //__________________________________________________________________________
113 void AliMUONFactoryV2::BuildCommon()
116 // Construct the default response.
119 // Default response: 5 mm of gas
120 fResponse0 = new AliMUONResponseV0;
121 fResponse0->SetSqrtKx3AndDeriveKx2Kx4(0.7131); // sqrt(0.5085)
122 fResponse0->SetSqrtKy3AndDeriveKy2Ky4(0.7642); // sqrt(0.5840)
123 fResponse0->SetPitch(AliMUONConstants::Pitch()); // anode-cathode distance
124 fResponse0->SetSigmaIntegration(10.);
125 fResponse0->SetChargeSlope(10);
126 fResponse0->SetChargeSpread(0.18, 0.18);
127 fResponse0->SetMaxAdc(4096);
128 fResponse0->SetSaturation(3000);
129 fResponse0->SetZeroSuppression(6);
132 //__________________________________________________________________________
133 void AliMUONFactoryV2::BuildStation1()
135 //--------------------------------------------------------
136 // Configuration for Chamber TC1/2 (Station 1) ----------
137 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
140 // Response for 4 mm of gas (station 1)
141 // automatic consistency with width of sensitive medium in CreateGeometry ????
142 AliMUONResponseV0* responseSt1 = new AliMUONResponseV0;
143 // Mathieson parameters from L.Kharmandarian's thesis, page 190
144 responseSt1->SetSqrtKx3AndDeriveKx2Kx4(0.7000); // sqrt(0.4900)
145 responseSt1->SetSqrtKy3AndDeriveKy2Ky4(0.7550); // sqrt(0.5700)
146 responseSt1->SetPitch(AliMUONConstants::PitchSt1()); // anode-cathode distance
147 responseSt1->SetSigmaIntegration(10.);
148 // ChargeSlope larger to compensate for the smaller anode-cathode distance
149 // and keep the same most probable ADC channel for mip's
150 responseSt1->SetChargeSlope(62.5);
151 // assumed proportionality to anode-cathode distance for ChargeSpread
152 responseSt1->SetChargeSpread(0.144, 0.144);
153 responseSt1->SetMaxAdc(4096);
154 responseSt1->SetSaturation(3000);
155 responseSt1->SetZeroSuppression(6);
157 // Quadrant segmentations:
158 AliMUONSt12QuadrantSegmentation* bendSt1
159 = new AliMUONSt12QuadrantSegmentation(kStation1, kBendingPlane);
160 AliMUONSt12QuadrantSegmentation* nonbendSt1
161 = new AliMUONSt12QuadrantSegmentation(kStation1, kNonBendingPlane);
163 // Add in the array (for safe deleting)
164 fDESegmentations->Add(bendSt1);
165 fDESegmentations->Add(nonbendSt1);
167 AliMUONGeometrySegmentation* segmentation[2];
169 for (Int_t chamber = 0; chamber < 2; chamber++) {
171 segmentation[0] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
172 segmentation[1] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
174 // id detection elt for chamber 1
175 Int_t id0 = (chamber+1)*100;
177 //--------------------------------------------------------
178 // Configuration for Chamber TC1/2 (Station 1) ----------
181 fMUON->SetNsec(chamber,2);
184 segmentation[0]->Add(id0, bendSt1);
185 segmentation[0]->Add(id0 + 3, nonbendSt1);
186 segmentation[0]->Add(id0 + 2, bendSt1);
187 segmentation[0]->Add(id0 + 1, nonbendSt1);
188 fMUON->SetSegmentationModel(chamber, 1, segmentation[0]);
191 segmentation[1]->Add(id0, nonbendSt1);
192 segmentation[1]->Add(id0 + 3, bendSt1);
193 segmentation[1]->Add(id0 + 2, nonbendSt1);
194 segmentation[1]->Add(id0 + 1, bendSt1);
195 fMUON->SetSegmentationModel(chamber, 2, segmentation[1]);
197 fMUON->SetResponseModel(chamber, responseSt1); // special response
198 fMUON->Chamber(chamber).SetChargeCorrel(0.11); // 11% charge spread
203 //__________________________________________________________________________
204 void AliMUONFactoryV2::BuildStation2()
207 //--------------------------------------------------------
208 // Configuration for Chamber TC3/4 (Station 2) -----------
209 ///^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
212 // Quadrant segmentations:
213 AliMUONSt12QuadrantSegmentation* bendSt2
214 = new AliMUONSt12QuadrantSegmentation(kStation2, kBendingPlane);
215 AliMUONSt12QuadrantSegmentation* nonbendSt2
216 = new AliMUONSt12QuadrantSegmentation(kStation2, kNonBendingPlane);
218 // Add in the array (for safe deleting)
219 fDESegmentations->Add(bendSt2);
220 fDESegmentations->Add(nonbendSt2);
222 AliMUONGeometrySegmentation* segmentation[2];
224 for (Int_t chamber = 2; chamber < 4; chamber++) {
226 segmentation[0] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
227 segmentation[1] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
229 // id detection elt for chamber 1
230 Int_t id0 = (chamber+1)*100;
232 //--------------------------------------------------------
233 // Configuration for Chamber TC3/4 (Station 2) ----------
236 fMUON->SetNsec(chamber,2);
239 segmentation[0]->Add(id0, bendSt2);
240 segmentation[0]->Add(id0 + 3, nonbendSt2);
241 segmentation[0]->Add(id0 + 2, bendSt2);
242 segmentation[0]->Add(id0 + 1, nonbendSt2);
243 fMUON->SetSegmentationModel(chamber, 1, segmentation[0]);
246 segmentation[1]->Add(id0, nonbendSt2);
247 segmentation[1]->Add(id0 + 3, bendSt2);
248 segmentation[1]->Add(id0 + 2, nonbendSt2);
249 segmentation[1]->Add(id0 + 1, bendSt2);
250 fMUON->SetSegmentationModel(chamber, 2, segmentation[1]);
252 fMUON->SetResponseModel(chamber, fResponse0); // normal response
253 fMUON->Chamber(chamber).SetChargeCorrel(0.11); // 11% charge spread
259 //__________________________________________________________________________
260 void AliMUONFactoryV2::BuildStation3()
262 //--------------------------------------------------------
263 // Configuration for Chamber TC5/6 (Station 3) ----------
264 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
266 AliMUONGeometrySegmentation* segmentation[2];
268 //Slats Segmentations
269 AliMUONSt345SlatSegmentation *slatsegB[4]; // Types of segmentation for St3
270 AliMUONSt345SlatSegmentation *slatsegNB[4];
273 Int_t ndiv[4] ={ 4, 4, 2, 1}; // densities zones
274 for(Int_t i=0; i<4; i++) {
275 slatsegB[i] = new AliMUONSt345SlatSegmentation(1);
276 fDESegmentations->Add(slatsegB[i]);
277 slatsegB[i]->SetPadSize(10.,0.5);
278 slatsegB[i]->SetPadDivision(ndiv);
279 slatsegB[i]->SetId(1); // Id elt ????
280 slatsegB[i]->SetDAnod(AliMUONConstants::Pitch());
281 slatsegNB[i] = new AliMUONSt345SlatSegmentation(0);
282 fDESegmentations->Add(slatsegNB[i]);
283 slatsegNB[i]->SetPadSize(1./1.4,10.); // Nbending
284 slatsegNB[i]->SetPadDivision(ndiv);
285 slatsegNB[i]->SetId(1);
286 slatsegNB[i]->SetDAnod(AliMUONConstants::Pitch());
289 // Type 112200 for 500, 501, 508, 509, 510, 517
290 // in Ch5 (similar for Ch6) for the futur official numbering
291 // Type 112200 for 503, 504, 505, 555, 554, 553
292 // in Ch5 (similar for Ch6) actual numbering in the code to be changed in jan05
293 Int_t n0[4] = { 0, 2, 2, 0 };
294 slatsegB[0]->SetPcbBoards(n0);
295 slatsegB[0]->Init(0);
296 slatsegNB[0]->SetPcbBoards(n0);
297 slatsegNB[0]->Init(0);
299 // Type 122200 for 502, 507, 511, 516 (similar in Ch6)
300 // for future official numbering of ALICE
301 // Type 122200 for 502, 506, 556, 552 (similiarin Ch6)
302 // for actual numbering in muon code to be changed in jan05
303 Int_t n1[4] = { 0, 1, 3, 0 };
304 slatsegB[1]->SetPcbBoards(n1);
305 slatsegB[1]->Init(0);
306 slatsegNB[1]->SetPcbBoards(n1);
307 slatsegNB[1]->Init(0);
309 // Type 222000 for 503, 506, 512, 515 (similar in Ch6)
310 // for future official numbering of ALICE
311 // Type 222000 for 501, 507, 557, 551 (similiarin Ch6)
312 // for actual numbering in muon code to be changed in jan05
313 Int_t n2[4] = { 0, 0, 3, 0 };
314 slatsegB[2]->SetPcbBoards(n2);
315 slatsegB[2]->Init(0);
316 slatsegNB[2]->SetPcbBoards(n2);
317 slatsegNB[2]->Init(0);
319 // Type 220000 for 504, 505, 513, 514 (similar in Ch6)
320 // for future official numbering of ALICE
321 // Type 220000 for 500, 508, 558, 550 (similiarin Ch6)
322 // for actual numbering in muon code to be changed in jan05
323 Int_t n3[4] = { 0, 0, 2, 0 };
324 slatsegB[3]->SetPcbBoards(n3);
325 slatsegB[3]->Init(0);
326 slatsegNB[3]->SetPcbBoards(n3);
327 slatsegNB[3]->Init(0);
329 for (Int_t chamber = 4; chamber < 6; chamber++) {
331 segmentation[0] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
332 segmentation[1] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
334 // id detection elt for chamber 1
335 Int_t id0 = (chamber+1)*100;
337 fMUON->SetNsec(chamber,2);
341 segmentation[0]->Add(id0+14, slatsegB[3]);
342 segmentation[0]->Add(id0+ 4, slatsegB[3]);
343 segmentation[0]->Add(id0+13, slatsegB[3]);
344 segmentation[0]->Add(id0+ 5, slatsegB[3]);
346 segmentation[0]->Add(id0+15, slatsegB[2]);
347 segmentation[0]->Add(id0+ 3, slatsegB[2]);
348 segmentation[0]->Add(id0+12, slatsegB[2]);
349 segmentation[0]->Add(id0+ 6, slatsegB[2]);
351 segmentation[0]->Add(id0+16, slatsegB[1]);
352 segmentation[0]->Add(id0+ 2, slatsegB[1]);
353 segmentation[0]->Add(id0+11, slatsegB[1]);
354 segmentation[0]->Add(id0+ 7, slatsegB[1]);
356 segmentation[0]->Add(id0+17, slatsegB[0]);
357 segmentation[0]->Add(id0, slatsegB[0]);
358 segmentation[0]->Add(id0+ 1, slatsegB[0]);
359 segmentation[0]->Add(id0+10, slatsegB[0]);
360 segmentation[0]->Add(id0+ 9, slatsegB[0]);
361 segmentation[0]->Add(id0+ 8, slatsegB[0]);
362 fMUON->SetSegmentationModel(chamber, 1, segmentation[0]);
366 segmentation[1]->Add(id0+14, slatsegNB[3]);
367 segmentation[1]->Add(id0+ 4, slatsegNB[3]);
368 segmentation[1]->Add(id0+13, slatsegNB[3]);
369 segmentation[1]->Add(id0+ 5, slatsegNB[3]);
371 segmentation[1]->Add(id0+15, slatsegNB[2]);
372 segmentation[1]->Add(id0+ 3, slatsegNB[2]);
373 segmentation[1]->Add(id0+12, slatsegNB[2]);
374 segmentation[1]->Add(id0+ 6, slatsegNB[2]);
376 segmentation[1]->Add(id0+16, slatsegNB[1]);
377 segmentation[1]->Add(id0+ 2, slatsegNB[1]);
378 segmentation[1]->Add(id0+11, slatsegNB[1]);
379 segmentation[1]->Add(id0+ 7, slatsegNB[1]);
381 segmentation[1]->Add(id0+17, slatsegNB[0]);
382 segmentation[1]->Add(id0, slatsegNB[0]);
383 segmentation[1]->Add(id0+ 1, slatsegNB[0]);
384 segmentation[1]->Add(id0+10, slatsegNB[0]);
385 segmentation[1]->Add(id0+ 9, slatsegNB[0]);
386 segmentation[1]->Add(id0+ 8, slatsegNB[0]);
387 fMUON->SetSegmentationModel(chamber, 2, segmentation[1]);
389 fMUON->SetResponseModel(chamber, fResponse0);
390 fMUON->Chamber(chamber).SetChargeCorrel(0.11); // 11% charge spread
394 //__________________________________________________________________________
395 void AliMUONFactoryV2::BuildStation4()
397 //--------------------------------------------------------
398 // Configuration for Chamber TC7/8 (Station 4) ----------
399 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
402 AliMUONGeometrySegmentation* segmentation[2];
404 //Slats Segmentations
405 AliMUONSt345SlatSegmentation *slatsegB[7]; // Types of segmentation for St4
406 AliMUONSt345SlatSegmentation *slatsegNB[7];
409 Int_t ndiv[4] ={ 4, 4, 2, 1}; // densities zones
410 for(Int_t i = 0; i < 7; i++) {
411 slatsegB[i] = new AliMUONSt345SlatSegmentation(1);
412 fDESegmentations->Add(slatsegB[i]);
413 slatsegB[i]->SetPadSize(10.,0.5);
414 slatsegB[i]->SetPadDivision(ndiv);
415 slatsegB[i]->SetId(1);
416 slatsegB[i]->SetDAnod(AliMUONConstants::Pitch());
417 slatsegNB[i] = new AliMUONSt345SlatSegmentation(0);
418 fDESegmentations->Add(slatsegNB[i]);
419 slatsegNB[i]->SetPadSize(1./1.4,10.);
420 slatsegNB[i]->SetPadDivision(ndiv);
421 slatsegNB[i]->SetId(1);
422 slatsegNB[i]->SetDAnod(AliMUONConstants::Pitch());
425 Int_t n4[4] = { 0, 1, 2, 2 };
426 slatsegB[0]->SetPcbBoards(n4);
427 slatsegB[0]->Init(0); // 0 detection element id
428 slatsegNB[0]->SetPcbBoards(n4);
429 slatsegNB[0]->Init(0); // 0 detection element id
431 // Type 112233 for 701, 712, 714, 725 in Ch7 (similar for Ch8)
432 // for the futur official numbering
433 // Type 112233 for 705, 707, 755, 757 in Ch7 (similar for Ch8)
434 // actual numbering in the code to be changed in jan05
435 // Type 112233 for 901, 902, 911, 912, 914, 915, 924, 925 in Ch9
436 // (similar for Ch10) for the futur official numbering
437 // Type 112233 for 904, 905, 907, 908, 954, 955, 957, 958 in Ch9
438 // (similar for Ch10) actual numbering in the code to be changed in jan05
439 Int_t n5[4] = { 0, 2, 2, 2 };
440 slatsegB[1]->SetPcbBoards(n5);
441 slatsegB[1]->Init(0); // 0 detection element id
442 slatsegNB[1]->SetPcbBoards(n5);
443 slatsegNB[1]->Init(0); // 0 detection element id
445 // Type 112230 for 702, 711, 715, 724 in Ch7 (similar for Ch8)
446 // for the futur official numbering
447 // Type 112230 for 704, 708, 754, 758 in Ch7 (similar for Ch8)
448 // actual numbering in the code to be changed in jan05
449 Int_t n6[4] = { 0, 2, 2, 1 };
450 slatsegB[2]->SetPcbBoards(n6);
451 slatsegB[2]->Init(0); // 0 detection element id
452 slatsegNB[2]->SetPcbBoards(n6);
453 slatsegNB[2]->Init(0); // 0 detection element id
455 // Type 222330 for 703, 710, 716, 723 in Ch7 (similar for Ch8)
456 // for the futur official numbering
457 // Type 222330 for 703, 709, 753, 759 in Ch7 (similar for Ch8)
458 // actual numbering in the code to be changed in jan05
459 Int_t n7[4] = { 0, 0, 3, 2 };
460 slatsegB[3]->SetPcbBoards(n7);
461 slatsegB[3]->Init(0); // 0 detection element id
462 slatsegNB[3]->SetPcbBoards(n7);
463 slatsegNB[3]->Init(0); // 0 detection element id
465 // Type 223300 for 704, 709, 717, 722 in Ch7 (similar for Ch8)
466 // for the futur official numbering
467 // Type 223300 for 702, 710, 752, 760 in Ch7 (similar for Ch8)
468 // actual numbering in the code to be changed in jan05
469 Int_t n8[4] = { 0, 0, 2, 2 };
470 slatsegB[4]->SetPcbBoards(n8);
471 slatsegB[4]->Init(0); // 0 detection element id
472 slatsegNB[4]->SetPcbBoards(n8);
473 slatsegNB[4]->Init(0); // 0 detection element id
475 // Type 333000 for 705, 708, 718, 721 in Ch7 (similar for Ch8)
476 // for the futur official numbering
477 // Type 333000 for 701, 711, 751, 761 in Ch7 (similar for Ch8)
478 // actual numbering in the code to be changed in jan05
479 // Type 333000 for 906, 907, 919, 920 in Ch9 (similar for Ch10)
480 // for the futur official numbering
481 // Type 333000 for 900, 912, 950, 962 in Ch9 (similar for Ch10)
482 // actual numbering in the code to be changed in jan05
483 Int_t n9[4] = { 0, 0, 0, 3 };
484 slatsegB[5]->SetPcbBoards(n9);
485 slatsegB[5]->Init(0); // 0 detection element id
486 slatsegNB[5]->SetPcbBoards(n9);
487 slatsegNB[5]->Init(0); // 0 detection element id
489 // Type 330000 for 706, 707, 719, 720 in Ch7 (similar for Ch8)
490 // for the futur official numbering
491 // Type 330000 for 700, 712, 750, 762 in Ch7 (similar for Ch8)
492 // actual numbering in the code to be changed in jan05
493 Int_t n10[4] = { 0, 0, 0, 2 };
494 slatsegB[6]->SetPcbBoards(n10);
495 slatsegB[6]->Init(0); // 0 detection element id
496 slatsegNB[6]->SetPcbBoards(n10);
497 slatsegNB[6]->Init(0); // 0 detection element id
500 for (Int_t chamber = 6; chamber < 8; chamber++) {
502 segmentation[0] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
503 segmentation[1] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
505 // id detection elt for chamber 1
506 Int_t id0 = (chamber+1)*100;
508 //--------------------------------------------------------
509 // Configuration for Chamber TC6/7 (Station 4) ----------
512 fMUON->SetNsec(chamber,2);
516 segmentation[0]->Add(id0+13, slatsegB[0]);
517 segmentation[0]->Add(id0 , slatsegB[0]);
520 segmentation[0]->Add(id0+14, slatsegB[1]);
521 segmentation[0]->Add(id0+12, slatsegB[1]);
522 segmentation[0]->Add(id0+25, slatsegB[1]);
523 segmentation[0]->Add(id0+ 1, slatsegB[1]);
526 segmentation[0]->Add(id0+15, slatsegB[2]);
527 segmentation[0]->Add(id0+11, slatsegB[2]);
528 segmentation[0]->Add(id0+24, slatsegB[2]);
529 segmentation[0]->Add(id0+ 2, slatsegB[2]);
532 segmentation[0]->Add(id0+16, slatsegB[3]);
533 segmentation[0]->Add(id0+10, slatsegB[3]);
534 segmentation[0]->Add(id0+23, slatsegB[3]);
535 segmentation[0]->Add(id0+ 3, slatsegB[3]);
538 segmentation[0]->Add(id0+17, slatsegB[4]);
539 segmentation[0]->Add(id0+ 9, slatsegB[4]);
540 segmentation[0]->Add(id0+22, slatsegB[4]);
541 segmentation[0]->Add(id0+ 4, slatsegB[4]);
544 segmentation[0]->Add(id0+18, slatsegB[5]);
545 segmentation[0]->Add(id0+ 8, slatsegB[5]);
546 segmentation[0]->Add(id0+21, slatsegB[5]);
547 segmentation[0]->Add(id0+ 5, slatsegB[5]);
550 segmentation[0]->Add(id0+19, slatsegB[6]);
551 segmentation[0]->Add(id0+ 7, slatsegB[6]);
552 segmentation[0]->Add(id0+20, slatsegB[6]);
553 segmentation[0]->Add(id0+ 6, slatsegB[6]);
554 fMUON->SetSegmentationModel(chamber, 1, segmentation[0]);
558 segmentation[1]->Add(id0+13, slatsegNB[0]);
559 segmentation[1]->Add(id0 , slatsegNB[0]);
562 segmentation[1]->Add(id0+14, slatsegNB[1]);
563 segmentation[1]->Add(id0+12, slatsegNB[1]);
564 segmentation[1]->Add(id0+25, slatsegNB[1]);
565 segmentation[1]->Add(id0+ 1, slatsegNB[1]);
568 segmentation[1]->Add(id0+15, slatsegNB[2]);
569 segmentation[1]->Add(id0+11, slatsegNB[2]);
570 segmentation[1]->Add(id0+24, slatsegNB[2]);
571 segmentation[1]->Add(id0+ 2, slatsegNB[2]);
574 segmentation[1]->Add(id0+16, slatsegNB[3]);
575 segmentation[1]->Add(id0+10, slatsegNB[3]);
576 segmentation[1]->Add(id0+23, slatsegNB[3]);
577 segmentation[1]->Add(id0+ 3, slatsegNB[3]);
580 segmentation[1]->Add(id0+17, slatsegNB[4]);
581 segmentation[1]->Add(id0+ 9, slatsegNB[4]);
582 segmentation[1]->Add(id0+22, slatsegNB[4]);
583 segmentation[1]->Add(id0+ 4, slatsegNB[4]);
586 segmentation[1]->Add(id0+18, slatsegNB[5]);
587 segmentation[1]->Add(id0+ 8, slatsegNB[5]);
588 segmentation[1]->Add(id0+21, slatsegNB[5]);
589 segmentation[1]->Add(id0+ 5, slatsegNB[5]);
592 segmentation[1]->Add(id0+19, slatsegNB[6]);
593 segmentation[1]->Add(id0+ 7, slatsegNB[6]);
594 segmentation[1]->Add(id0+20, slatsegNB[6]);
595 segmentation[1]->Add(id0+ 6, slatsegNB[6]);
596 fMUON->SetSegmentationModel(chamber, 2, segmentation[1]);
598 fMUON->SetResponseModel(chamber, fResponse0);
599 fMUON->Chamber(chamber).SetChargeCorrel(0.11); // 11% charge spread
603 //__________________________________________________________________________
604 void AliMUONFactoryV2::BuildStation5()
606 //--------------------------------------------------------
607 // Configuration for Chamber TC9/10 (Station 5) ---------
608 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
610 AliMUONGeometrySegmentation* segmentation[2];
612 //Slats Segmentations
613 AliMUONSt345SlatSegmentation *slatsegB[6]; // Types of segmentation for St5
614 AliMUONSt345SlatSegmentation *slatsegNB[6];
617 Int_t ndiv[4] ={ 4, 4, 2, 1}; // densities zones
618 for(Int_t i = 0; i < 6; i++) {
619 slatsegB[i] = new AliMUONSt345SlatSegmentation(1);
620 fDESegmentations->Add(slatsegB[i]);
621 slatsegB[i]->SetPadSize(10.,0.5);
622 slatsegB[i]->SetPadDivision(ndiv);
623 slatsegB[i]->SetId(1);
624 slatsegB[i]->SetDAnod(AliMUONConstants::Pitch());
625 slatsegNB[i] = new AliMUONSt345SlatSegmentation(0);
626 fDESegmentations->Add(slatsegNB[i]);
627 slatsegNB[i]->SetPadSize(1./1.4,10.);
628 slatsegNB[i]->SetPadDivision(ndiv);
629 slatsegNB[i]->SetId(1);
630 slatsegNB[i]->SetDAnod(AliMUONConstants::Pitch());
633 // Type 122330 for 900, 913 in Ch9 (similar for Ch10)
634 // for the futur official numbering
635 // Type 122330 for 906, 956 in Ch9 (similar for Ch10)
636 // actual numbering in the code to be changed in jan05
637 Int_t n4[4] = { 0, 1, 2, 2 };
638 slatsegB[0]->SetPcbBoards(n4);
639 slatsegB[0]->Init(0); // 0 detection element id
640 slatsegNB[0]->SetPcbBoards(n4);
641 slatsegNB[0]->Init(0); // 0 detection element id
643 // Type 112233 for 901, 902, 911, 912, 914, 915, 924, 925 in Ch9
644 // (similar for Ch10) for the futur official numbering
645 // Type 112233 for 904, 905, 907, 908, 954, 955, 957, 958 in Ch9
646 // (similar for Ch10) actual numbering in the code to be changed in jan05
647 Int_t n5[4] = { 0, 2, 2, 2 };
648 slatsegB[1]->SetPcbBoards(n5);
649 slatsegB[1]->Init(0); // 0 detection element id
650 slatsegNB[1]->SetPcbBoards(n5);
651 slatsegNB[1]->Init(0); // 0 detection element id
653 // Type 333000 for 906, 907, 919, 920 in Ch9 (similar for Ch10)
654 // for the futur official numbering
655 // Type 333000 for 900, 912, 950, 962 in Ch9 (similar for Ch10)
656 // actual numbering in the code to be changed in jan05
657 Int_t n9[4] = { 0, 0, 0, 3 };
658 slatsegB[2]->SetPcbBoards(n9);
659 slatsegB[2]->Init(0); // 0 detection element id
660 slatsegNB[2]->SetPcbBoards(n9);
661 slatsegNB[2]->Init(0); // 0 detection element id
663 // Type 222333 for 903, 910, 916, 923 in Ch9 (similar for Ch10)
664 // for the futur official numbering
665 // Type 222333 for 903, 909, 953, 959 in Ch9 (similar for Ch10)
666 // actual numbering in the code to be changed in jan05
667 Int_t n11[4] = { 0, 0, 3, 3 };
668 slatsegB[3]->SetPcbBoards(n11);
669 slatsegB[3]->Init(0); // 0 detection element id
670 slatsegNB[3]->SetPcbBoards(n11);
671 slatsegNB[3]->Init(0); // 0 detection element id
673 // Type 223330 for 904, 909, 917, 922 in Ch9 (similar for Ch10)
674 // for the futur official numbering
675 // Type 223330 for 902, 910, 952, 960 in Ch9 (similar for Ch10)
676 // actual numbering in the code to be changed in jan05
677 Int_t n12[4] = { 0, 0, 2, 3 };
678 slatsegB[4]->SetPcbBoards(n12);
679 slatsegB[4]->Init(0); // 0 detection element id
680 slatsegNB[4]->SetPcbBoards(n12);
681 slatsegNB[4]->Init(0); // 0 detection element id
683 // Type 333300 for 905, 908, 918, 921 in Ch9 (similar for Ch10)
684 // for the futur official numbering
685 // Type 333300 for 901, 911, 951, 961 in Ch9 (similar for Ch10)
686 // actual numbering in the code to be changed in jan05
687 Int_t n13[4] = { 0, 0, 0, 4 };
688 slatsegB[5]->SetPcbBoards(n13);
689 slatsegB[5]->Init(0); // 0 detection element id
690 slatsegNB[5]->SetPcbBoards(n13);
691 slatsegNB[5]->Init(0); // 0 detection element id
693 for (Int_t chamber = 8; chamber < 10; chamber++) {
695 segmentation[0] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
696 segmentation[1] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
698 // id detection elt for chamber 1
699 Int_t id0 = (chamber+1)*100;
701 //--------------------------------------------------------
702 // Configuration for Chamber TC8/9 (Station 5) ----------
705 fMUON->SetNsec(chamber,2);
709 segmentation[0]->Add(id0+13, slatsegB[0]);
710 segmentation[0]->Add(id0 , slatsegB[0]);
713 segmentation[0]->Add(id0+15, slatsegB[1]);
714 segmentation[0]->Add(id0+14, slatsegB[1]);
715 segmentation[0]->Add(id0+12, slatsegB[1]);
716 segmentation[0]->Add(id0+11, slatsegB[1]);
717 segmentation[0]->Add(id0+24, slatsegB[1]);
718 segmentation[0]->Add(id0+25, slatsegB[1]);
719 segmentation[0]->Add(id0+ 1, slatsegB[1]);
720 segmentation[0]->Add(id0+ 2, slatsegB[1]);
723 segmentation[0]->Add(id0+19, slatsegB[2]);
724 segmentation[0]->Add(id0+ 7, slatsegB[2]);
725 segmentation[0]->Add(id0+20, slatsegB[2]);
726 segmentation[0]->Add(id0+ 6, slatsegB[2]);
729 segmentation[0]->Add(id0+16, slatsegB[3]);
730 segmentation[0]->Add(id0+10, slatsegB[3]);
731 segmentation[0]->Add(id0+23, slatsegB[3]);
732 segmentation[0]->Add(id0+ 3, slatsegB[3]);
735 segmentation[0]->Add(id0+17, slatsegB[4]);
736 segmentation[0]->Add(id0+ 9, slatsegB[4]);
737 segmentation[0]->Add(id0+22, slatsegB[4]);
738 segmentation[0]->Add(id0+ 4, slatsegB[4]);
741 segmentation[0]->Add(id0+18, slatsegB[5]);
742 segmentation[0]->Add(id0+ 8, slatsegB[5]);
743 segmentation[0]->Add(id0+21, slatsegB[5]);
744 segmentation[0]->Add(id0+ 5, slatsegB[5]);
745 fMUON->SetSegmentationModel(chamber, 1, segmentation[0]);
749 segmentation[1]->Add(id0+13, slatsegNB[0]);
750 segmentation[1]->Add(id0 , slatsegNB[0]);
753 segmentation[1]->Add(id0+15, slatsegNB[1]);
754 segmentation[1]->Add(id0+14, slatsegNB[1]);
755 segmentation[1]->Add(id0+12, slatsegNB[1]);
756 segmentation[1]->Add(id0+11, slatsegNB[1]);
757 segmentation[1]->Add(id0+24, slatsegNB[1]);
758 segmentation[1]->Add(id0+25, slatsegNB[1]);
759 segmentation[1]->Add(id0+ 1, slatsegNB[1]);
760 segmentation[1]->Add(id0+ 2, slatsegNB[1]);
763 segmentation[1]->Add(id0+19 , slatsegNB[2]);
764 segmentation[1]->Add(id0+ 7, slatsegNB[2]);
765 segmentation[1]->Add(id0+20, slatsegNB[2]);
766 segmentation[1]->Add(id0+ 6, slatsegNB[2]);
769 segmentation[1]->Add(id0+16, slatsegNB[3]);
770 segmentation[1]->Add(id0+10, slatsegNB[3]);
771 segmentation[1]->Add(id0+23, slatsegNB[3]);
772 segmentation[1]->Add(id0+ 3, slatsegNB[3]);
775 segmentation[1]->Add(id0+17, slatsegNB[4]);
776 segmentation[1]->Add(id0+ 9, slatsegNB[4]);
777 segmentation[1]->Add(id0+22, slatsegNB[4]);
778 segmentation[1]->Add(id0+ 4, slatsegNB[4]);
781 segmentation[1]->Add(id0+18, slatsegNB[5]);
782 segmentation[1]->Add(id0+ 8, slatsegNB[5]);
783 segmentation[1]->Add(id0+21, slatsegNB[5]);
784 segmentation[1]->Add(id0+ 5, slatsegNB[5]);
785 fMUON->SetSegmentationModel(chamber, 2, segmentation[1]);
787 fMUON->SetResponseModel(chamber, fResponse0);
788 fMUON->Chamber(chamber).SetChargeCorrel(0.11); // 11% charge spread
792 //__________________________________________________________________________
793 void AliMUONFactoryV2::BuildStation6()
795 // Create Trigger geometry segmentation for given chamber and cathod
798 AliMUONGeometrySegmentation *chamberSeg[2];
800 AliMUONResponseTrigger* responseTrigger0 = new AliMUONResponseTrigger;
802 // AliMUONResponseTriggerV1* responseTrigger0 = new AliMUONResponseTriggerV1;
804 for (Int_t chamber = 10; chamber < 14; chamber++) {
806 //Trigger Segmentation
807 AliMUONTriggerSegmentation *trigSegX[9];
808 AliMUONTriggerSegmentation *trigSegY[9];
809 for(Int_t i=0; i<9; i++) {
810 trigSegX[i] = new AliMUONTriggerSegmentation(1);
811 trigSegY[i] = new AliMUONTriggerSegmentation(0);
812 fDESegmentations->Add(trigSegX[i]);
813 fDESegmentations->Add(trigSegY[i]);
814 trigSegX[i]->SetLineNumber(9-i);
815 trigSegY[i]->SetLineNumber(9-i);
818 AliMUONChamber *iChamber, *iChamber1;
819 iChamber1 = &fMUON->Chamber(10);
820 iChamber = &fMUON->Chamber(chamber);
821 Float_t zpos1= - iChamber1->Z();
822 Float_t zpos = - iChamber->Z();
823 Float_t zRatio = zpos / zpos1;
826 Float_t stripWidth[3]={0.,0.,0.}; // 1.0625 2.125 4.25
827 Float_t stripLength[4]={0.,0.,0.,0.}; // 17. 34. 51. 68.
828 for (Int_t i=0; i<3; i++)
829 stripWidth[i]=AliMUONTriggerConstants::StripWidth(i)*zRatio;
830 for (Int_t i=0; i<4; i++)
831 stripLength[i]=AliMUONTriggerConstants::StripLength(i)*zRatio;
832 Int_t nStrip[7]={0,0,0,0,0,0,0};
833 Float_t stripYsize[7]={0.,0.,0.,0.,0.,0.,0.};
834 Float_t stripXsize[7]={0.,0.,0.,0.,0.,0.,0.};
836 // chamber 8 0 cathode 0
837 for (Int_t i=0; i<7; i++) nStrip[i]=16;
838 for (Int_t i=0; i<7; i++) stripYsize[i]=stripWidth[2];
839 for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1];
840 stripXsize[6]=stripLength[2];
841 trigSegX[8]->Init(0,nStrip,stripYsize,stripXsize,0.);
842 trigSegX[0]->Init(0,nStrip,stripYsize,stripXsize,0.);
844 // chamber 8 7 1 0 cathode 1
845 for (Int_t i=0; i<6; i++) nStrip[i]=8;
847 for (Int_t i=0; i<7; i++) stripYsize[i]=stripLength[3];
848 for (Int_t i=0; i<7; i++) stripXsize[i]=stripWidth[2];
849 trigSegY[8]->Init(0,nStrip,stripYsize,stripXsize,0.);
850 trigSegY[7]->Init(0,nStrip,stripYsize,stripXsize,0.);
851 trigSegY[1]->Init(0,nStrip,stripYsize,stripXsize,0.);
852 trigSegY[0]->Init(0,nStrip,stripYsize,stripXsize,0.);
854 // chamber 7 6 2 1 cathode 0
855 for (Int_t i=0; i<6; i++) nStrip[i]=32;
857 for (Int_t i=0; i<6; i++) stripYsize[i]=stripWidth[1];
858 stripYsize[6]=stripWidth[2];
859 for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1];
860 stripXsize[6]=stripLength[2];
861 trigSegX[7]->Init(0,nStrip,stripYsize,stripXsize,0.);
862 trigSegX[6]->Init(0,nStrip,stripYsize,stripXsize,0.);
863 trigSegX[2]->Init(0,nStrip,stripYsize,stripXsize,0.);
864 trigSegX[1]->Init(0,nStrip,stripYsize,stripXsize,0.);
866 // chamber 6 2 cathode 1
867 for (Int_t i=0; i<5; i++) nStrip[i]=16;
868 for (Int_t i=5; i<6; i++) nStrip[i]=8;
870 for (Int_t i=0; i<7; i++) stripYsize[i]=stripLength[3];
871 for (Int_t i=0; i<5; i++) stripXsize[i]=stripWidth[1];
872 for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2];
873 trigSegY[6]->Init(0,nStrip,stripYsize,stripXsize,0.);
874 trigSegY[2]->Init(0,nStrip,stripYsize,stripXsize,0.);
876 // chamber 5 3 cathode 0
878 for (Int_t i=1; i<3; i++) nStrip[i]=64;
879 for (Int_t i=3; i<6; i++) nStrip[i]=32;
881 for (Int_t i=0; i<3; i++) stripYsize[i]=stripWidth[0];
882 for (Int_t i=3; i<6; i++) stripYsize[i]=stripWidth[1];
883 stripYsize[6]=stripWidth[2];
884 for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1];
885 stripXsize[6]=stripLength[2];
886 trigSegX[5]->Init(0,nStrip,stripYsize,stripXsize,stripLength[0]);
887 trigSegX[3]->Init(0,nStrip,stripYsize,stripXsize,0.);
889 // chamber 5 3 cathode 1
890 for (Int_t i=0; i<5; i++) nStrip[i]=16;
891 for (Int_t i=5; i<6; i++) nStrip[5]=8;
893 stripYsize[0]=stripLength[2];
894 for (Int_t i=1; i<7; i++) stripYsize[i]=stripLength[3];
895 for (Int_t i=0; i<5; i++) stripXsize[i]=stripWidth[1];
896 for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2];
897 trigSegY[5]->Init(0,nStrip,stripYsize,stripXsize,stripLength[0]);
898 trigSegY[3]->Init(0,nStrip,stripYsize,stripXsize,0.);
900 // chamber 4 cathode 0
902 for (Int_t i=1; i<3; i++) nStrip[i]=64;
903 for (Int_t i=3; i<6; i++) nStrip[i]=32;
906 for (Int_t i=1; i<3; i++) stripYsize[i]=stripWidth[0];
907 for (Int_t i=3; i<6; i++) stripYsize[i]=stripWidth[1];
908 stripYsize[6]=stripWidth[2];
910 stripXsize[1]=stripLength[0];
911 for (Int_t i=2; i<6; i++) stripXsize[i]=stripLength[1];
912 stripXsize[6]=stripLength[2];
913 trigSegX[4]->Init(0,nStrip,stripYsize,stripXsize,0.);
915 // chamber 4 cathode 1
918 for (Int_t i=2; i<5; i++) nStrip[i]=16;
919 for (Int_t i=5; i<6; i++) nStrip[i]=8;
922 for (Int_t i=1; i<7; i++) stripYsize[i]=stripLength[3];
924 for (Int_t i=1; i<5; i++) stripXsize[i]=stripWidth[1];
925 for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2];
926 trigSegY[4]->Init(0,nStrip,stripYsize,stripXsize,0.);
928 chamberSeg[0] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
929 chamberSeg[1] = new AliMUONGeometrySegmentation(fMUON->Chamber(chamber).GetGeometry());
931 fMUON->SetNsec(chamber,2);
932 Int_t icount=chamber-10; // chamber counter (0 1 2 3)
933 Int_t id0=(10+icount+1)*100;
936 // printf("in CreateTriggerSegmentation here 0 id0=%i \n",id0);
938 for (Int_t i = 0; i < 9; i++) {
941 chamberSeg[0]->Add(id0+i, trigSegX[i]);
942 chamberSeg[0]->Add(id0+50+i, trigSegX[i]);
943 fMUON->SetSegmentationModel(chamber, 1, chamberSeg[0]);
946 chamberSeg[1]->Add(id0+i, trigSegY[i]);
947 chamberSeg[1]->Add(id0+50+i, trigSegY[i]);
948 fMUON->SetSegmentationModel(chamber, 2, chamberSeg[1]);
952 fMUON->SetResponseModel(chamber, responseTrigger0);
953 fMUON->Chamber(chamber).SetChargeCorrel(0); // same charge on cathodes
956 // printf("in CreateTriggerSegmentation here 1\n");
959 AliWarning(Form("Segmentation for chamber %d is not yet defined",chamber));
964 //__________________________________________________________________________
965 void AliMUONFactoryV2::Build(AliMUON* where, const char* what)
968 // Construct MUON from chambers, segmentation and responses
975 if (strcmp(tmp, "default")==0) {
976 // Set default parameters
978 fMUON->SetMaxStepGas(0.1);
979 fMUON->SetMaxStepAlu(0.1);
983 if (IsGeometryDefined(0)) BuildStation1();
984 if (IsGeometryDefined(2)) BuildStation2();
985 if (IsGeometryDefined(4)) BuildStation3();
986 if (IsGeometryDefined(6)) BuildStation4();
987 if (IsGeometryDefined(8)) BuildStation5();
988 if (IsGeometryDefined(10)) BuildStation6();
991 AliDebug(0,"Non default version of MUON selected. You have to construct yourself the MUON elements !!");
994 //__________________________________________________________________________
995 void AliMUONFactoryV2::BuildStation(AliMUON* where, Int_t stationNumber)
998 // Construct MUON from chambers, segmentation and responses
1002 // First define the number of planes that are segmented (1 or 2) by a call
1004 // Then chose for each chamber (chamber plane) the segmentation
1005 // and response model.
1006 // They should be equal for the two chambers of each station. In a future
1007 // version this will be enforced.
1011 if (!fResponse0) BuildCommon();
1013 switch (stationNumber) {
1014 case 1: BuildStation1(); break;
1015 case 2: BuildStation2(); break;
1016 case 3: BuildStation3(); break;
1017 case 4: BuildStation4(); break;
1018 case 5: BuildStation5(); break;
1019 case 6: BuildStation6(); break;
1021 default: AliFatal("Wrong station number");