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 <Riostream.h>
23 #include <TObjString.h>
28 #include "AliMpPlaneType.h"
29 #include "AliMpExMap.h"
31 #include "AliMUONSegFactoryV3.h"
32 #include "AliMUONConstants.h"
33 #include "AliMUONGeometryTransformer.h"
34 #include "AliMUONGeometryModule.h"
35 #include "AliMUONSegmentation.h"
36 #include "AliMUONGeometrySegmentation.h"
37 #include "AliMUONSt12QuadrantSegmentation.h"
38 #include "AliMUONSt345SlatSegmentationV2.h"
39 #include "AliMUONTriggerSegmentation.h"
40 #include "AliMUONTriggerConstants.h"
42 ClassImp(AliMUONSegFactoryV3)
44 //__________________________________________________________________________
45 AliMUONSegFactoryV3::AliMUONSegFactoryV3(const char* name)
50 /// Standard constructor
52 fSegmentation = new AliMUONSegmentation(AliMUONConstants::NCh());
55 //__________________________________________________________________________
56 AliMUONSegFactoryV3::AliMUONSegFactoryV3()
61 /// Default constructor
64 //__________________________________________________________________________
65 AliMUONSegFactoryV3::AliMUONSegFactoryV3(const AliMUONSegFactoryV3& rhs)
68 /// Protected copy constructor
70 AliFatal("Not implemented.");
73 //__________________________________________________________________________
75 AliMUONSegFactoryV3::~AliMUONSegFactoryV3()
80 //delete fSegmentation;
81 // The segmentation is supposed to be deleted in the client code
84 //__________________________________________________________________________
85 AliMUONSegFactoryV3& AliMUONSegFactoryV3::operator=(const AliMUONSegFactoryV3& rhs)
87 // Protected assignement operator
89 if (this == &rhs) return *this;
91 AliFatal("Not implemented.");
100 //__________________________________________________________________________
101 Bool_t AliMUONSegFactoryV3::IsGeometryDefined(Int_t ichamber)
103 // Return true, if det elements for the chamber with the given ichamber Id
104 // are defined in geometry (the geometry builder for this chamber was activated)
106 if ( ! fkGeomTransformer ||
107 ! fkGeomTransformer->GetModuleTransformer(ichamber, false) )
114 //_____________________________________________________________________________
116 AliMUONSegFactoryV3::ReadDENames(const TString& fileName, AliMpExMap& map)
118 /// Read det element names from the file specified by name
122 TString filePath(gSystem->ExpandPathName("${ALICE_ROOT}/MUON/data/"));
123 filePath += fileName;
124 std::ifstream in(filePath);
126 AliErrorClass(Form("Cannot read file %s", filePath.Data()));
130 // Read file and fill the map
132 while ( in.getline(line,80) )
134 if ( !isdigit(line[0]) ) continue;
137 Ssiz_t pos = sline.First(' ');
138 Int_t detelemid = TString(sline(0,pos)).Atoi();
139 TObject* o = map.GetValue(detelemid);
142 map.Add(detelemid, new TObjString(sline(pos+1,sline.Length()-pos).Data()));
152 //_____________________________________________________________________________
154 AliMUONSegFactoryV3::BuildChamber345(Int_t firstDetElemId, Int_t lastDetElemId,
155 const AliMpExMap& deNamesMap)
157 // Build a single chamber for stations 345.
158 // The first and lastDetElemId must correspond to the same chamber.
160 Int_t ichamber = firstDetElemId/100 - 1;
161 Int_t test = lastDetElemId/100-1;
163 if ( test != ichamber )
165 AliFatal(Form("DetElemIds %d and %d not part of the same chamber !",
166 firstDetElemId,lastDetElemId));
169 const Int_t kNPLANES = 2;
170 const AliMpPlaneType kptypes[kNPLANES] = { kBendingPlane, kNonBendingPlane };
172 const AliMUONGeometryModuleTransformer* kModuleTransformer
173 = fkGeomTransformer->GetModuleTransformer(ichamber);
175 for ( Int_t iplane = 0; iplane < kNPLANES; ++iplane )
177 AliMUONGeometrySegmentation* segmentation =
178 new AliMUONGeometrySegmentation(kModuleTransformer);
180 for ( Int_t d = firstDetElemId; d <= lastDetElemId; ++d )
182 if ( !deNamesMap.GetValue(d) )
184 AliWarning(Form("You are requesting an invalid detElemId = %d, I am skipping it",d));
188 AliMUONVGeometryDESegmentation* slatSeg =
189 new AliMUONSt345SlatSegmentationV2(d,kptypes[iplane]);
191 fSegmentation->AddDESegmentation(slatSeg);
193 TString deName = ((TObjString*)deNamesMap.GetValue(d))->GetString();
194 segmentation->Add(d, deName, slatSeg);
197 fSegmentation->AddModuleSegmentation(ichamber, iplane, segmentation);
201 //__________________________________________________________________________
202 void AliMUONSegFactoryV3::BuildStation1()
206 // Quadrant segmentations:
207 AliMUONSt12QuadrantSegmentation* bendSt1
208 = new AliMUONSt12QuadrantSegmentation(kStation1, kBendingPlane);
209 AliMUONSt12QuadrantSegmentation* nonbendSt1
210 = new AliMUONSt12QuadrantSegmentation(kStation1, kNonBendingPlane);
212 // Add in the array (for safe deleting)
213 fSegmentation->AddDESegmentation(bendSt1);
214 fSegmentation->AddDESegmentation(nonbendSt1);
216 AliMUONGeometrySegmentation* segmentation[2];
218 for (Int_t chamber = 0; chamber < 2; chamber++) {
220 const AliMUONGeometryModuleTransformer* kModuleTransformer
221 = fkGeomTransformer->GetModuleTransformer(chamber);
223 segmentation[0] = new AliMUONGeometrySegmentation(kModuleTransformer);
224 segmentation[1] = new AliMUONGeometrySegmentation(kModuleTransformer);
226 // id detection elt for chamber 1
227 Int_t id0 = (chamber+1)*100;
230 segmentation[0]->Add(id0, "St1_Quadrant_I", bendSt1);
231 segmentation[0]->Add(id0 + 1, "St1_Quadrant_II", nonbendSt1);
232 segmentation[0]->Add(id0 + 2, "St1_Quadrant_III", bendSt1);
233 segmentation[0]->Add(id0 + 3, "St1_Quadrant_IV", nonbendSt1);
234 fSegmentation->AddModuleSegmentation(chamber, 0, segmentation[0]);
237 segmentation[1]->Add(id0, "St1_Quadrant_I", nonbendSt1);
238 segmentation[1]->Add(id0 + 1, "St1_Quadrant_II", bendSt1);
239 segmentation[1]->Add(id0 + 2, "St1_Quadrant_III", nonbendSt1);
240 segmentation[1]->Add(id0 + 3, "St1_Quadrant_IV", bendSt1);
241 fSegmentation->AddModuleSegmentation(chamber, 1, segmentation[1]);
245 //__________________________________________________________________________
246 void AliMUONSegFactoryV3::BuildStation2()
249 //--------------------------------------------------------
250 // Configuration for Chamber TC3/4 (Station 2) -----------
251 ///^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
253 // Quadrant segmentations:
254 AliMUONSt12QuadrantSegmentation* bendSt2
255 = new AliMUONSt12QuadrantSegmentation(kStation2, kBendingPlane);
256 AliMUONSt12QuadrantSegmentation* nonbendSt2
257 = new AliMUONSt12QuadrantSegmentation(kStation2, kNonBendingPlane);
259 // Add in the array (for safe deleting)
260 fSegmentation->AddDESegmentation(bendSt2);
261 fSegmentation->AddDESegmentation(nonbendSt2);
263 AliMUONGeometrySegmentation* segmentation[2];
265 for (Int_t chamber = 2; chamber < 4; chamber++) {
267 const AliMUONGeometryModuleTransformer* kModuleTransformer
268 = fkGeomTransformer->GetModuleTransformer(chamber);
270 segmentation[0] = new AliMUONGeometrySegmentation(kModuleTransformer);
271 segmentation[1] = new AliMUONGeometrySegmentation(kModuleTransformer);
273 // id detection elt for chamber 1
274 Int_t id0 = (chamber+1)*100;
276 //--------------------------------------------------------
277 // Configuration for Chamber TC3/4 (Station 2) ----------
281 segmentation[0]->Add(id0, "St2_Quadrant_I", bendSt2);
282 segmentation[0]->Add(id0 + 1, "St2_Quadrant_II", nonbendSt2);
283 segmentation[0]->Add(id0 + 2, "St2_Quadrant_III", bendSt2);
284 segmentation[0]->Add(id0 + 3, "St2_Quadrant_IV", nonbendSt2);
285 fSegmentation->AddModuleSegmentation(chamber, 0, segmentation[0]);
288 segmentation[1]->Add(id0, "St2_Quadrant_I", nonbendSt2);
289 segmentation[1]->Add(id0 + 1, "St2_Quadrant_II", bendSt2);
290 segmentation[1]->Add(id0 + 2, "St2_Quadrant_III", nonbendSt2);
291 segmentation[1]->Add(id0 + 3, "St2_Quadrant_IV", bendSt2);
292 fSegmentation->AddModuleSegmentation(chamber, 1, segmentation[1]);
296 //__________________________________________________________________________
297 void AliMUONSegFactoryV3::BuildStation3(const AliMpExMap& deNamesMap)
299 BuildChamber345(500,517,deNamesMap);
300 BuildChamber345(600,617,deNamesMap);
303 //__________________________________________________________________________
304 void AliMUONSegFactoryV3::BuildStation4(const AliMpExMap& deNamesMap)
306 BuildChamber345(700,725,deNamesMap);
307 BuildChamber345(800,825,deNamesMap);
310 //__________________________________________________________________________
311 void AliMUONSegFactoryV3::BuildStation5(const AliMpExMap& deNamesMap)
313 BuildChamber345(900,925,deNamesMap);
314 BuildChamber345(1000,1025,deNamesMap);
317 //__________________________________________________________________________
318 void AliMUONSegFactoryV3::BuildStation6()
321 AliMUONGeometrySegmentation *chamberSeg[2];
323 for (Int_t chamber = 10; chamber < 14; chamber++) {
325 //Trigger Segmentation
326 AliMUONTriggerSegmentation *trigSegX[9];
327 AliMUONTriggerSegmentation *trigSegY[9];
328 for(Int_t i=0; i<9; i++) {
329 trigSegX[i] = new AliMUONTriggerSegmentation(1);
330 trigSegY[i] = new AliMUONTriggerSegmentation(0);
331 fSegmentation->AddDESegmentation(trigSegX[i]);
332 fSegmentation->AddDESegmentation(trigSegY[i]);
333 trigSegX[i]->SetLineNumber(9-i);
334 trigSegY[i]->SetLineNumber(9-i);
337 //AliMUONChamber *iChamber, *iChamber1;
338 //iChamber1 = &fMUON->Chamber(10);
339 //iChamber = &fMUON->Chamber(chamber);
340 //Float_t zpos1= iChamber1->Z();
341 //Float_t zpos = iChamber->Z();
342 Float_t zpos1= AliMUONConstants::DefaultChamberZ(10);
343 Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber);
344 Float_t zRatio = zpos / zpos1;
347 Float_t stripWidth[3]={0.,0.,0.}; // 1.0625 2.125 4.25
348 Float_t stripLength[4]={0.,0.,0.,0.}; // 17. 34. 51. 68.
349 for (Int_t i=0; i<3; i++)
350 stripWidth[i]=AliMUONTriggerConstants::StripWidth(i)*zRatio;
351 for (Int_t i=0; i<4; i++)
352 stripLength[i]=AliMUONTriggerConstants::StripLength(i)*zRatio;
353 Int_t nStrip[7]={0,0,0,0,0,0,0};
354 Float_t stripYsize[7]={0.,0.,0.,0.,0.,0.,0.};
355 Float_t stripXsize[7]={0.,0.,0.,0.,0.,0.,0.};
357 // chamber 8 0 cathode 0
358 for (Int_t i=0; i<7; i++) nStrip[i]=16;
359 for (Int_t i=0; i<7; i++) stripYsize[i]=stripWidth[2];
360 for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1];
361 stripXsize[6]=stripLength[2];
362 trigSegX[8]->Init(0,nStrip,stripYsize,stripXsize,0.);
363 trigSegX[0]->Init(0,nStrip,stripYsize,stripXsize,0.);
365 // chamber 8 7 1 0 cathode 1
366 for (Int_t i=0; i<6; i++) nStrip[i]=8;
368 for (Int_t i=0; i<7; i++) stripYsize[i]=stripLength[3];
369 for (Int_t i=0; i<7; i++) stripXsize[i]=stripWidth[2];
370 trigSegY[8]->Init(0,nStrip,stripYsize,stripXsize,0.);
371 trigSegY[7]->Init(0,nStrip,stripYsize,stripXsize,0.);
372 trigSegY[1]->Init(0,nStrip,stripYsize,stripXsize,0.);
373 trigSegY[0]->Init(0,nStrip,stripYsize,stripXsize,0.);
375 // chamber 7 6 2 1 cathode 0
376 for (Int_t i=0; i<6; i++) nStrip[i]=32;
378 for (Int_t i=0; i<6; i++) stripYsize[i]=stripWidth[1];
379 stripYsize[6]=stripWidth[2];
380 for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1];
381 stripXsize[6]=stripLength[2];
382 trigSegX[7]->Init(0,nStrip,stripYsize,stripXsize,0.);
383 trigSegX[6]->Init(0,nStrip,stripYsize,stripXsize,0.);
384 trigSegX[2]->Init(0,nStrip,stripYsize,stripXsize,0.);
385 trigSegX[1]->Init(0,nStrip,stripYsize,stripXsize,0.);
387 // chamber 6 2 cathode 1
388 for (Int_t i=0; i<5; i++) nStrip[i]=16;
389 for (Int_t i=5; i<6; i++) nStrip[i]=8;
391 for (Int_t i=0; i<7; i++) stripYsize[i]=stripLength[3];
392 for (Int_t i=0; i<5; i++) stripXsize[i]=stripWidth[1];
393 for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2];
394 trigSegY[6]->Init(0,nStrip,stripYsize,stripXsize,0.);
395 trigSegY[2]->Init(0,nStrip,stripYsize,stripXsize,0.);
397 // chamber 5 3 cathode 0
399 for (Int_t i=1; i<3; i++) nStrip[i]=64;
400 for (Int_t i=3; i<6; i++) nStrip[i]=32;
402 for (Int_t i=0; i<3; i++) stripYsize[i]=stripWidth[0];
403 for (Int_t i=3; i<6; i++) stripYsize[i]=stripWidth[1];
404 stripYsize[6]=stripWidth[2];
405 for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1];
406 stripXsize[6]=stripLength[2];
407 trigSegX[5]->Init(0,nStrip,stripYsize,stripXsize,stripLength[0]);
408 trigSegX[3]->Init(0,nStrip,stripYsize,stripXsize,0.);
410 // chamber 5 3 cathode 1
411 for (Int_t i=0; i<5; i++) nStrip[i]=16;
412 for (Int_t i=5; i<6; i++) nStrip[5]=8;
414 stripYsize[0]=stripLength[2];
415 for (Int_t i=1; i<7; i++) stripYsize[i]=stripLength[3];
416 for (Int_t i=0; i<5; i++) stripXsize[i]=stripWidth[1];
417 for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2];
418 trigSegY[5]->Init(0,nStrip,stripYsize,stripXsize,stripLength[0]);
419 trigSegY[3]->Init(0,nStrip,stripYsize,stripXsize,0.);
421 // chamber 4 cathode 0
423 for (Int_t i=1; i<3; i++) nStrip[i]=64;
424 for (Int_t i=3; i<6; i++) nStrip[i]=32;
427 for (Int_t i=1; i<3; i++) stripYsize[i]=stripWidth[0];
428 for (Int_t i=3; i<6; i++) stripYsize[i]=stripWidth[1];
429 stripYsize[6]=stripWidth[2];
431 stripXsize[1]=stripLength[0];
432 for (Int_t i=2; i<6; i++) stripXsize[i]=stripLength[1];
433 stripXsize[6]=stripLength[2];
434 trigSegX[4]->Init(0,nStrip,stripYsize,stripXsize,0.);
436 // chamber 4 cathode 1
439 for (Int_t i=2; i<5; i++) nStrip[i]=16;
440 for (Int_t i=5; i<6; i++) nStrip[i]=8;
443 for (Int_t i=1; i<7; i++) stripYsize[i]=stripLength[3];
445 for (Int_t i=1; i<5; i++) stripXsize[i]=stripWidth[1];
446 for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2];
447 trigSegY[4]->Init(0,nStrip,stripYsize,stripXsize,0.);
449 const AliMUONGeometryModuleTransformer* kModuleTransformer
450 = fkGeomTransformer->GetModuleTransformer(chamber);
452 chamberSeg[0] = new AliMUONGeometrySegmentation(kModuleTransformer);
453 chamberSeg[1] = new AliMUONGeometrySegmentation(kModuleTransformer);
455 Int_t icount=chamber-10; // chamber counter (0 1 2 3)
456 Int_t id0=(10+icount+1)*100;
459 // printf("in CreateTriggerSegmentation here 0 id0=%i \n",id0);
460 chamberSeg[0]->Add(id0+0, "Undefined", trigSegX[4]);
461 chamberSeg[0]->Add(id0+1, "Undefined", trigSegX[5]);
462 chamberSeg[0]->Add(id0+2, "Undefined", trigSegX[6]);
463 chamberSeg[0]->Add(id0+3, "Undefined", trigSegX[7]);
464 chamberSeg[0]->Add(id0+4, "Undefined", trigSegX[8]);
465 chamberSeg[0]->Add(id0+5, "Undefined", trigSegX[8]);
466 chamberSeg[0]->Add(id0+6, "Undefined", trigSegX[7]);
467 chamberSeg[0]->Add(id0+7, "Undefined", trigSegX[6]);
468 chamberSeg[0]->Add(id0+8, "Undefined", trigSegX[5]);
469 chamberSeg[0]->Add(id0+9, "Undefined", trigSegX[4]);
470 chamberSeg[0]->Add(id0+10, "Undefined", trigSegX[3]);
471 chamberSeg[0]->Add(id0+11, "Undefined", trigSegX[2]);
472 chamberSeg[0]->Add(id0+12, "Undefined", trigSegX[1]);
473 chamberSeg[0]->Add(id0+13, "Undefined", trigSegX[0]);
474 chamberSeg[0]->Add(id0+14, "Undefined", trigSegX[0]);
475 chamberSeg[0]->Add(id0+15, "Undefined", trigSegX[1]);
476 chamberSeg[0]->Add(id0+16, "Undefined", trigSegX[2]);
477 chamberSeg[0]->Add(id0+17, "Undefined", trigSegX[3]);
479 chamberSeg[1]->Add(id0+0, "Undefined", trigSegY[4]);
480 chamberSeg[1]->Add(id0+1, "Undefined", trigSegY[5]);
481 chamberSeg[1]->Add(id0+2, "Undefined", trigSegY[6]);
482 chamberSeg[1]->Add(id0+3, "Undefined", trigSegY[7]);
483 chamberSeg[1]->Add(id0+4, "Undefined", trigSegY[8]);
484 chamberSeg[1]->Add(id0+5, "Undefined", trigSegY[8]);
485 chamberSeg[1]->Add(id0+6, "Undefined", trigSegY[7]);
486 chamberSeg[1]->Add(id0+7, "Undefined", trigSegY[6]);
487 chamberSeg[1]->Add(id0+8, "Undefined", trigSegY[5]);
488 chamberSeg[1]->Add(id0+9, "Undefined", trigSegY[4]);
489 chamberSeg[1]->Add(id0+10, "Undefined", trigSegY[3]);
490 chamberSeg[1]->Add(id0+11, "Undefined", trigSegY[2]);
491 chamberSeg[1]->Add(id0+12, "Undefined", trigSegY[1]);
492 chamberSeg[1]->Add(id0+13, "Undefined", trigSegY[0]);
493 chamberSeg[1]->Add(id0+14, "Undefined", trigSegY[0]);
494 chamberSeg[1]->Add(id0+15, "Undefined", trigSegY[1]);
495 chamberSeg[1]->Add(id0+16, "Undefined", trigSegY[2]);
496 chamberSeg[1]->Add(id0+17, "Undefined", trigSegY[3]);
498 fSegmentation->AddModuleSegmentation(chamber, 0, chamberSeg[0]);
499 fSegmentation->AddModuleSegmentation(chamber, 1, chamberSeg[1]);
501 // printf("in CreateTriggerSegmentation here 1\n");
503 AliWarning(Form("Segmentation for chamber %d is not yet defined",chamber));
509 //__________________________________________________________________________
510 void AliMUONSegFactoryV3::Build(const AliMUONGeometryTransformer* geometry)
512 /// Construct segmentation for all MUON stations
515 fkGeomTransformer = geometry;
517 // Build all stations
518 if (IsGeometryDefined(0)) BuildStation1();
519 if (IsGeometryDefined(2)) BuildStation2();
521 AliMpExMap map1(kTRUE);
522 ReadDENames("denames_slat.dat", map1);
523 if (IsGeometryDefined(4)) BuildStation3(map1);
524 if (IsGeometryDefined(6)) BuildStation4(map1);
525 if (IsGeometryDefined(8)) BuildStation5(map1);
527 if (IsGeometryDefined(10)) BuildStation6();
530 //__________________________________________________________________________
531 void AliMUONSegFactoryV3::BuildStation(
532 const AliMUONGeometryTransformer* geometry,
535 /// Construct segmentations for the given MUON station
537 fkGeomTransformer = geometry;
539 AliMpExMap map1(kTRUE);
540 ReadDENames("denames_slat.dat", map1);
542 switch (stationNumber) {
543 case 1: BuildStation1(); break;
544 case 2: BuildStation2(); break;
545 case 3: BuildStation3(map1); break;
546 case 4: BuildStation4(map1); break;
547 case 5: BuildStation5(map1); break;
548 case 6: BuildStation6(); break;
550 default: AliFatal("Wrong station number");