/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ //////////////////////////////////////////////////////////// // Factory for muon chambers, segmentations and response // //////////////////////////////////////////////////////////// /* $Id$ */ #include #include #include "AliRun.h" #include "AliLog.h" #include "AliMpPlaneType.h" #include "AliMpExMap.h" #include "AliMUONSegFactoryV3.h" #include "AliMUONConstants.h" #include "AliMUONGeometryTransformer.h" #include "AliMUONGeometryModule.h" #include "AliMUONSegmentation.h" #include "AliMUONGeometrySegmentation.h" #include "AliMUONSt12QuadrantSegmentation.h" #include "AliMUONSt345SlatSegmentationV2.h" #include "AliMUONTriggerSegmentation.h" #include "AliMUONTriggerConstants.h" ClassImp(AliMUONSegFactoryV3) //__________________________________________________________________________ AliMUONSegFactoryV3::AliMUONSegFactoryV3(const char* name) : TNamed(name, ""), fSegmentation(0), fkGeomTransformer(0) { /// Standard constructor fSegmentation = new AliMUONSegmentation(AliMUONConstants::NCh()); } //__________________________________________________________________________ AliMUONSegFactoryV3::AliMUONSegFactoryV3() : TNamed(), fSegmentation(0), fkGeomTransformer(0) { /// Default constructor } //__________________________________________________________________________ AliMUONSegFactoryV3::AliMUONSegFactoryV3(const AliMUONSegFactoryV3& rhs) : TNamed(rhs) { /// Protected copy constructor AliFatal("Not implemented."); } //__________________________________________________________________________ AliMUONSegFactoryV3::~AliMUONSegFactoryV3() { /// Destructor //delete fSegmentation; // The segmentation is supposed to be deleted in the client code } //__________________________________________________________________________ AliMUONSegFactoryV3& AliMUONSegFactoryV3::operator=(const AliMUONSegFactoryV3& rhs) { // Protected assignement operator if (this == &rhs) return *this; AliFatal("Not implemented."); return *this; } // // Private methods // //__________________________________________________________________________ Bool_t AliMUONSegFactoryV3::IsGeometryDefined(Int_t ichamber) { // Return true, if det elements for the chamber with the given ichamber Id // are defined in geometry (the geometry builder for this chamber was activated) if ( ! fkGeomTransformer || ! fkGeomTransformer->GetModuleTransformer(ichamber, false) ) return kFALSE; return kTRUE; } //_____________________________________________________________________________ Bool_t AliMUONSegFactoryV3::ReadDENames(const TString& fileName, AliMpExMap& map) { /// Read det element names from the file specified by name /// and fill the map // Open file TString filePath(gSystem->ExpandPathName("${ALICE_ROOT}/MUON/data/")); filePath += fileName; std::ifstream in(filePath); if (!in.good()) { AliErrorClass(Form("Cannot read file %s", filePath.Data())); return false; } // Read file and fill the map char line[80]; while ( in.getline(line,80) ) { if ( !isdigit(line[0]) ) continue; TString sline(line); Ssiz_t pos = sline.First(' '); Int_t detelemid = TString(sline(0,pos)).Atoi(); TObject* o = map.GetValue(detelemid); if (!o) { map.Add(detelemid, new TObjString(sline(pos+1,sline.Length()-pos).Data())); } } // Close file in.close(); return true; } //_____________________________________________________________________________ void AliMUONSegFactoryV3::BuildChamber345(Int_t firstDetElemId, Int_t lastDetElemId, const AliMpExMap& deNamesMap) { // Build a single chamber for stations 345. // The first and lastDetElemId must correspond to the same chamber. Int_t ichamber = firstDetElemId/100 - 1; Int_t test = lastDetElemId/100-1; if ( test != ichamber ) { AliFatal(Form("DetElemIds %d and %d not part of the same chamber !", firstDetElemId,lastDetElemId)); } const Int_t kNPLANES = 2; const AliMpPlaneType kptypes[kNPLANES] = { kBendingPlane, kNonBendingPlane }; const AliMUONGeometryModuleTransformer* kModuleTransformer = fkGeomTransformer->GetModuleTransformer(ichamber); for ( Int_t iplane = 0; iplane < kNPLANES; ++iplane ) { AliMUONGeometrySegmentation* segmentation = new AliMUONGeometrySegmentation(kModuleTransformer); for ( Int_t d = firstDetElemId; d <= lastDetElemId; ++d ) { if ( !deNamesMap.GetValue(d) ) { AliWarning(Form("You are requesting an invalid detElemId = %d, I am skipping it",d)); continue; } AliMUONVGeometryDESegmentation* slatSeg = new AliMUONSt345SlatSegmentationV2(d,kptypes[iplane]); fSegmentation->AddDESegmentation(slatSeg); TString deName = ((TObjString*)deNamesMap.GetValue(d))->GetString(); segmentation->Add(d, deName, slatSeg); } fSegmentation->AddModuleSegmentation(ichamber, iplane, segmentation); } } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation1() { /// Station 1 // Quadrant segmentations: AliMUONSt12QuadrantSegmentation* bendSt1 = new AliMUONSt12QuadrantSegmentation(kStation1, kBendingPlane); AliMUONSt12QuadrantSegmentation* nonbendSt1 = new AliMUONSt12QuadrantSegmentation(kStation1, kNonBendingPlane); // Add in the array (for safe deleting) fSegmentation->AddDESegmentation(bendSt1); fSegmentation->AddDESegmentation(nonbendSt1); AliMUONGeometrySegmentation* segmentation[2]; for (Int_t chamber = 0; chamber < 2; chamber++) { const AliMUONGeometryModuleTransformer* kModuleTransformer = fkGeomTransformer->GetModuleTransformer(chamber); segmentation[0] = new AliMUONGeometrySegmentation(kModuleTransformer); segmentation[1] = new AliMUONGeometrySegmentation(kModuleTransformer); // id detection elt for chamber 1 Int_t id0 = (chamber+1)*100; // cathode 0 segmentation[0]->Add(id0, "St1_Quadrant_I", bendSt1); segmentation[0]->Add(id0 + 1, "St1_Quadrant_II", nonbendSt1); segmentation[0]->Add(id0 + 2, "St1_Quadrant_III", bendSt1); segmentation[0]->Add(id0 + 3, "St1_Quadrant_IV", nonbendSt1); fSegmentation->AddModuleSegmentation(chamber, 0, segmentation[0]); // cathode 1 segmentation[1]->Add(id0, "St1_Quadrant_I", nonbendSt1); segmentation[1]->Add(id0 + 1, "St1_Quadrant_II", bendSt1); segmentation[1]->Add(id0 + 2, "St1_Quadrant_III", nonbendSt1); segmentation[1]->Add(id0 + 3, "St1_Quadrant_IV", bendSt1); fSegmentation->AddModuleSegmentation(chamber, 1, segmentation[1]); } } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation2() { // //-------------------------------------------------------- // Configuration for Chamber TC3/4 (Station 2) ----------- ///^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // Quadrant segmentations: AliMUONSt12QuadrantSegmentation* bendSt2 = new AliMUONSt12QuadrantSegmentation(kStation2, kBendingPlane); AliMUONSt12QuadrantSegmentation* nonbendSt2 = new AliMUONSt12QuadrantSegmentation(kStation2, kNonBendingPlane); // Add in the array (for safe deleting) fSegmentation->AddDESegmentation(bendSt2); fSegmentation->AddDESegmentation(nonbendSt2); AliMUONGeometrySegmentation* segmentation[2]; for (Int_t chamber = 2; chamber < 4; chamber++) { const AliMUONGeometryModuleTransformer* kModuleTransformer = fkGeomTransformer->GetModuleTransformer(chamber); segmentation[0] = new AliMUONGeometrySegmentation(kModuleTransformer); segmentation[1] = new AliMUONGeometrySegmentation(kModuleTransformer); // id detection elt for chamber 1 Int_t id0 = (chamber+1)*100; //-------------------------------------------------------- // Configuration for Chamber TC3/4 (Station 2) ---------- // cathode 0 segmentation[0]->Add(id0, "St2_Quadrant_I", bendSt2); segmentation[0]->Add(id0 + 1, "St2_Quadrant_II", nonbendSt2); segmentation[0]->Add(id0 + 2, "St2_Quadrant_III", bendSt2); segmentation[0]->Add(id0 + 3, "St2_Quadrant_IV", nonbendSt2); fSegmentation->AddModuleSegmentation(chamber, 0, segmentation[0]); // cathode 1 segmentation[1]->Add(id0, "St2_Quadrant_I", nonbendSt2); segmentation[1]->Add(id0 + 1, "St2_Quadrant_II", bendSt2); segmentation[1]->Add(id0 + 2, "St2_Quadrant_III", nonbendSt2); segmentation[1]->Add(id0 + 3, "St2_Quadrant_IV", bendSt2); fSegmentation->AddModuleSegmentation(chamber, 1, segmentation[1]); } } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation3(const AliMpExMap& deNamesMap) { BuildChamber345(500,517,deNamesMap); BuildChamber345(600,617,deNamesMap); } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation4(const AliMpExMap& deNamesMap) { BuildChamber345(700,725,deNamesMap); BuildChamber345(800,825,deNamesMap); } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation5(const AliMpExMap& deNamesMap) { BuildChamber345(900,925,deNamesMap); BuildChamber345(1000,1025,deNamesMap); } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation6() { AliMUONGeometrySegmentation *chamberSeg[2]; for (Int_t chamber = 10; chamber < 14; chamber++) { //Trigger Segmentation AliMUONTriggerSegmentation *trigSegX[9]; AliMUONTriggerSegmentation *trigSegY[9]; for(Int_t i=0; i<9; i++) { trigSegX[i] = new AliMUONTriggerSegmentation(1); trigSegY[i] = new AliMUONTriggerSegmentation(0); fSegmentation->AddDESegmentation(trigSegX[i]); fSegmentation->AddDESegmentation(trigSegY[i]); trigSegX[i]->SetLineNumber(9-i); trigSegY[i]->SetLineNumber(9-i); } //AliMUONChamber *iChamber, *iChamber1; //iChamber1 = &fMUON->Chamber(10); //iChamber = &fMUON->Chamber(chamber); //Float_t zpos1= iChamber1->Z(); //Float_t zpos = iChamber->Z(); Float_t zpos1= AliMUONConstants::DefaultChamberZ(10); Float_t zpos = AliMUONConstants::DefaultChamberZ(chamber); Float_t zRatio = zpos / zpos1; // init Float_t stripWidth[3]={0.,0.,0.}; // 1.0625 2.125 4.25 Float_t stripLength[4]={0.,0.,0.,0.}; // 17. 34. 51. 68. for (Int_t i=0; i<3; i++) stripWidth[i]=AliMUONTriggerConstants::StripWidth(i)*zRatio; for (Int_t i=0; i<4; i++) stripLength[i]=AliMUONTriggerConstants::StripLength(i)*zRatio; Int_t nStrip[7]={0,0,0,0,0,0,0}; Float_t stripYsize[7]={0.,0.,0.,0.,0.,0.,0.}; Float_t stripXsize[7]={0.,0.,0.,0.,0.,0.,0.}; // chamber 8 0 cathode 0 for (Int_t i=0; i<7; i++) nStrip[i]=16; for (Int_t i=0; i<7; i++) stripYsize[i]=stripWidth[2]; for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1]; stripXsize[6]=stripLength[2]; trigSegX[8]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegX[0]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 8 7 1 0 cathode 1 for (Int_t i=0; i<6; i++) nStrip[i]=8; nStrip[6]=16; for (Int_t i=0; i<7; i++) stripYsize[i]=stripLength[3]; for (Int_t i=0; i<7; i++) stripXsize[i]=stripWidth[2]; trigSegY[8]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegY[7]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegY[1]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegY[0]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 7 6 2 1 cathode 0 for (Int_t i=0; i<6; i++) nStrip[i]=32; nStrip[6]=16; for (Int_t i=0; i<6; i++) stripYsize[i]=stripWidth[1]; stripYsize[6]=stripWidth[2]; for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1]; stripXsize[6]=stripLength[2]; trigSegX[7]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegX[6]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegX[2]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegX[1]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 6 2 cathode 1 for (Int_t i=0; i<5; i++) nStrip[i]=16; for (Int_t i=5; i<6; i++) nStrip[i]=8; nStrip[6]=16; for (Int_t i=0; i<7; i++) stripYsize[i]=stripLength[3]; for (Int_t i=0; i<5; i++) stripXsize[i]=stripWidth[1]; for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2]; trigSegY[6]->Init(0,nStrip,stripYsize,stripXsize,0.); trigSegY[2]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 5 3 cathode 0 nStrip[0]=48; for (Int_t i=1; i<3; i++) nStrip[i]=64; for (Int_t i=3; i<6; i++) nStrip[i]=32; nStrip[6]=16; for (Int_t i=0; i<3; i++) stripYsize[i]=stripWidth[0]; for (Int_t i=3; i<6; i++) stripYsize[i]=stripWidth[1]; stripYsize[6]=stripWidth[2]; for (Int_t i=0; i<6; i++) stripXsize[i]=stripLength[1]; stripXsize[6]=stripLength[2]; trigSegX[5]->Init(0,nStrip,stripYsize,stripXsize,stripLength[0]); trigSegX[3]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 5 3 cathode 1 for (Int_t i=0; i<5; i++) nStrip[i]=16; for (Int_t i=5; i<6; i++) nStrip[5]=8; nStrip[6]=16; stripYsize[0]=stripLength[2]; for (Int_t i=1; i<7; i++) stripYsize[i]=stripLength[3]; for (Int_t i=0; i<5; i++) stripXsize[i]=stripWidth[1]; for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2]; trigSegY[5]->Init(0,nStrip,stripYsize,stripXsize,stripLength[0]); trigSegY[3]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 4 cathode 0 nStrip[0]=0; for (Int_t i=1; i<3; i++) nStrip[i]=64; for (Int_t i=3; i<6; i++) nStrip[i]=32; nStrip[6]=16; stripYsize[0]=0.; for (Int_t i=1; i<3; i++) stripYsize[i]=stripWidth[0]; for (Int_t i=3; i<6; i++) stripYsize[i]=stripWidth[1]; stripYsize[6]=stripWidth[2]; stripXsize[0]=0; stripXsize[1]=stripLength[0]; for (Int_t i=2; i<6; i++) stripXsize[i]=stripLength[1]; stripXsize[6]=stripLength[2]; trigSegX[4]->Init(0,nStrip,stripYsize,stripXsize,0.); // chamber 4 cathode 1 nStrip[0]=0; nStrip[1]=8; for (Int_t i=2; i<5; i++) nStrip[i]=16; for (Int_t i=5; i<6; i++) nStrip[i]=8; nStrip[6]=16; stripYsize[0]=0.; for (Int_t i=1; i<7; i++) stripYsize[i]=stripLength[3]; stripXsize[0]=0.; for (Int_t i=1; i<5; i++) stripXsize[i]=stripWidth[1]; for (Int_t i=5; i<7; i++) stripXsize[i]=stripWidth[2]; trigSegY[4]->Init(0,nStrip,stripYsize,stripXsize,0.); const AliMUONGeometryModuleTransformer* kModuleTransformer = fkGeomTransformer->GetModuleTransformer(chamber); chamberSeg[0] = new AliMUONGeometrySegmentation(kModuleTransformer); chamberSeg[1] = new AliMUONGeometrySegmentation(kModuleTransformer); Int_t icount=chamber-10; // chamber counter (0 1 2 3) Int_t id0=(10+icount+1)*100; // printf("in CreateTriggerSegmentation here 0 id0=%i \n",id0); chamberSeg[0]->Add(id0+0, "Undefined", trigSegX[4]); chamberSeg[0]->Add(id0+1, "Undefined", trigSegX[5]); chamberSeg[0]->Add(id0+2, "Undefined", trigSegX[6]); chamberSeg[0]->Add(id0+3, "Undefined", trigSegX[7]); chamberSeg[0]->Add(id0+4, "Undefined", trigSegX[8]); chamberSeg[0]->Add(id0+5, "Undefined", trigSegX[8]); chamberSeg[0]->Add(id0+6, "Undefined", trigSegX[7]); chamberSeg[0]->Add(id0+7, "Undefined", trigSegX[6]); chamberSeg[0]->Add(id0+8, "Undefined", trigSegX[5]); chamberSeg[0]->Add(id0+9, "Undefined", trigSegX[4]); chamberSeg[0]->Add(id0+10, "Undefined", trigSegX[3]); chamberSeg[0]->Add(id0+11, "Undefined", trigSegX[2]); chamberSeg[0]->Add(id0+12, "Undefined", trigSegX[1]); chamberSeg[0]->Add(id0+13, "Undefined", trigSegX[0]); chamberSeg[0]->Add(id0+14, "Undefined", trigSegX[0]); chamberSeg[0]->Add(id0+15, "Undefined", trigSegX[1]); chamberSeg[0]->Add(id0+16, "Undefined", trigSegX[2]); chamberSeg[0]->Add(id0+17, "Undefined", trigSegX[3]); chamberSeg[1]->Add(id0+0, "Undefined", trigSegY[4]); chamberSeg[1]->Add(id0+1, "Undefined", trigSegY[5]); chamberSeg[1]->Add(id0+2, "Undefined", trigSegY[6]); chamberSeg[1]->Add(id0+3, "Undefined", trigSegY[7]); chamberSeg[1]->Add(id0+4, "Undefined", trigSegY[8]); chamberSeg[1]->Add(id0+5, "Undefined", trigSegY[8]); chamberSeg[1]->Add(id0+6, "Undefined", trigSegY[7]); chamberSeg[1]->Add(id0+7, "Undefined", trigSegY[6]); chamberSeg[1]->Add(id0+8, "Undefined", trigSegY[5]); chamberSeg[1]->Add(id0+9, "Undefined", trigSegY[4]); chamberSeg[1]->Add(id0+10, "Undefined", trigSegY[3]); chamberSeg[1]->Add(id0+11, "Undefined", trigSegY[2]); chamberSeg[1]->Add(id0+12, "Undefined", trigSegY[1]); chamberSeg[1]->Add(id0+13, "Undefined", trigSegY[0]); chamberSeg[1]->Add(id0+14, "Undefined", trigSegY[0]); chamberSeg[1]->Add(id0+15, "Undefined", trigSegY[1]); chamberSeg[1]->Add(id0+16, "Undefined", trigSegY[2]); chamberSeg[1]->Add(id0+17, "Undefined", trigSegY[3]); fSegmentation->AddModuleSegmentation(chamber, 0, chamberSeg[0]); fSegmentation->AddModuleSegmentation(chamber, 1, chamberSeg[1]); // printf("in CreateTriggerSegmentation here 1\n"); if (!id0) { AliWarning(Form("Segmentation for chamber %d is not yet defined",chamber)); return ; } } } //__________________________________________________________________________ void AliMUONSegFactoryV3::Build(const AliMUONGeometryTransformer* geometry) { /// Construct segmentation for all MUON stations // fkGeomTransformer = geometry; // Build all stations if (IsGeometryDefined(0)) BuildStation1(); if (IsGeometryDefined(2)) BuildStation2(); AliMpExMap map1(kTRUE); ReadDENames("denames_slat.dat", map1); if (IsGeometryDefined(4)) BuildStation3(map1); if (IsGeometryDefined(6)) BuildStation4(map1); if (IsGeometryDefined(8)) BuildStation5(map1); if (IsGeometryDefined(10)) BuildStation6(); } //__________________________________________________________________________ void AliMUONSegFactoryV3::BuildStation( const AliMUONGeometryTransformer* geometry, Int_t stationNumber) { /// Construct segmentations for the given MUON station fkGeomTransformer = geometry; AliMpExMap map1(kTRUE); ReadDENames("denames_slat.dat", map1); switch (stationNumber) { case 1: BuildStation1(); break; case 2: BuildStation2(); break; case 3: BuildStation3(map1); break; case 4: BuildStation4(map1); break; case 5: BuildStation5(map1); break; case 6: BuildStation6(); break; default: AliFatal("Wrong station number"); } }