]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONFactory.cxx
Made a new abstract base class; AliL3HoughBaseTransformer for different implementations
[u/mrichter/AliRoot.git] / MUON / AliMUONFactory.cxx
CommitLineData
be3bb6c1 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// Factory for muon chambers, segmentations and response //
18////////////////////////////////////////////////////////////
19
20/*
21$Log$
9e1a0ddb 22Revision 1.1 2001/04/06 11:24:43 morsch
23Dependency on implementations of AliSegmentation and AliMUONResponse moved to AliMUONFactory class.
24Static method Build() builds the MUON system out of chambers, segmentation and response.
25
be3bb6c1 26*/
27#include "AliMUONFactory.h"
28#include "AliMUON.h"
29#include "AliMUONChamber.h"
30#include "AliMUONResponseV0.h"
31#include "AliMUONResponseTrigger.h"
32#include "AliMUONSegmentationV0.h"
33#include "AliMUONSegmentationV01.h"
34#include "AliMUONSegmentationV02.h"
35#include "AliMUONSegmentationV04.h"
36#include "AliMUONSegmentationV05.h"
37#include "AliMUONSegmentationSlat.h"
38#include "AliMUONSegmentationSlatN.h"
39#include "AliMUONSegmentationTrigger.h"
40#include "AliMUONSegmentationTriggerX.h"
41#include "AliMUONSegmentationTriggerY.h"
42
43ClassImp(AliMUONFactory)
44
45
46void AliMUONFactory::Build(AliMUON* where, const char* what)
47{
48//
49// Construct MUON from chambers, segmentation and responses
50//
51 char tmp[20];
52 AliMUON* pMUON = where;
53 strcpy(tmp, what);
54
55 if (strcmp(tmp, "default")==0) {
9e1a0ddb 56 if(pMUON->GetDebug()) {
57
58 printf("\nAliMUONFactory: --------AliMUONFactory------------------------------");
59 printf("\nAliMUONFactory: Non default version of MUON selected ");
60 printf("\nAliMUONFactory: You have to construct yourself the MUON elements !!");
61 printf("\nAliMUONFactory: ----------------------------------------------------");
62 }
be3bb6c1 63 pMUON->SetIshunt(0);
64 pMUON->SetMaxStepGas(0.1);
65 pMUON->SetMaxStepAlu(0.1);
66//
67// Version 0
68//
69// First define the number of planes that are segmented (1 or 2) by a call
70// to SetNsec.
71// Then chose for each chamber (chamber plane) the segmentation
72// and response model.
73// They should be equal for the two chambers of each station. In a future
74// version this will be enforced.
75//
76//
77 Int_t chamber;
78 // Default response: 5 mm of gas
79 AliMUONResponseV0* response0 = new AliMUONResponseV0;
80 response0->SetSqrtKx3AndDeriveKx2Kx4(0.7131); // sqrt(0.5085)
81 response0->SetSqrtKy3AndDeriveKy2Ky4(0.7642); // sqrt(0.5840)
82 response0->SetPitch(0.25); // anode-cathode distance
83 response0->SetSigmaIntegration(10.);
84 response0->SetChargeSlope(50);
85 response0->SetChargeSpread(0.18, 0.18);
86 response0->SetMaxAdc(4096);
87 response0->SetZeroSuppression(6);
88
89 // Response for 4 mm of gas (station 1)
90 // automatic consistency with width of sensitive medium in CreateGeometry ????
91 AliMUONResponseV0* responseSt1 = new AliMUONResponseV0;
92 // Mathieson parameters from L.Kharmandarian's thesis, page 190
93 responseSt1->SetSqrtKx3AndDeriveKx2Kx4(0.7000); // sqrt(0.4900)
94 responseSt1->SetSqrtKy3AndDeriveKy2Ky4(0.7550); // sqrt(0.5700)
95 responseSt1->SetPitch(0.20); // anode-cathode distance
96 responseSt1->SetSigmaIntegration(10.);
97 // ChargeSlope larger to compensate for the smaller anode-cathode distance
98 // and keep the same most probable ADC channel for mip's
99 responseSt1->SetChargeSlope(62.5);
100 // assumed proportionality to anode-cathode distance for ChargeSpread
101 responseSt1->SetChargeSpread(0.144, 0.144);
102 responseSt1->SetMaxAdc(4096);
103 responseSt1->SetZeroSuppression(6);
104
105//--------------------------------------------------------
106// Configuration for Chamber TC1/2 (Station 1) ----------
107//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
108 Float_t rseg1[4]={17.5, 55.2, 71.3, 95.5};
109 Int_t nseg1[4]={4, 4, 2, 1};
110//
111 chamber=1;
112// ^^^^^^^^^
113 pMUON->SetNsec(chamber-1,2);
114//
115 AliMUONSegmentationV01 *seg11=new AliMUONSegmentationV01(4);
116
117 seg11->SetSegRadii(rseg1);
118 seg11->SetPadSize(2.4, 0.4); // smaller pad size
119 seg11->SetDAnod(0.20); // smaller distance between anode wires
120 seg11->SetPadDivision(nseg1);
121
122 pMUON->SetSegmentationModel(chamber-1, 1, seg11);
123
124 AliMUONSegmentationV02 *seg12=new AliMUONSegmentationV02(4);
125 seg12->SetSegRadii(rseg1);
126 seg12->SetPadSize(0.6, 1.6); // smaller pad size
127 seg12->SetDAnod(0.20); // smaller distance between anode wires
128 seg12->SetPadDivision(nseg1);
129
130 pMUON->SetSegmentationModel(chamber-1, 2, seg12);
131
132 pMUON->SetResponseModel(chamber-1, responseSt1); // special response
133 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
134
135 chamber=2;
136// ^^^^^^^^^
137//
138 pMUON->SetNsec(chamber-1,2);
139//
140 AliMUONSegmentationV01 *seg21=new AliMUONSegmentationV01(4);
141 seg21->SetSegRadii(rseg1);
142 seg21->SetPadSize(2.4, 0.4); // smaller pad size
143 seg21->SetDAnod(0.20); // smaller distance between anode wires
144 seg21->SetPadDivision(nseg1);
145 pMUON->SetSegmentationModel(chamber-1, 1, seg21);
146//
147 AliMUONSegmentationV02 *seg22=new AliMUONSegmentationV02(4);
148 seg22->SetSegRadii(rseg1);
149 seg22->SetPadSize(0.6, 1.6); // smaller pad size
150 seg22->SetDAnod(0.20); // smaller distance between anode wires
151 seg22->SetPadDivision(nseg1);
152 pMUON->SetSegmentationModel(chamber-1, 2, seg22);
153
154 pMUON->SetResponseModel(chamber-1, responseSt1); // special response
155 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
156
157//
158//--------------------------------------------------------
159// Configuration for Chamber TC3/4 (Station 2) -----------
160///^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
161// Float_t rseg2[4]={23.5, 87.7, 122.4, 122.5};
162 Float_t rseg2[4]={23.5, 47.1, 87.7, 122.5};
163 Int_t nseg2[4]={4, 4, 2, 1};
164//
165 chamber=3;
166// ^^^^^^^^^
167 pMUON->SetNsec(chamber-1,2);
168//
169 AliMUONSegmentationV01 *seg31=new AliMUONSegmentationV01(4);
170 seg31->SetSegRadii(rseg2);
171 seg31->SetPadSize(3.0, 0.5);
172 seg31->SetDAnod(3.0/3./4);
173 seg31->SetPadDivision(nseg2);
174 pMUON->SetSegmentationModel(chamber-1, 1, seg31);
175//
176 AliMUONSegmentationV02 *seg32=new AliMUONSegmentationV02(4);
177 seg32->SetSegRadii(rseg2);
178 seg32->SetPadSize(0.75, 2.0);
179 seg32->SetPadDivision(nseg2);
180 seg32->SetDAnod(3.0/3./4);
181
182 pMUON->SetSegmentationModel(chamber-1, 2, seg32);
183
184 pMUON->SetResponseModel(chamber-1, response0);
185 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
186
187 chamber=4;
188// ^^^^^^^^^
189//
190 pMUON->SetNsec(chamber-1,2);
191//
192 AliMUONSegmentationV01 *seg41=new AliMUONSegmentationV01(4);
193 seg41->SetSegRadii(rseg2);
194 seg41->SetPadSize(3.0, 0.5);
195 seg41->SetDAnod(3.0/3./4);
196 seg41->SetPadDivision(nseg2);
197 pMUON->SetSegmentationModel(chamber-1, 1, seg41);
198//
199 AliMUONSegmentationV02 *seg42=new AliMUONSegmentationV02(4);
200 seg42->SetSegRadii(rseg2);
201 seg42->SetPadSize(0.75, 2.0);
202 seg42->SetPadDivision(nseg2);
203 seg42->SetDAnod(3.0/3./4);
204
205 pMUON->SetSegmentationModel(chamber-1, 2, seg42);
206
207 pMUON->SetResponseModel(chamber-1, response0);
208 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
209
210
211//--------------------------------------------------------
212// Configuration for Chamber TC5/6 (Station 3) ----------
213//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
214 Int_t nseg3[4]={4, 4, 2, 1};
215 Int_t npcb5[36] = {0,0,2,0,
216 0,0,3,0,
217 0,1,3,0,
218 0,2,2,0,
219 0,1,2,0,
220 0,2,2,0,
221 0,1,3,0,
222 0,0,3,0,
223 0,0,2,0};
224
225 Float_t shift = 1.5/2.;
226 Float_t xpos5[9] = {2., 2., 2., 2.,33., 2., 2., 2., 2.};
227 Float_t ypos5 = -(20.+4.*(40.-2.*shift));
228
229 chamber=5;
230 pMUON->SetNsec(chamber-1,2);
231 AliMUONSegmentationSlat *seg51=new AliMUONSegmentationSlat(4);
232 seg51->SetNSlats(9);
233 seg51->SetShift(shift);
234 seg51->SetNPCBperSector(npcb5);
235 seg51->SetSlatXPositions(xpos5);
236 seg51->SetSlatYPosition(ypos5);
237 seg51->SetPadSize(10.,0.5);
238 seg51->SetDAnod(0.25);
239 seg51->SetPadDivision(nseg3);
240 pMUON->SetSegmentationModel(chamber-1, 1, seg51);
241
242 AliMUONSegmentationSlatN *seg52=new AliMUONSegmentationSlatN(4);
243 seg52->SetNSlats(9);
244 seg52->SetShift(shift);
245 seg52->SetNPCBperSector(npcb5);
246 seg52->SetSlatXPositions(xpos5);
247 seg52->SetSlatYPosition(ypos5);
248 seg52->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
249 seg52->SetDAnod(0.25);
250 seg52->SetPadDivision(nseg3);
251 pMUON->SetSegmentationModel(chamber-1, 2, seg52);
252 pMUON->SetResponseModel(chamber-1, response0);
253 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
254
255 chamber=6;
256 pMUON->SetNsec(chamber-1,2);
257 AliMUONSegmentationSlat *seg61=new AliMUONSegmentationSlat(4);
258 seg61->SetNSlats(9);
259 seg61->SetShift(shift);
260 seg61->SetNPCBperSector(npcb5);
261 seg61->SetSlatXPositions(xpos5);
262 seg61->SetSlatYPosition(ypos5);
263 seg61->SetPadSize(10.,0.5);
264 seg61->SetDAnod(0.25);
265 seg61->SetPadDivision(nseg3);
266 pMUON->SetSegmentationModel(chamber-1, 1, seg61);
267
268 AliMUONSegmentationSlatN *seg62=new AliMUONSegmentationSlatN(4);
269 seg62->SetNSlats(9);
270 seg62->SetShift(shift);
271 seg62->SetNPCBperSector(npcb5);
272 seg62->SetSlatXPositions(xpos5);
273 seg62->SetSlatYPosition(ypos5);
274 seg62->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
275 seg62->SetDAnod(0.25);
276 seg62->SetPadDivision(nseg3);
277 pMUON->SetSegmentationModel(chamber-1, 2, seg62);
278 pMUON->SetResponseModel(chamber-1, response0);
279 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
280
281//--------------------------------------------------------
282// Configuration for Chamber TC7/8 (Station 4) ----------
283//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
284
285 Int_t nseg4[4]={4, 4, 2, 1};
286
287 chamber=7;
288// ^^^^^^^^^
289
290 pMUON->SetNsec(chamber-1,2);
291//
292 AliMUONSegmentationSlat *seg71=new AliMUONSegmentationSlat(4);
293 Int_t npcb7[44] = {0,0,0,3,
294 0,0,2,2,
295 0,0,3,2,
296 0,2,2,1,
297 0,2,2,1,
298 0,1,2,1,
299 0,2,2,1,
300 0,2,2,1,
301 0,0,3,2,
302 0,0,2,2,
303 0,0,0,3};
304 Float_t xpos7[11] = {2., 2., 2., 2., 2., 40.5, 2., 2., 2., 2., 2.};
305 Float_t ypos7 = -(20.+5.*(40.-2.*shift));
306
307 seg71->SetNSlats(11);
308 seg71->SetShift(shift);
309 seg71->SetNPCBperSector(npcb7);
310 seg71->SetSlatXPositions(xpos7);
311 seg71->SetSlatYPosition(ypos7);
312
313 seg71->SetPadSize(10.,0.5);
314 seg71->SetDAnod(0.25);
315 seg71->SetPadDivision(nseg4);
316 pMUON->SetSegmentationModel(chamber-1, 1, seg71);
317
318 AliMUONSegmentationSlatN *seg72=new AliMUONSegmentationSlatN(4);
319
320 pMUON->SetSegmentationModel(chamber-1, 2, seg72);
321 seg72->SetNSlats(11);
322 seg72->SetShift(shift);
323 seg72->SetNPCBperSector(npcb7);
324 seg72->SetSlatXPositions(xpos7);
325 seg72->SetSlatYPosition(ypos7);
326 seg72->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
327 seg72->SetDAnod(0.25);
328 seg72->SetPadDivision(nseg4);
329
330 pMUON->SetResponseModel(chamber-1, response0);
331 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
332
333 chamber=8;
334// ^^^^^^^^^
335 pMUON->SetNsec(chamber-1,2);
336//
337 AliMUONSegmentationSlat *seg81=new AliMUONSegmentationSlat(4);
338
339 seg81->SetNSlats(11);
340 seg81->SetShift(shift);
341 seg81->SetNPCBperSector(npcb7);
342 seg81->SetSlatXPositions(xpos7);
343 seg81->SetSlatYPosition(ypos7);
344 seg81->SetPadSize(10.,0.5);
345 seg81->SetDAnod(0.25);
346 seg81->SetPadDivision(nseg4);
347 pMUON->SetSegmentationModel(chamber-1, 1, seg81);
348
349 AliMUONSegmentationSlat *seg82=new AliMUONSegmentationSlatN(4);
350
351 pMUON->SetSegmentationModel(chamber-1, 2, seg82);
352 seg82->SetNSlats(11);
353 seg82->SetShift(shift);
354 seg82->SetNPCBperSector(npcb7);
355 seg82->SetSlatXPositions(xpos7);
356 seg82->SetSlatYPosition(ypos7);
357 seg82->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
358 seg82->SetDAnod(0.25);
359 seg82->SetPadDivision(nseg4);
360
361 pMUON->SetResponseModel(chamber-1, response0);
362 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
363
364
365//--------------------------------------------------------
366// Configuration for Chamber TC9/10 (Station 5) ---------
367//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
368 chamber=9;
369// ^^^^^^^^^
370
371 pMUON->SetNsec(chamber-1,2);
372//
373 AliMUONSegmentationSlat *seg91=new AliMUONSegmentationSlat(4);
374 Int_t npcb9[52] = {0,0,0,3,
375 0,0,0,4,
376 0,0,2,3,
377 0,0,3,3,
378 0,2,2,2,
379 0,2,2,2,
380 0,1,2,2,
381 0,2,2,2,
382 0,2,2,2,
383 0,0,3,3,
384 0,0,2,3,
385 0,0,0,4,
386 0,0,0,3};
387
388 Float_t xpos9[13] = {2., 2., 2., 2., 2., 2., 40.5, 2., 2., 2., 2., 2., 2.};
389 Float_t ypos9 = -(20.+6.*(40.-2.*shift));
390
391 seg91->SetNSlats(13);
392 seg91->SetShift(shift);
393 seg91->SetNPCBperSector(npcb9);
394 seg91->SetSlatXPositions(xpos9);
395 seg91->SetSlatYPosition(ypos9);
396 seg91->SetPadSize(10.,0.5);
397 seg91->SetDAnod(0.25);
398 seg91->SetPadDivision(nseg4);
399 pMUON->SetSegmentationModel(chamber-1, 1, seg91);
400
401 AliMUONSegmentationSlatN *seg92=new AliMUONSegmentationSlatN(4);
402
403 pMUON->SetSegmentationModel(chamber-1, 2, seg92);
404 seg92->SetNSlats(13);
405 seg92->SetShift(shift);
406 seg92->SetNPCBperSector(npcb9);
407 seg92->SetSlatXPositions(xpos9);
408 seg92->SetSlatYPosition(ypos9);
409 seg92->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
410 seg92->SetDAnod(0.25);
411 seg92->SetPadDivision(nseg4);
412
413 pMUON->SetResponseModel(chamber-1, response0);
414 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
415
416 chamber=10;
417// ^^^^^^^^^
418 pMUON->SetNsec(chamber-1,2);
419//
420 AliMUONSegmentationSlat *seg101=new AliMUONSegmentationSlat(4);
421
422 seg101->SetNSlats(13);
423 seg101->SetShift(shift);
424 seg101->SetNPCBperSector(npcb9);
425 seg101->SetSlatXPositions(xpos9);
426 seg101->SetSlatYPosition(ypos9);
427 seg101->SetPadSize(10.,0.5);
428 seg101->SetDAnod(0.25);
429 seg101->SetPadDivision(nseg4);
430 pMUON->SetSegmentationModel(chamber-1, 1, seg101);
431
432 AliMUONSegmentationSlatN *seg102=new AliMUONSegmentationSlatN(4);
433
434 pMUON->SetSegmentationModel(chamber-1, 2, seg102);
435 seg102->SetNSlats(13);
436 seg102->SetShift(shift);
437 seg102->SetNPCBperSector(npcb9);
438 seg102->SetSlatXPositions(xpos9);
439 seg102->SetSlatYPosition(ypos9);
440 seg102->SetPadSize(1., 10.); // DeltaX(non bending) = 2 * DeltaY(bending)
441 seg102->SetDAnod(0.25);
442 seg102->SetPadDivision(nseg4);
443
444 pMUON->SetResponseModel(chamber-1, response0);
445 pMUON->Chamber(chamber-1).SetChargeCorrel(0.11); // 11% charge spread
446
447//--------------------------------------------------------
448// Configuration for Trigger Stations --------------------
449//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
450// Cluster-size off
451 AliMUONResponseTrigger* responseTrigger0 = new AliMUONResponseTrigger;
452// Cluster-size on
453// AliMUONResponseTriggerV1* responseTrigger0 = new AliMUONResponseTriggerV1;
454
455 chamber=11;
456 pMUON->SetNsec(chamber-1,2);
457 AliMUONSegmentationTriggerX *seg111=new AliMUONSegmentationTriggerX;
458 pMUON->SetSegmentationModel(chamber-1, 1, seg111);
459 AliMUONSegmentationTriggerY *seg112=new AliMUONSegmentationTriggerY;
460 pMUON->SetSegmentationModel(chamber-1, 2, seg112);
461
462 pMUON->SetResponseModel(chamber-1, responseTrigger0);
463 pMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
464
465
466 chamber=12;
467 pMUON->SetNsec(chamber-1,2);
468 AliMUONSegmentationTriggerX *seg121=new AliMUONSegmentationTriggerX;
469 pMUON->SetSegmentationModel(chamber-1, 1, seg121);
470 AliMUONSegmentationTriggerY *seg122=new AliMUONSegmentationTriggerY;
471 pMUON->SetSegmentationModel(chamber-1, 2, seg122);
472
473 pMUON->SetResponseModel(chamber-1, responseTrigger0);
474 pMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
475
476 chamber=13;
477 pMUON->SetNsec(chamber-1,2);
478 AliMUONSegmentationTriggerX *seg131=new AliMUONSegmentationTriggerX;
479 pMUON->SetSegmentationModel(chamber-1, 1, seg131);
480 AliMUONSegmentationTriggerY *seg132=new AliMUONSegmentationTriggerY;
481 pMUON->SetSegmentationModel(chamber-1, 2, seg132);
482 pMUON->SetResponseModel(chamber-1, responseTrigger0);
483 pMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
484
485 chamber=14;
486 pMUON->SetNsec(chamber-1,2);
487 AliMUONSegmentationTriggerX *seg141=new AliMUONSegmentationTriggerX;
488 pMUON->SetSegmentationModel(chamber-1, 1, seg141);
489 AliMUONSegmentationTriggerY *seg142=new AliMUONSegmentationTriggerY;
490 pMUON->SetSegmentationModel(chamber-1, 2, seg142);
491
492 pMUON->SetResponseModel(chamber-1, responseTrigger0);
493 pMUON->Chamber(chamber-1).SetChargeCorrel(0); // same charge on cathodes
494 } else {
9e1a0ddb 495 if(pMUON->GetDebug()) {
496 printf("\nAliMUONFactory: --------AliMUONFactory------------------------------");
497 printf("\nAliMUONFactory: Non default version of MUON selected ");
498 printf("\nAliMUONFactory: You have to construct yourself the MUON elements !!");
499 printf("\nAliMUONFactory: ----------------------------------------------------");
500 }
be3bb6c1 501 }
502}
503