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 "AliMUONFactory.h"
24 #include "AliMUONChamber.h"
25 #include "AliMUONResponseV0.h"
26 #include "AliMUONResponseTrigger.h"
27 #include "AliMUONSegmentationV01.h"
28 #include "AliMUONSegmentationV02.h"
29 #include "AliMUONSegmentationSlat.h"
30 #include "AliMUONSegmentationSlatN.h"
31 #include "AliMUONSegmentationTriggerX.h"
32 #include "AliMUONSegmentationTriggerY.h"
34 ClassImp(AliMUONFactory)
36 //__________________________________________________________________________
37 AliMUONFactory::AliMUONFactory()
45 //__________________________________________________________________________
46 AliMUONFactory::AliMUONFactory(const AliMUONFactory& rhs)
49 // Protected copy constructor
51 Fatal("AliMUONFactory", "Not implemented.");
54 //__________________________________________________________________________
56 AliMUONFactory::~AliMUONFactory()
61 //__________________________________________________________________________
62 AliMUONFactory& AliMUONFactory::operator=(const AliMUONFactory& rhs)
64 // Protected assignement operator
66 if (this == &rhs) return *this;
68 Fatal("operator=", "Not implemented.");
73 //__________________________________________________________________________
74 void AliMUONFactory::BuildCommon()
77 // Construct the default response.
80 // Default response: 5 mm of gas
81 fResponse0 = new AliMUONResponseV0;
82 fResponse0->SetSqrtKx3AndDeriveKx2Kx4(0.7131); // sqrt(0.5085)
83 fResponse0->SetSqrtKy3AndDeriveKy2Ky4(0.7642); // sqrt(0.5840)
84 fResponse0->SetPitch(0.25); // anode-cathode distance
85 fResponse0->SetSigmaIntegration(10.);
86 fResponse0->SetChargeSlope(10);
87 fResponse0->SetChargeSpread(0.18, 0.18);
88 fResponse0->SetMaxAdc(4096);
89 fResponse0->SetSaturation(3000);
90 fResponse0->SetZeroSuppression(6);
93 //__________________________________________________________________________
94 void AliMUONFactory::BuildStation1()
96 //--------------------------------------------------------
97 // Configuration for Chamber TC1/2 (Station 1) ----------
98 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100 // Response for 4 mm of gas (station 1)
101 // automatic consistency with width of sensitive medium in CreateGeometry ????
102 AliMUONResponseV0* responseSt1 = new AliMUONResponseV0;
103 // Mathieson parameters from L.Kharmandarian's thesis, page 190
104 responseSt1->SetSqrtKx3AndDeriveKx2Kx4(0.7000); // sqrt(0.4900)
105 responseSt1->SetSqrtKy3AndDeriveKy2Ky4(0.7550); // sqrt(0.5700)
106 responseSt1->SetPitch(0.20); // anode-cathode distance
107 responseSt1->SetSigmaIntegration(10.);
108 // ChargeSlope larger to compensate for the smaller anode-cathode distance
109 // and keep the same most probable ADC channel for mip's
110 responseSt1->SetChargeSlope(62.5);
111 // assumed proportionality to anode-cathode distance for ChargeSpread
112 responseSt1->SetChargeSpread(0.144, 0.144);
113 responseSt1->SetMaxAdc(4096);
114 responseSt1->SetSaturation(3000);
115 responseSt1->SetZeroSuppression(6);
117 //--------------------------------------------------------
118 // Configuration for Chamber TC1/2 (Station 1) ----------
120 Float_t rseg1[4]={17.5, 55.2, 71.3, 95.5};
121 Int_t nseg1[4]={4, 4, 2, 1};
125 fMUON->SetNsec(chamber-1,2);
127 AliMUONSegmentationV01 *seg11=new AliMUONSegmentationV01(4);
129 seg11->SetSegRadii(rseg1);
130 seg11->SetPadSize(2.4, 0.4); // smaller pad size
131 seg11->SetDAnod(0.20); // smaller distance between anode wires
132 seg11->SetPadDivision(nseg1);
134 fMUON->SetSegmentationModel(chamber-1, 1, seg11);
136 AliMUONSegmentationV02 *seg12=new AliMUONSegmentationV02(4);
137 seg12->SetSegRadii(rseg1);
138 seg12->SetPadSize(0.6, 1.6); // smaller pad size
139 seg12->SetDAnod(0.20); // smaller distance between anode wires
140 seg12->SetPadDivision(nseg1);
142 fMUON->SetSegmentationModel(chamber-1, 2, seg12);
144 fMUON->SetResponseModel(chamber-1, responseSt1); // special response
145 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
150 fMUON->SetNsec(chamber-1,2);
152 AliMUONSegmentationV01 *seg21=new AliMUONSegmentationV01(4);
153 seg21->SetSegRadii(rseg1);
154 seg21->SetPadSize(2.4, 0.4); // smaller pad size
155 seg21->SetDAnod(0.20); // smaller distance between anode wires
156 seg21->SetPadDivision(nseg1);
157 fMUON->SetSegmentationModel(chamber-1, 1, seg21);
159 AliMUONSegmentationV02 *seg22=new AliMUONSegmentationV02(4);
160 seg22->SetSegRadii(rseg1);
161 seg22->SetPadSize(0.6, 1.6); // smaller pad size
162 seg22->SetDAnod(0.20); // smaller distance between anode wires
163 seg22->SetPadDivision(nseg1);
164 fMUON->SetSegmentationModel(chamber-1, 2, seg22);
166 fMUON->SetResponseModel(chamber-1, responseSt1); // special response
167 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
171 //__________________________________________________________________________
172 void AliMUONFactory::BuildStation2()
175 //--------------------------------------------------------
176 // Configuration for Chamber TC3/4 (Station 2) -----------
177 ///^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
178 // Float_t rseg2[4]={23.5, 87.7, 122.4, 122.5};
180 Float_t rseg2[4]={23.5, 53.5, 90.5, 122.5};
181 Int_t nseg2[4]={4, 4, 2, 1};
185 fMUON->SetNsec(chamber-1,2);
187 AliMUONSegmentationV01 *seg31=new AliMUONSegmentationV01(4);
188 seg31->SetSegRadii(rseg2);
189 seg31->SetPadSize(3.0, 0.5);
190 seg31->SetDAnod(3.0/3./4);
191 seg31->SetPadDivision(nseg2);
192 fMUON->SetSegmentationModel(chamber-1, 1, seg31);
194 AliMUONSegmentationV02 *seg32=new AliMUONSegmentationV02(4);
195 seg32->SetSegRadii(rseg2);
196 seg32->SetPadSize(0.75, 2.0);
197 seg32->SetPadDivision(nseg2);
198 seg32->SetDAnod(3.0/3./4);
200 fMUON->SetSegmentationModel(chamber-1, 2, seg32);
202 fMUON->SetResponseModel(chamber-1, fResponse0);
203 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
208 fMUON->SetNsec(chamber-1,2);
210 AliMUONSegmentationV01 *seg41=new AliMUONSegmentationV01(4);
211 seg41->SetSegRadii(rseg2);
212 seg41->SetPadSize(3.0, 0.5);
213 seg41->SetDAnod(3.0/3./4);
214 seg41->SetPadDivision(nseg2);
215 fMUON->SetSegmentationModel(chamber-1, 1, seg41);
217 AliMUONSegmentationV02 *seg42=new AliMUONSegmentationV02(4);
218 seg42->SetSegRadii(rseg2);
219 seg42->SetPadSize(0.75, 2.0);
220 seg42->SetPadDivision(nseg2);
221 seg42->SetDAnod(3.0/3./4);
223 fMUON->SetSegmentationModel(chamber-1, 2, seg42);
225 fMUON->SetResponseModel(chamber-1, fResponse0);
226 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
230 //__________________________________________________________________________
231 void AliMUONFactory::BuildStation3()
233 //--------------------------------------------------------
234 // Configuration for Chamber TC5/6 (Station 3) ----------
235 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
237 Int_t nseg3[4]={4, 4, 2, 1};
238 Int_t npcb5[36] = {0,0,2,0,
248 Float_t shift = 0.; // no more constant overlap between slats
250 Float_t xpos5[9] = {1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25};
251 Float_t ypos5[9] = {-146.5, -112.8, -75.5, -37.8, 0.0, 37.8, 75.5, 112.8, 146.5};
253 for (Int_t i = 0; i < 9; i++) ypos5[i] -= 20.; // origin in segmentation at the bottom of the slat !
256 fMUON->SetNsec(chamber-1,2);
257 AliMUONSegmentationSlat *seg51=new AliMUONSegmentationSlat(4);
259 seg51->SetShift(shift);
260 seg51->SetNPCBperSector(npcb5);
261 seg51->SetSlatXPositions(xpos5);
262 seg51->SetSlatYPositions(ypos5);
263 seg51->SetPadSize(10.,0.5);
264 seg51->SetDAnod(0.25);
265 seg51->SetPadDivision(nseg3);
266 fMUON->SetSegmentationModel(chamber-1, 1, seg51);
268 AliMUONSegmentationSlatN *seg52=new AliMUONSegmentationSlatN(4);
270 seg52->SetShift(shift);
271 seg52->SetNPCBperSector(npcb5);
272 seg52->SetSlatXPositions(xpos5);
273 seg52->SetSlatYPositions(ypos5);
274 seg52->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
275 seg52->SetDAnod(0.25);
276 seg52->SetPadDivision(nseg3);
277 fMUON->SetSegmentationModel(chamber-1, 2, seg52);
278 fMUON->SetResponseModel(chamber-1, fResponse0);
279 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
282 fMUON->SetNsec(chamber-1,2);
283 AliMUONSegmentationSlat *seg61=new AliMUONSegmentationSlat(4);
285 seg61->SetShift(shift);
286 seg61->SetNPCBperSector(npcb5);
287 seg61->SetSlatXPositions(xpos5);
288 seg61->SetSlatYPositions(ypos5);
289 seg61->SetPadSize(10.,0.5);
290 seg61->SetDAnod(0.25);
291 seg61->SetPadDivision(nseg3);
292 fMUON->SetSegmentationModel(chamber-1, 1, seg61);
294 AliMUONSegmentationSlatN *seg62=new AliMUONSegmentationSlatN(4);
296 seg62->SetShift(shift);
297 seg62->SetNPCBperSector(npcb5);
298 seg62->SetSlatXPositions(xpos5);
299 seg62->SetSlatYPositions(ypos5);
300 seg62->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
301 seg62->SetDAnod(0.25);
302 seg62->SetPadDivision(nseg3);
303 fMUON->SetSegmentationModel(chamber-1, 2, seg62);
304 fMUON->SetResponseModel(chamber-1, fResponse0);
305 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
309 //__________________________________________________________________________
310 void AliMUONFactory::BuildStation4()
312 //--------------------------------------------------------
313 // Configuration for Chamber TC7/8 (Station 4) ----------
314 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
316 Int_t nseg4[4]={4, 4, 2, 1};
321 fMUON->SetNsec(chamber-1,2);
323 AliMUONSegmentationSlat *seg71=new AliMUONSegmentationSlat(4);
326 Int_t npcb7[52] = {0,0,0,2,
339 Float_t xpos7[13] = {1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 39.45, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25};
340 Float_t ypos7[13] = {-204.1, -175.5, -138.5, -109.2, -72.6, -38.2, 0.0,
341 38.2, 72.6, 109.2, 138.5, 175.5, 204.1};
342 Float_t ypos8[13] = {-208.6, -180.0, -143.0, -113.6, -76.05, -38.2, 0.0,
343 38.2, 76.05, 113.6, 143.0, 180.0, 208.6};
344 for (Int_t i = 0; i < 13; i++) {
349 seg71->SetNSlats(13);
350 seg71->SetShift(shift);
351 seg71->SetNPCBperSector(npcb7);
352 seg71->SetSlatXPositions(xpos7);
353 seg71->SetSlatYPositions(ypos7);
355 seg71->SetPadSize(10.,0.5);
356 seg71->SetDAnod(0.25);
357 seg71->SetPadDivision(nseg4);
358 fMUON->SetSegmentationModel(chamber-1, 1, seg71);
360 AliMUONSegmentationSlatN *seg72=new AliMUONSegmentationSlatN(4);
362 fMUON->SetSegmentationModel(chamber-1, 2, seg72);
363 seg72->SetNSlats(13);
364 seg72->SetShift(shift);
365 seg72->SetNPCBperSector(npcb7);
366 seg72->SetSlatXPositions(xpos7);
367 seg72->SetSlatYPositions(ypos7);
368 seg72->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
369 seg72->SetDAnod(0.25);
370 seg72->SetPadDivision(nseg4);
372 fMUON->SetResponseModel(chamber-1, fResponse0);
373 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
377 fMUON->SetNsec(chamber-1,2);
379 AliMUONSegmentationSlat *seg81=new AliMUONSegmentationSlat(4);
381 seg81->SetNSlats(13);
382 seg81->SetShift(shift);
383 seg81->SetNPCBperSector(npcb7);
384 seg81->SetSlatXPositions(xpos7);
385 seg81->SetSlatYPositions(ypos8);
386 seg81->SetPadSize(10.,0.5);
387 seg81->SetDAnod(0.25);
388 seg81->SetPadDivision(nseg4);
389 fMUON->SetSegmentationModel(chamber-1, 1, seg81);
391 AliMUONSegmentationSlat *seg82=new AliMUONSegmentationSlatN(4);
393 fMUON->SetSegmentationModel(chamber-1, 2, seg82);
394 seg82->SetNSlats(13);
395 seg82->SetShift(shift);
396 seg82->SetNPCBperSector(npcb7);
397 seg82->SetSlatXPositions(xpos7);
398 seg82->SetSlatYPositions(ypos8);
399 seg82->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
400 seg82->SetDAnod(0.25);
401 seg82->SetPadDivision(nseg4);
403 fMUON->SetResponseModel(chamber-1, fResponse0);
404 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
407 //__________________________________________________________________________
408 void AliMUONFactory::BuildStation5()
410 //--------------------------------------------------------
411 // Configuration for Chamber TC9/10 (Station 5) ---------
412 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
417 fMUON->SetNsec(chamber-1,2);
419 AliMUONSegmentationSlat *seg91=new AliMUONSegmentationSlat(4);
421 Int_t nseg4[4]={4, 4, 2, 1};
424 Int_t npcb9[52] = {0,0,0,3,
438 Float_t xpos9[13] = {1.25, 1.25, 1.25, 1.25, 1.25, 1.25, 39.45, 1.25, 1.25, 1.25, 1.25, 1.25, 1.25};
439 Float_t ypos9[13] = {-224.8, -188.05, -151.0, -113.7, -76.1, -38.2, 0.0,
440 38.2, 76.1, 113.7, 151.0, 188.05, 224.8};
442 for (Int_t i = 0; i < 13; i++) ypos9[i] -= 20.;
445 seg91->SetNSlats(13);
446 seg91->SetShift(shift);
447 seg91->SetNPCBperSector(npcb9);
448 seg91->SetSlatXPositions(xpos9);
449 seg91->SetSlatYPositions(ypos9);
450 seg91->SetPadSize(10.,0.5);
451 seg91->SetDAnod(0.25);
452 seg91->SetPadDivision(nseg4);
453 fMUON->SetSegmentationModel(chamber-1, 1, seg91);
455 AliMUONSegmentationSlatN *seg92=new AliMUONSegmentationSlatN(4);
457 fMUON->SetSegmentationModel(chamber-1, 2, seg92);
458 seg92->SetNSlats(13);
459 seg92->SetShift(shift);
460 seg92->SetNPCBperSector(npcb9);
461 seg92->SetSlatXPositions(xpos9);
462 seg92->SetSlatYPositions(ypos9);
463 seg92->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
464 seg92->SetDAnod(0.25);
465 seg92->SetPadDivision(nseg4);
467 fMUON->SetResponseModel(chamber-1, fResponse0);
468 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
472 fMUON->SetNsec(chamber-1,2);
474 AliMUONSegmentationSlat *seg101=new AliMUONSegmentationSlat(4);
476 seg101->SetNSlats(13);
477 seg101->SetShift(shift);
478 seg101->SetNPCBperSector(npcb9);
479 seg101->SetSlatXPositions(xpos9);
480 seg101->SetSlatYPositions(ypos9);
481 seg101->SetPadSize(10.,0.5);
482 seg101->SetDAnod(0.25);
483 seg101->SetPadDivision(nseg4);
484 fMUON->SetSegmentationModel(chamber-1, 1, seg101);
486 AliMUONSegmentationSlatN *seg102=new AliMUONSegmentationSlatN(4);
488 fMUON->SetSegmentationModel(chamber-1, 2, seg102);
489 seg102->SetNSlats(13);
490 seg102->SetShift(shift);
491 seg102->SetNPCBperSector(npcb9);
492 seg102->SetSlatXPositions(xpos9);
493 seg102->SetSlatYPositions(ypos9);
494 seg102->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
495 seg102->SetDAnod(0.25);
496 seg102->SetPadDivision(nseg4);
498 fMUON->SetResponseModel(chamber-1, fResponse0);
499 fMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
502 //__________________________________________________________________________
503 void AliMUONFactory::BuildStation6()
505 //--------------------------------------------------------
506 // Configuration for Trigger Stations --------------------
507 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
510 AliMUONResponseTrigger* responseTrigger0 = new AliMUONResponseTrigger;
512 // AliMUONResponseTriggerV1* responseTrigger0 = new AliMUONResponseTriggerV1;
515 fMUON->SetNsec(chamber-1,2);
516 AliMUONSegmentationTriggerX *seg111=new AliMUONSegmentationTriggerX;
517 fMUON->SetSegmentationModel(chamber-1, 1, seg111);
518 AliMUONSegmentationTriggerY *seg112=new AliMUONSegmentationTriggerY;
519 fMUON->SetSegmentationModel(chamber-1, 2, seg112);
521 fMUON->SetResponseModel(chamber-1, responseTrigger0);
522 fMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
526 fMUON->SetNsec(chamber-1,2);
527 AliMUONSegmentationTriggerX *seg121=new AliMUONSegmentationTriggerX;
528 fMUON->SetSegmentationModel(chamber-1, 1, seg121);
529 AliMUONSegmentationTriggerY *seg122=new AliMUONSegmentationTriggerY;
530 fMUON->SetSegmentationModel(chamber-1, 2, seg122);
532 fMUON->SetResponseModel(chamber-1, responseTrigger0);
533 fMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
536 fMUON->SetNsec(chamber-1,2);
537 AliMUONSegmentationTriggerX *seg131=new AliMUONSegmentationTriggerX;
538 fMUON->SetSegmentationModel(chamber-1, 1, seg131);
539 AliMUONSegmentationTriggerY *seg132=new AliMUONSegmentationTriggerY;
540 fMUON->SetSegmentationModel(chamber-1, 2, seg132);
541 fMUON->SetResponseModel(chamber-1, responseTrigger0);
542 fMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
545 fMUON->SetNsec(chamber-1,2);
546 AliMUONSegmentationTriggerX *seg141=new AliMUONSegmentationTriggerX;
547 fMUON->SetSegmentationModel(chamber-1, 1, seg141);
548 AliMUONSegmentationTriggerY *seg142=new AliMUONSegmentationTriggerY;
549 fMUON->SetSegmentationModel(chamber-1, 2, seg142);
551 fMUON->SetResponseModel(chamber-1, responseTrigger0);
552 fMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
555 //__________________________________________________________________________
556 void AliMUONFactory::Build(AliMUON* where, const char* what)
559 // Construct MUON from chambers, segmentation and responses
566 if (strcmp(tmp, "default")==0) {
567 // Set default parameters
569 fMUON->SetMaxStepGas(0.1);
570 fMUON->SetMaxStepAlu(0.1);
572 // Build all stations
582 if(fMUON->GetDebug()) {
583 printf("\nAliMUONFactory: --------AliMUONFactory------------------------------");
584 printf("\nAliMUONFactory: Non default version of MUON selected ");
585 printf("\nAliMUONFactory: You have to construct yourself the MUON elements !!");
586 printf("\nAliMUONFactory: ----------------------------------------------------");
591 //__________________________________________________________________________
592 void AliMUONFactory::BuildStation(AliMUON* where, Int_t stationNumber)
595 // Construct MUON from chambers, segmentation and responses
599 // First define the number of planes that are segmented (1 or 2) by a call
601 // Then chose for each chamber (chamber plane) the segmentation
602 // and response model.
603 // They should be equal for the two chambers of each station. In a future
604 // version this will be enforced.
608 if (!fResponse0) BuildCommon();
610 switch (stationNumber) {
611 case 1: BuildStation1(); break;
612 case 2: BuildStation2(); break;
613 case 3: BuildStation3(); break;
614 case 4: BuildStation4(); break;
615 case 5: BuildStation5(); break;
616 case 6: BuildStation6(); break;
618 default: Fatal("Build", "Wrong station number");