X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONv0.cxx;h=fcdbfc0f20a92d6c9deccfe9d72e701cbd1c60d9;hb=f665c1ea0b443aee47ad228faf221b09a86de5e7;hp=f07164c3f01049c5e965a005d5a2ba80a887ab15;hpb=dd2391305e413bc0aa0f4e03d87cb185a810b7f1;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONv0.cxx b/MUON/AliMUONv0.cxx index f07164c3f01..fcdbfc0f20a 100644 --- a/MUON/AliMUONv0.cxx +++ b/MUON/AliMUONv0.cxx @@ -1,3 +1,45 @@ +/************************************************************************** + * 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. * + **************************************************************************/ + +/* +$Log$ +Revision 1.9 2000/06/15 07:58:49 morsch +Code from MUON-dev joined + +Revision 1.8.4.9 2000/06/12 19:20:49 morsch +Constructor sets default geometry, segmentation and response parameters. + +Revision 1.8.4.8 2000/06/09 21:55:28 morsch +Most coding rule violations corrected. + +Revision 1.8.4.7 2000/05/02 13:15:18 morsch +Coding rule violations RS3, RN13 corected + +Revision 1.8.4.6 2000/05/02 10:24:26 morsch +Public access to fdGas and fdAlu of AliMUONChamber replaced by getters. + +Revision 1.8.4.5 2000/04/26 19:58:47 morsch +Obsolete reference to trig_ removed. + +Revision 1.8.4.4 2000/04/19 19:42:47 morsch +change NCH to kNCH + +Revision 1.8.4.3 2000/02/17 08:17:43 morsch +Gammas and neutrons are also scored in the stepmanager +*/ + ///////////////////////////////////////////////////////// // Manager and hits classes for set:MUON version 0 // ///////////////////////////////////////////////////////// @@ -5,23 +47,35 @@ #include #include #include +#include +#include #include "AliMUONv0.h" +#include "AliMUONChamber.h" #include "AliRun.h" #include "AliMC.h" -#include "iostream.h" +#include "AliMUONHit.h" +#include "AliMUONPadHit.h" #include "AliCallf77.h" #include "AliConst.h" - -#define trig trig_ - -extern "C" void type_of_call trig(float (*)[4], float (*)[4], int& iflag); +#include "AliMUONResponseV0.h" +#include "AliMUONResponseTrigger.h" +#include "AliMUONSegmentationV0.h" +#include "AliMUONSegmentationV01.h" +#include "AliMUONSegmentationV02.h" +#include "AliMUONSegmentationV04.h" +#include "AliMUONSegmentationV05.h" +#include "AliMUONSegmentationTrigger.h" +#include "AliMUONSegmentationTriggerX.h" +#include "AliMUONSegmentationTriggerY.h" +#include "AliMUONConstants.h" ClassImp(AliMUONv0) //___________________________________________ AliMUONv0::AliMUONv0() : AliMUON() { +// Constructor fChambers = 0; } @@ -29,1301 +83,417 @@ AliMUONv0::AliMUONv0() : AliMUON() AliMUONv0::AliMUONv0(const char *name, const char *title) : AliMUON(name,title) { -// -// z-Positions of Chambers - const Float_t zch[7]={511., 686., 971., 1245., 1445., 1610, 1710.}; -// -// inner diameter - const Float_t dmi[7]={ 35., 47., 67., 86., 100., 96., 101.96}; -// -// outer diameter - const Float_t dma[7]={183., 245., 346., 442., 513., 824., 874.}; -// - Int_t k; - - fChambers = new TObjArray(14); - - for (Int_t i=0; i<7; i++) { - for (Int_t j=0; j< 2; j++) { -// -// -// Default Parameters for Muon Tracking Stations - k=2*i+j; -// - (*fChambers)[k] = new AliMUONchamber(); - AliMUONchamber* chamber = (AliMUONchamber*) (*fChambers)[k]; - chamber->SetGid(0); - chamber->SetZPOS(zch[i]); -// - chamber->InitGeo(zch[i]); - chamber->frMin=dmi[i]/2.; - chamber->frMax=dma[i]/2.; -// - } // Chamber j in - } // Station i - fMaxStepGas=0.01; - fMaxStepAlu=0.1; - fMaxDestepGas=-1; - fMaxDestepAlu=-1; -} - -//___________________________________________ -void AliMUONv0::Trigger(Float_t (*x)[4], Float_t (*y)[4], Int_t& iflag) -{ - trig(x,y,iflag); -} - -//___________________________________________ -void AliMUONv0::CreateGeometry() -{ - Int_t *idtmed = gAlice->Idtmed(); - AliMC* pMC = AliMC::GetMC(); -// -// Note: all chambers have the same structure, which could be -// easily parameterised. This was intentionally not done in order -// to give a starting point for the implementation of the actual -// design of each station. -// -// Distance between Stations - const Float_t dstation = 8.; -// - Float_t bpar[3]; - Float_t tpar[3]; - Float_t tspar[5], pgpar[10]; - Float_t zpos1, zpos2, zfpos; - Float_t dframep=3.; - Float_t dframez=0.9; - Float_t dr, rMin; -// -// Rotation matrices in the x-y plane - Int_t idrotm[1199]; -// phi= 0 deg - AliMatrix(idrotm[1100], 90., 0., 90., 90., 0., 0.); -// phi= 90 deg - AliMatrix(idrotm[1101], 90., 90., 90., 180., 0., 0.); -// phi= 180 deg - AliMatrix(idrotm[1102], 90., 180., 90., 270., 0., 0.); -// phi= 270 deg - AliMatrix(idrotm[1103], 90., 270., 90., 0., 0., 0.); -// - Float_t phi=2*TMath::Pi()/12/2; - -// -// pointer to the current chamber - AliMUONchamber *iChamber; -//******************************************************************** -// Station 1 ** -//******************************************************************** -// CONCENTRIC - iChamber=(AliMUONchamber*) (*fChambers)[0]; - zpos1=iChamber->ZPosition()-dstation/2; - zpos2=zpos1+dstation; - zfpos=-(iChamber->fdGas+dframez)/2; - -// -// Mother volume - tpar[0] = iChamber->frMin-dframep; - tpar[1] = (iChamber->frMax+dframep)/TMath::Cos(phi); - tpar[2] = dstation/2; - - pMC->Gsvolu("C01M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("C02M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gspos("C01M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY"); - pMC->Gspos("C02M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY"); -// Aluminium frames -// Outer frames - pgpar[0] = 360/12/2; - pgpar[1] = 360.; - pgpar[2] = 12.; - pgpar[3] = 2; - pgpar[4] = -dframez/2; - pgpar[5] = iChamber->frMax; - pgpar[6] = pgpar[5]+dframep; - pgpar[7] = +dframez/2; - pgpar[8] = pgpar[5]; - pgpar[9] = pgpar[6]; - pMC->Gsvolu("C01O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gsvolu("C02O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gspos("C01O",1,"C01M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C01O",2,"C01M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C02O",1,"C02M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C02O",2,"C02M", 0.,0.,+zfpos, 0,"ONLY"); -// -// Inner frame - tpar[0]= iChamber->frMin-dframep; - tpar[1]= iChamber->frMin; - tpar[2]= dframez/2; - pMC->Gsvolu("C01I", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C02I", "TUBE", idtmed[1103], tpar, 3); - - pMC->Gspos("C01I",1,"C01M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C01I",2,"C01M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C02I",1,"C02M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C02I",2,"C02M", 0.,0.,+zfpos, 0,"ONLY"); -// -// Frame Crosses - bpar[0] = (iChamber->frMax - iChamber->frMin)/2; - bpar[1] = dframep/2; - bpar[2] = dframez/2; - pMC->Gsvolu("C01B", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C02B", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C01B",1,"C01M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C01B",2,"C01M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C01B",3,"C01M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C01B",4,"C01M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C01B",5,"C01M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C01B",6,"C01M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C01B",7,"C01M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C01B",8,"C01M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - - pMC->Gspos("C02B",1,"C02M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C02B",2,"C02M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C02B",3,"C02M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C02B",4,"C02M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C02B",5,"C02M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C02B",6,"C02M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C02B",7,"C02M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C02B",8,"C02M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - -// -// Chamber Material represented by Alu sheet - tpar[0]= iChamber->frMin+dframep*2; - tpar[1]= iChamber->frMax-dframep*2; - tpar[2] = (iChamber->fdGas+iChamber->fdAlu)/2; - pMC->Gsvolu("C01A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C02A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gspos("C01A", 1, "C01M", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C02A", 1, "C02M", 0., 0., 0., 0, "ONLY"); -// -// Sensitive volumes - // tpar[2] = iChamber->fdGas; - tpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C01G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gsvolu("C02G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gspos("C01G", 1, "C01A", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C02G", 1, "C02A", 0., 0., 0., 0, "ONLY"); -// -// Frame Crosses to be placed inside gas - dr = (iChamber->frMax - iChamber->frMin); - bpar[0] = TMath::Sqrt(dr*dr-dframep*dframep/4)/2; - bpar[1] = dframep/2; - bpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C01F", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C02F", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C01F",1,"C01G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C01F",2,"C01G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C01F",3,"C01G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C01F",4,"C01G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - - pMC->Gspos("C02F",1,"C02G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C02F",2,"C02G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C02F",3,"C02G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C02F",4,"C02G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); -// -// -//******************************************************************** -// Station 2 ** -//******************************************************************** - iChamber=(AliMUONchamber*) (*fChambers)[2]; - zpos1=iChamber->ZPosition()-dstation/2; - zpos2=zpos1+dstation; - zfpos=-(iChamber->fdGas+dframez)/2; - -// -// Mother volume - tpar[0] = iChamber->frMin-dframep; - tpar[1] = (iChamber->frMax+dframep)/TMath::Cos(phi); - tpar[2] = dstation/2; - - pMC->Gsvolu("C03M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("C04M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gspos("C03M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY"); - pMC->Gspos("C04M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY"); -// Aluminium frames -// Outer frames - pgpar[0] = 360/12/2; - pgpar[1] = 360.; - pgpar[2] = 12.; - pgpar[3] = 2; - pgpar[4] = -dframez/2; - pgpar[5] = iChamber->frMax; - pgpar[6] = pgpar[5]+dframep; - pgpar[7] = +dframez/2; - pgpar[8] = pgpar[5]; - pgpar[9] = pgpar[6]; - pMC->Gsvolu("C03O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gsvolu("C04O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gspos("C03O",1,"C03M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C03O",2,"C03M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C04O",1,"C04M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C04O",2,"C04M", 0.,0.,+zfpos, 0,"ONLY"); -// -// Inner frame - tpar[0]= iChamber->frMin-dframep; - tpar[1]= iChamber->frMin; - tpar[2]= dframez/2; - pMC->Gsvolu("C03I", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C04I", "TUBE", idtmed[1103], tpar, 3); - - pMC->Gspos("C03I",1,"C03M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C03I",2,"C03M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C04I",1,"C04M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C04I",2,"C04M", 0.,0.,+zfpos, 0,"ONLY"); -// -// Frame Crosses - bpar[0] = (iChamber->frMax - iChamber->frMin)/2; - bpar[1] = dframep/2; - bpar[2] = dframez/2; - pMC->Gsvolu("C03B", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C04B", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C03B",1,"C03M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C03B",2,"C03M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C03B",3,"C03M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C03B",4,"C03M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C03B",5,"C03M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C03B",6,"C03M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C03B",7,"C03M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C03B",8,"C03M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - - pMC->Gspos("C04B",1,"C04M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C04B",2,"C04M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C04B",3,"C04M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C04B",4,"C04M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C04B",5,"C04M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C04B",6,"C04M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C04B",7,"C04M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C04B",8,"C04M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - -// -// Chamber Material represented by Alu sheet - tpar[0]= iChamber->frMin+dframep*2; - tpar[1]= iChamber->frMax-dframep*2; - tpar[2] = (iChamber->fdGas+iChamber->fdAlu)/2; - pMC->Gsvolu("C03A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C04A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gspos("C03A", 1, "C03M", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C04A", 1, "C04M", 0., 0., 0., 0, "ONLY"); -// -// Sensitive volumes - // tpar[2] = iChamber->fdGas; - tpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C03G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gsvolu("C04G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gspos("C03G", 1, "C03A", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C04G", 1, "C04A", 0., 0., 0., 0, "ONLY"); -// -// Frame Crosses to be placed inside gas - dr = (iChamber->frMax - iChamber->frMin); - bpar[0] = TMath::Sqrt(dr*dr-dframep*dframep/4)/2; - bpar[1] = dframep/2; - bpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C03F", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C04F", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C03F",1,"C03G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C03F",2,"C03G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C03F",3,"C03G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C03F",4,"C03G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - - pMC->Gspos("C04F",1,"C04G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C04F",2,"C04G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C04F",3,"C04G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C04F",4,"C04G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - -//******************************************************************** -// Station 3 ** -//******************************************************************** -// CONCENTRIC - iChamber=(AliMUONchamber*) (*fChambers)[4]; - zpos1=iChamber->ZPosition(); // 975-13.75 - zpos2=zpos1 // +dstation; - +27.5; -// -// Mother volume - tpar[0] = iChamber->frMin; - tpar[1]= TMath::Sqrt(iChamber->frMax*iChamber->frMax + dframep*dframep) ; - tpar[2] = // 3.; - 5.325*2; - pMC->Gsvolu("C05M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("C06M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gspos("C05M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY"); - pMC->Gspos("C06M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY"); -// -// Mother volume for one quadrant - tspar[0]= iChamber->frMin; - tspar[1]= TMath::Sqrt(iChamber->frMax*iChamber->frMax + dframep*dframep) ; - tspar[2]= // dframez; - 5.325; - tspar[3] = 0.-TMath::ATan2(dframep,iChamber->frMin)*180/kPI; - tspar[4] = 90.+TMath::ATan2(dframep,iChamber->frMin)*180/kPI; - pMC->Gsvolu("C05Q", "TUBS", idtmed[1100], tspar, 5); - pMC->Gsvolu("C06Q", "TUBS", idtmed[1100], tspar, 5); -// Position the four quadrants - pMC->Gspos("C05Q",1,"C05M", 0., 0., 5.325, idrotm[1100], "ONLY"); - pMC->Gspos("C05Q",2,"C05M", 0., 0.,-5.325, idrotm[1101], "ONLY"); - pMC->Gspos("C05Q",3,"C05M", 0., 0., 5.325, idrotm[1102], "ONLY"); - pMC->Gspos("C05Q",4,"C05M", 0., 0.,-5.325, idrotm[1103], "ONLY"); - - pMC->Gspos("C06Q",1,"C06M", 0., 0., 5.325, idrotm[1100], "ONLY"); - pMC->Gspos("C06Q",2,"C06M", 0., 0.,-5.325, idrotm[1101], "ONLY"); - pMC->Gspos("C06Q",3,"C06M", 0., 0., 5.325, idrotm[1102], "ONLY"); - pMC->Gspos("C06Q",4,"C06M", 0., 0.,-5.325, idrotm[1103], "ONLY"); -// Aluminium frames -// Outer frame - tspar[0]= iChamber->frMax-dframep*2; - tspar[1]= iChamber->frMax; - tspar[3] = 0.; - tspar[4] = 90.; - pMC->Gsvolu("C05O", "TUBS", idtmed[1100], tspar, 5); - pMC->Gsvolu("C06O", "TUBS", idtmed[1100], tspar, 5); - pMC->Gspos("C05O",1,"C05Q", 0.,0.,0., 0,"ONLY"); - pMC->Gspos("C06O",1,"C06Q", 0.,0.,0., 0,"ONLY"); -// -// Inner frame - tspar[0]= iChamber->frMin; - tspar[1]= iChamber->frMin+dframep*2; - pMC->Gsvolu("C05I", "TUBS", idtmed[1100], tspar, 5); - pMC->Gsvolu("C06I", "TUBS", idtmed[1100], tspar, 5); - pMC->Gspos("C05I",1,"C05Q", 0.,0.,0., 0,"ONLY"); - pMC->Gspos("C06I",1,"C06Q", 0.,0.,0., 0,"ONLY"); -// -// Boundary half frame - bpar[0] = (iChamber->frMax - iChamber->frMin)/2; - bpar[1] = dframep/2; - bpar[2] = 5.325; - pMC->Gsvolu("C05B", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C06B", "BOX", idtmed[1103], bpar, 3); -//place 2 boudaries - pMC->Gspos("C05B",1,"C05Q", iChamber->frMin+bpar[0] ,-bpar[1],0., idrotm[1100],"ONLY"); - pMC->Gspos("C05B",2,"C05Q", -bpar[1],iChamber->frMin+bpar[0] ,0., idrotm[1101],"ONLY"); - pMC->Gspos("C06B",1,"C06Q", iChamber->frMin+bpar[0] ,-bpar[1],0., idrotm[1100],"ONLY"); - pMC->Gspos("C06B",2,"C06Q", -bpar[1],iChamber->frMin+bpar[0] ,0., idrotm[1101],"ONLY"); -// -// Boundary second half frame (should not overlapp with sensitive surface, nor frames) -// Effective inner radius due to circle effect - rMin = TMath::Sqrt( - (iChamber->frMin+2*dframep)*(iChamber->frMin+2*dframep) - dframep*dframep ); - bpar[0] = (iChamber->frMax - 2*dframep - rMin ) /2; - bpar[2] = (5.325- (0.055 + 0.325)) / 2; - pMC->Gsvolu("C05H", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C06H", "BOX", idtmed[1103], bpar, 3); -//place 2 boudaries - pMC->Gspos("C05H",1,"C05Q", rMin+bpar[0],bpar[1], 0.055+0.325+bpar[2] , idrotm[1100],"ONLY"); - pMC->Gspos("C05H",2,"C05Q", rMin+bpar[0],bpar[1],-(0.055+0.325+bpar[2]), idrotm[1100],"ONLY"); - pMC->Gspos("C05H",3,"C05Q", bpar[1],rMin+bpar[0], 0.055+0.325+bpar[2] , idrotm[1101],"ONLY"); - pMC->Gspos("C05H",4,"C05Q", bpar[1],rMin+bpar[0],-(0.055+0.325+bpar[2]), idrotm[1101],"ONLY"); - pMC->Gspos("C06H",1,"C06Q", rMin+bpar[0],bpar[1], 0.055+0.325+bpar[2] , idrotm[1100],"ONLY"); - pMC->Gspos("C06H",2,"C06Q", rMin+bpar[0],bpar[1],-(0.055+0.325+bpar[2]), idrotm[1100],"ONLY"); - pMC->Gspos("C06H",3,"C06Q", bpar[1],rMin+bpar[0], 0.055+0.325+bpar[2] , idrotm[1101],"ONLY"); - pMC->Gspos("C06H",4,"C06Q", bpar[1],rMin+bpar[0],-(0.055+0.325+bpar[2]), idrotm[1101],"ONLY"); -// -// Chamber Material represented by Alu sheet - // tspar[2] = (iChamber->fdAlu)+(iChamber->fdGas); - tspar[0]= iChamber->frMin+dframep*2; - tspar[1]= iChamber->frMax-dframep*2; - tspar[2] = 0.055 + 0.325; - pMC->Gsvolu("C05A", "TUBS", idtmed[1103], tspar, 5); - pMC->Gsvolu("C06A", "TUBS", idtmed[1103], tspar, 5); - pMC->Gspos("C05A", 1, "C05Q", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C06A", 1, "C06Q", 0., 0., 0., 0, "ONLY"); -// -// Sensitive volumes - // tpar[2] = iChamber->fdGas; - tspar[2] = 0.325; - pMC->Gsvolu("C05G", "TUBS", idtmed[1105], tspar, 5); - pMC->Gsvolu("C06G", "TUBS", idtmed[1105], tspar, 5); - pMC->Gspos("C05G", 1, "C05A", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C06G", 1, "C06A", 0., 0., 0., 0, "ONLY"); -// -// Overwrite sensitive volume with ALU -// Overwrite Gaz volume - bpar[2] = 0.325; - pMC->Gsvolu("C05Z", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C06Z", "BOX", idtmed[1103], bpar, 3); - pMC->Gspos("C05Z",1,"C05G", rMin+bpar[0] ,bpar[1],0., idrotm[1100],"ONLY"); - pMC->Gspos("C05Z",2,"C05G", bpar[1], rMin+bpar[0] ,0., idrotm[1101],"ONLY"); - pMC->Gspos("C06Z",1,"C06G", rMin+bpar[0] ,bpar[1],0., idrotm[1100],"ONLY"); - pMC->Gspos("C06Z",2,"C06G", bpar[1], rMin+bpar[0] ,0., idrotm[1101],"ONLY"); +// Constructor + fChambers = 0; -//******************************************************************** -// Station 4 ** -//******************************************************************** - iChamber=(AliMUONchamber*) (*fChambers)[6]; - zpos1=iChamber->ZPosition()-dstation/2; - zpos2=zpos1+dstation; - zfpos=-(iChamber->fdGas+dframez)/2; - + SetIshunt(0); + SetMaxStepGas(0.1); + SetMaxStepAlu(0.1); // -// Mother volume - tpar[0] = iChamber->frMin-dframep; - tpar[1] = (iChamber->frMax+dframep)/TMath::Cos(phi); - tpar[2] = dstation/2; - - pMC->Gsvolu("C07M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("C08M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gspos("C07M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY"); - pMC->Gspos("C08M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY"); -// Aluminium frames -// Outer frames - pgpar[0] = 360/12/2; - pgpar[1] = 360.; - pgpar[2] = 12.; - pgpar[3] = 2; - pgpar[4] = -dframez/2; - pgpar[5] = iChamber->frMax; - pgpar[6] = pgpar[5]+dframep; - pgpar[7] = +dframez/2; - pgpar[8] = pgpar[5]; - pgpar[9] = pgpar[6]; - pMC->Gsvolu("C07O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gsvolu("C08O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gspos("C07O",1,"C07M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C07O",2,"C07M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C08O",1,"C08M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C08O",2,"C08M", 0.,0.,+zfpos, 0,"ONLY"); +// Version 0 // -// Inner frame - tpar[0]= iChamber->frMin-dframep; - tpar[1]= iChamber->frMin; - tpar[2]= dframez/2; - pMC->Gsvolu("C07I", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C08I", "TUBE", idtmed[1103], tpar, 3); - - pMC->Gspos("C07I",1,"C07M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C07I",2,"C07M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C08I",1,"C08M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C08I",2,"C08M", 0.,0.,+zfpos, 0,"ONLY"); +// First define the number of planes that are segmented (1 or 2) by a call +// to SetNsec. +// Then chose for each chamber (chamber plane) the segmentation +// and response model. +// They should be equal for the two chambers of each station. In a future +// version this will be enforced. // -// Frame Crosses - bpar[0] = (iChamber->frMax - iChamber->frMin)/2; - bpar[1] = dframep/2; - bpar[2] = dframez/2; - pMC->Gsvolu("C07B", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C08B", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C07B",1,"C07M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C07B",2,"C07M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C07B",3,"C07M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C07B",4,"C07M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C07B",5,"C07M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C07B",6,"C07M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C07B",7,"C07M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C07B",8,"C07M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - - pMC->Gspos("C08B",1,"C08M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C08B",2,"C08M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C08B",3,"C08M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C08B",4,"C08M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C08B",5,"C08M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C08B",6,"C08M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C08B",7,"C08M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C08B",8,"C08M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - -// -// Chamber Material represented by Alu sheet - tpar[0]= iChamber->frMin+dframep*2; - tpar[1]= iChamber->frMax-dframep*2; - tpar[2] = (iChamber->fdGas+iChamber->fdAlu)/2; - pMC->Gsvolu("C07A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C08A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gspos("C07A", 1, "C07M", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C08A", 1, "C08M", 0., 0., 0., 0, "ONLY"); -// -// Sensitive volumes - // tpar[2] = iChamber->fdGas; - tpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C07G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gsvolu("C08G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gspos("C07G", 1, "C07A", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C08G", 1, "C08A", 0., 0., 0., 0, "ONLY"); -// -// Frame Crosses to be placed inside gas - dr = (iChamber->frMax - iChamber->frMin); - bpar[0] = TMath::Sqrt(dr*dr-dframep*dframep/4)/2; - bpar[1] = dframep/2; - bpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C07F", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C08F", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C07F",1,"C07G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C07F",2,"C07G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C07F",3,"C07G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C07F",4,"C07G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - - pMC->Gspos("C08F",1,"C08G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C08F",2,"C08G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C08F",3,"C08G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C08F",4,"C08G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - -//******************************************************************** -// Station 5 ** -//******************************************************************** - iChamber=(AliMUONchamber*) (*fChambers)[8]; - zpos1=iChamber->ZPosition()-dstation/2; - zpos2=zpos1+dstation; - zfpos=-(iChamber->fdGas+dframez)/2; - +// + Int_t chamber; + Int_t station; +// Default response + AliMUONResponseV0* response0 = new AliMUONResponseV0; + response0->SetSqrtKx3(0.7131); + response0->SetKx2(1.0107); + response0->SetKx4(0.4036); + response0->SetSqrtKy3(0.7642); + response0->SetKy2(0.9706); + response0->SetKy4(0.3831); + response0->SetPitch(0.25); + response0->SetSigmaIntegration(10.); + response0->SetChargeSlope(50); + response0->SetChargeSpread(0.18, 0.18); + response0->SetMaxAdc(4096); + response0->SetZeroSuppression(6); +//-------------------------------------------------------- +// Configuration for Chamber TC1/2 (Station 1) ---------- +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Float_t rseg1[4]={17.5, 55.2, 71.3, 95.5}; + Int_t nseg1[4]={4, 4, 2, 1}; +// + chamber=1; +//^^^^^^^^^ + SetNsec(chamber-1,2); +// + AliMUONSegmentationV01 *seg11=new AliMUONSegmentationV01; + + seg11->SetSegRadii(rseg1); + seg11->SetPadSize(3, 0.5); + seg11->SetDAnod(3.0/3./4); + seg11->SetPadDivision(nseg1); + + SetSegmentationModel(chamber-1, 1, seg11); // -// Mother volume - tpar[0] = iChamber->frMin-dframep; - tpar[1] = (iChamber->frMax+dframep)/TMath::Cos(phi); - tpar[2] = dstation/2; + AliMUONSegmentationV02 *seg12=new AliMUONSegmentationV02; + seg12->SetSegRadii(rseg1); + seg12->SetPadSize(0.75, 2.0); + seg12->SetDAnod(3.0/3./4); + seg12->SetPadDivision(nseg1); + + SetSegmentationModel(chamber-1, 2, seg12); + + SetResponseModel(chamber-1, response0); + + chamber=2; +//^^^^^^^^^ +// + SetNsec(chamber-1,2); +// + AliMUONSegmentationV01 *seg21=new AliMUONSegmentationV01; + seg21->SetSegRadii(rseg1); + seg21->SetPadSize(3, 0.5); + seg21->SetDAnod(3.0/3./4); + seg21->SetPadDivision(nseg1); + SetSegmentationModel(chamber-1, 1, seg21); +// + AliMUONSegmentationV02 *seg22=new AliMUONSegmentationV02; + seg22->SetSegRadii(rseg1); + seg22->SetPadSize(0.75, 2.); + seg22->SetDAnod(3.0/3./4); + seg22->SetPadDivision(nseg1); + SetSegmentationModel(chamber-1, 2, seg22); + + SetResponseModel(chamber-1, response0); +// +//-------------------------------------------------------- +// Configuration for Chamber TC3/4 ----------------------- +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + Float_t rseg2[4]={23.5, 47.1, 87.7, 122.5}; + Int_t nseg2[4]={4, 4, 2, 1}; +// + chamber=3; +//^^^^^^^^^ + SetNsec(chamber-1,2); +// + AliMUONSegmentationV01 *seg31=new AliMUONSegmentationV01; + seg31->SetSegRadii(rseg2); + seg31->SetPadSize(6, 0.5); + seg31->SetDAnod(3.0/3./4); + seg31->SetPadDivision(nseg2); + SetSegmentationModel(chamber-1, 1, seg31); +// + AliMUONSegmentationV02 *seg32=new AliMUONSegmentationV02; + seg32->SetSegRadii(rseg2); + seg32->SetPadSize(0.75, 4.); + seg32->SetPadDivision(nseg2); + seg32->SetDAnod(3.0/3./4); + + SetSegmentationModel(chamber-1, 2, seg32); + + SetResponseModel(chamber-1, response0); + + chamber=4; +//^^^^^^^^^ +// + SetNsec(chamber-1,2); +// + AliMUONSegmentationV01 *seg41=new AliMUONSegmentationV01; + seg41->SetSegRadii(rseg2); + seg41->SetPadSize(6, 0.5); + seg41->SetDAnod(3.0/3./4); + seg41->SetPadDivision(nseg2); + SetSegmentationModel(chamber-1, 1, seg41); +// + AliMUONSegmentationV02 *seg42=new AliMUONSegmentationV02; + seg42->SetSegRadii(rseg2); + seg42->SetPadSize(0.75, 4.); + seg42->SetPadDivision(nseg2); + seg42->SetDAnod(3.0/3./4); + + SetSegmentationModel(chamber-1, 2, seg42); + + SetResponseModel(chamber-1, response0); + + +//-------------------------------------------------------- +// Configuration for Chamber TC5/6 ----------------------- +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + chamber=5; +//^^^^^^^^^ + SetNsec(chamber-1,2); +// + AliMUONSegmentationV01 *seg51=new AliMUONSegmentationV01; + seg51->SetSegRadii(rseg2); + seg51->SetPadSize(6, 0.5); + seg51->SetDAnod(3.0/3./4); + seg51->SetPadDivision(nseg2); + SetSegmentationModel(chamber-1, 1, seg51); +// + AliMUONSegmentationV02 *seg52=new AliMUONSegmentationV02; + seg52->SetSegRadii(rseg2); + seg52->SetPadSize(0.75, 4.); + seg52->SetPadDivision(nseg2); + seg52->SetDAnod(3.0/3./4); + + SetSegmentationModel(chamber-1, 2, seg52); + SetResponseModel(chamber-1, response0); + + chamber=6; +//^^^^^^^^^ +// + SetNsec(chamber-1,2); +// + AliMUONSegmentationV01 *seg61=new AliMUONSegmentationV01; + seg61->SetSegRadii(rseg2); + seg61->SetPadSize(6, 0.5); + seg61->SetDAnod(3.0/3./4); + seg61->SetPadDivision(nseg2); + SetSegmentationModel(chamber-1, 1, seg61); +// + AliMUONSegmentationV02 *seg62=new AliMUONSegmentationV02; + seg62->SetSegRadii(rseg2); + seg62->SetPadSize(0.75, 4.); + seg62->SetPadDivision(nseg2); + seg62->SetDAnod(3.0/3./4); + + SetSegmentationModel(chamber-1, 2, seg62); + + SetResponseModel(chamber-1, response0); - pMC->Gsvolu("C09M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("C10M", "TUBE", idtmed[1100], tpar, 3); - pMC->Gspos("C09M", 1, "ALIC", 0., 0., zpos1 , 0, "ONLY"); - pMC->Gspos("C10M", 1, "ALIC", 0., 0., zpos2 , 0, "ONLY"); -// Aluminium frames -// Outer frames - pgpar[0] = 360/12/2; - pgpar[1] = 360.; - pgpar[2] = 12.; - pgpar[3] = 2; - pgpar[4] = -dframez/2; - pgpar[5] = iChamber->frMax; - pgpar[6] = pgpar[5]+dframep; - pgpar[7] = +dframez/2; - pgpar[8] = pgpar[5]; - pgpar[9] = pgpar[6]; - pMC->Gsvolu("C09O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gsvolu("C10O", "PGON", idtmed[1103], pgpar, 10); - pMC->Gspos("C09O",1,"C09M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C09O",2,"C09M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C10O",1,"C10M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C10O",2,"C10M", 0.,0.,+zfpos, 0,"ONLY"); -// -// Inner frame - tpar[0]= iChamber->frMin-dframep; - tpar[1]= iChamber->frMin; - tpar[2]= dframez/2; - pMC->Gsvolu("C09I", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C10I", "TUBE", idtmed[1103], tpar, 3); - pMC->Gspos("C09I",1,"C09M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C09I",2,"C09M", 0.,0.,+zfpos, 0,"ONLY"); - pMC->Gspos("C10I",1,"C10M", 0.,0.,-zfpos, 0,"ONLY"); - pMC->Gspos("C10I",2,"C10M", 0.,0.,+zfpos, 0,"ONLY"); // -// Frame Crosses - bpar[0] = (iChamber->frMax - iChamber->frMin)/2; - bpar[1] = dframep/2; - bpar[2] = dframez/2; - pMC->Gsvolu("C09B", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C10B", "BOX", idtmed[1103], bpar, 3); +// Station 3 + station=3; + SetPadSize(station, 1, 0.975, 0.55); - pMC->Gspos("C09B",1,"C09M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C09B",2,"C09M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C09B",3,"C09M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C09B",4,"C09M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C09B",5,"C09M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C09B",6,"C09M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C09B",7,"C09M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C09B",8,"C09M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); +//-------------------------------------------------------- +// Configuration for Chamber TC7/8 (Station 4) ---------- +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - pMC->Gspos("C10B",1,"C10M", +iChamber->frMin+bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C10B",2,"C10M", -iChamber->frMin-bpar[0] , 0,-zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C10B",3,"C10M", 0, +iChamber->frMin+bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C10B",4,"C10M", 0, -iChamber->frMin-bpar[0] ,-zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C10B",5,"C10M", +iChamber->frMin+bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C10B",6,"C10M", -iChamber->frMin-bpar[0] , 0,+zfpos, -idrotm[1100],"ONLY"); - pMC->Gspos("C10B",7,"C10M", 0, +iChamber->frMin+bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); - pMC->Gspos("C10B",8,"C10M", 0, -iChamber->frMin-bpar[0] ,+zfpos, -idrotm[1101],"ONLY"); + Int_t nseg4[4]={4, 4, 2, 1}; + chamber=7; +//^^^^^^^^^ + SetNsec(chamber-1,2); // -// Chamber Material represented by Alu sheet - tpar[0]= iChamber->frMin+dframep*2; - tpar[1]= iChamber->frMax-dframep*2; - tpar[2] = (iChamber->fdGas+iChamber->fdAlu)/2; - pMC->Gsvolu("C09A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gsvolu("C10A", "TUBE", idtmed[1103], tpar, 3); - pMC->Gspos("C09A", 1, "C09M", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C10A", 1, "C10M", 0., 0., 0., 0, "ONLY"); -// -// Sensitive volumes - // tpar[2] = iChamber->fdGas; - tpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C09G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gsvolu("C10G", "TUBE", idtmed[1105], tpar, 3); - pMC->Gspos("C09G", 1, "C09A", 0., 0., 0., 0, "ONLY"); - pMC->Gspos("C10G", 1, "C10A", 0., 0., 0., 0, "ONLY"); -// -// Frame Crosses to be placed inside gas - dr = (iChamber->frMax - iChamber->frMin); - bpar[0] = TMath::Sqrt(dr*dr-dframep*dframep/4)/2; - bpar[1] = dframep/2; - bpar[2] = iChamber->fdGas/2; - pMC->Gsvolu("C09F", "BOX", idtmed[1103], bpar, 3); - pMC->Gsvolu("C10F", "BOX", idtmed[1103], bpar, 3); - - pMC->Gspos("C09F",1,"C09G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C09F",2,"C09G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C09F",3,"C09G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C09F",4,"C09G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - - pMC->Gspos("C10F",1,"C10G", +iChamber->frMin+bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C10F",2,"C10G", -iChamber->frMin-bpar[0] , 0, 0, -idrotm[1100],"ONLY"); - pMC->Gspos("C10F",3,"C10G", 0, +iChamber->frMin+bpar[0] , 0, -idrotm[1101],"ONLY"); - pMC->Gspos("C10F",4,"C10G", 0, -iChamber->frMin-bpar[0] , 0, -idrotm[1101],"ONLY"); - -/////////////////////////////////////// -// GEOMETRY FOR THE TRIGGER CHAMBERS // -/////////////////////////////////////// - -// Distance between planes inside each trigger station - const Float_t DTPLANES = 15.; - -// Parameters of the Trigger Chambers - //Station 1 - - const Float_t X_MC1_MIN=38.; - const Float_t X_MC1_MED=51.; - const Float_t X_MC1_MAX=272.; - const Float_t Y_MC1_MIN=34.; - const Float_t Y_MC1_MAX=51.; - const Float_t R_MIN1=48.; - const Float_t R_MAX1=64.; - -// Station 1 - iChamber=(AliMUONchamber*) (*fChambers)[10]; - zpos1=iChamber->ZPosition(); - zpos2=zpos1+DTPLANES; - -// Mother volume definition - tpar[0] = iChamber->frMin; - tpar[1] = iChamber->frMax; - tpar[2] = 0.4; - pMC->Gsvolu("CM11", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("CM12", "TUBE", idtmed[1100], tpar, 3); - -// Definition of the flange between the beam shielding and the RPC - tpar[0]= R_MIN1; - tpar[1]= R_MAX1; - tpar[2]= 0.4; - - pMC->Gsvolu("CF1A", "TUBE", idtmed[1103], tpar, 3); //Al - pMC->Gspos("CF1A", 1, "CM11", 0., 0., 0., 0, "MANY"); - pMC->Gspos("CF1A", 2, "CM12", 0., 0., 0., 0, "MANY"); - -// Definition of prototype for chambers in the first plane - - tpar[0]= 0.; - tpar[1]= 0.; - tpar[2]= 0.; - - pMC->Gsvolu("CC1A", "BOX ", idtmed[1103], tpar, 0); //Al - pMC->Gsvolu("CB1A", "BOX ", idtmed[1107], tpar, 0); //Bakelite - pMC->Gsvolu("CG1A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer - -// chamber type A - tpar[0] = -1.; - tpar[1] = -1.; - - const Float_t X_MC1A=X_MC1_MED+(X_MC1_MAX-X_MC1_MED)/2.; - const Float_t Y_MC1A=0.; - const Float_t Z_MC1A=0.; - - tpar[2] = 0.1; - pMC->Gsposp("CG1A", 1, "CB1A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.3; - pMC->Gsposp("CB1A", 1, "CC1A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.4; - tpar[0] = (X_MC1_MAX-X_MC1_MED)/2.; - tpar[1] = Y_MC1_MIN; - pMC->Gsposp("CC1A", 1, "CM11",X_MC1A,Y_MC1A,Z_MC1A, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 2, "CM11",-X_MC1A,Y_MC1A,Z_MC1A, 0, "ONLY", tpar, 3); - -// chamber type B - tpar[0] = (X_MC1_MAX-X_MC1_MIN)/2.; - tpar[1] = (Y_MC1_MAX-Y_MC1_MIN)/2.; - - const Float_t X_MC1B=X_MC1_MIN+tpar[0]; - const Float_t Y_MC1B=Y_MC1_MIN+tpar[1]; - const Float_t Z_MC1B=0.; - - pMC->Gsposp("CC1A", 3, "CM11",X_MC1B,Y_MC1B,Z_MC1B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 4, "CM11",-X_MC1B,Y_MC1B,Z_MC1B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 5, "CM11",X_MC1B,-Y_MC1B,Z_MC1B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 6, "CM11",-X_MC1B,-Y_MC1B,Z_MC1B, 0, "ONLY", tpar, 3); - -// chamber type C - tpar[0] = X_MC1_MAX/2; - tpar[1] = Y_MC1_MAX/2; - - const Float_t X_MC1C=tpar[0]; - const Float_t Y_MC1C=Y_MC1_MAX+tpar[1]; - const Float_t Z_MC1C=0.; - - pMC->Gsposp("CC1A", 7, "CM11",X_MC1C,Y_MC1C,Z_MC1C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 8, "CM11",-X_MC1C,Y_MC1C,Z_MC1C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 9, "CM11",X_MC1C,-Y_MC1C,Z_MC1C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 10, "CM11",-X_MC1C,-Y_MC1C,Z_MC1C, 0, "ONLY", tpar, 3); - -// chamber type D - tpar[0] = X_MC1_MAX/2.; - tpar[1] = Y_MC1_MIN; - - const Float_t X_MC1D=tpar[0]; - const Float_t Z_MC1D=0.; - - Float_t Y_MC1D=4.*Y_MC1_MIN; - pMC->Gsposp("CC1A", 11, "CM11",X_MC1D,Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 12, "CM11",X_MC1D,-Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 13, "CM11",-X_MC1D,Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 14, "CM11",-X_MC1D,-Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - - Y_MC1D=6.*Y_MC1_MIN; - pMC->Gsposp("CC1A", 15, "CM11",X_MC1D,Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 16, "CM11",X_MC1D,-Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 17, "CM11",-X_MC1D,Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 18, "CM11",-X_MC1D,-Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - - Y_MC1D=8.*Y_MC1_MIN; - pMC->Gsposp("CC1A", 19, "CM11",X_MC1D,Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 20, "CM11",X_MC1D,-Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 21, "CM11",-X_MC1D,Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC1A", 22, "CM11",-X_MC1D,-Y_MC1D,Z_MC1D, 0, "ONLY", tpar, 3); - -// Positioning first plane in ALICE - pMC->Gspos("CM11", 1, "ALIC", 0., 0., zpos1, 0, "ONLY"); - -// End of geometry definition for the first plane - -// Station 1 - plan 2 - same RPCs as plan 1 ==> small non covered area -// Y position moved (ratio zpos2/zpos1) - const Float_t Z_1S2=zpos2/zpos1; - -// Definition of prototype for chambers in the second plane - - tpar[0]= 0.; - tpar[1]= 0.; - tpar[2]= 0.; - - pMC->Gsvolu("CC2A", "BOX ", idtmed[1103], tpar, 0); //Al - pMC->Gsvolu("CB2A", "BOX ", idtmed[1107], tpar, 0); //Bakelite - pMC->Gsvolu("CG2A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer - -// chamber type A - tpar[0] = -1.; - tpar[1] = -1.; - - const Float_t X_MC2A=X_MC1A; - const Float_t Y_MC2A=0.; - const Float_t Z_MC2A=0.; - - tpar[2] = 0.1; - pMC->Gsposp("CG2A", 1, "CB2A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.3; - pMC->Gsposp("CB2A", 1, "CC2A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.4; - tpar[0] = (X_MC1_MAX-X_MC1_MED)/2.; - tpar[1] = Y_MC1_MIN; - pMC->Gsposp("CC2A", 1, "CM12",X_MC2A,Y_MC2A,Z_MC2A, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 2, "CM12",-X_MC2A,Y_MC2A,Z_MC2A, 0, "ONLY", tpar, 3); - -// chamber type B - tpar[0] = (X_MC1_MAX-X_MC1_MIN)/2.; - tpar[1] = (Y_MC1_MAX-Y_MC1_MIN)/2.; - - const Float_t X_MC2B=X_MC1B; - const Float_t Y_MC2B=2.*Y_MC1_MIN*Z_1S2-Y_MC1_MIN*1.5+Y_MC1_MAX*0.5; - const Float_t Z_MC2B=0.; - - pMC->Gsposp("CC2A", 3, "CM12",X_MC2B,Y_MC2B,Z_MC2B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 4, "CM12",-X_MC2B,Y_MC2B,Z_MC2B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 5, "CM12",X_MC2B,-Y_MC2B,Z_MC2B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 6, "CM12",-X_MC2B,-Y_MC2B,Z_MC2B, 0, "ONLY", tpar, 3); - -// chamber type C - tpar[0] = X_MC1_MAX/2; - tpar[1] = Y_MC1_MAX/2; - - const Float_t X_MC2C=X_MC1C; - const Float_t Y_MC2C=2.*Y_MC1_MIN*Z_1S2-Y_MC1_MIN*2.+Y_MC1_MAX*1.5; - const Float_t Z_MC2C=0.; - - pMC->Gsposp("CC2A", 7, "CM12",X_MC2C,Y_MC2C,Z_MC2C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 8, "CM12",-X_MC2C,Y_MC2C,Z_MC2C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 9, "CM12",X_MC2C,-Y_MC2C,Z_MC2C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 10, "CM12",-X_MC2C,-Y_MC2C,Z_MC2C, 0, "ONLY", tpar, 3); - -// chamber type D - tpar[0] = X_MC1_MAX/2.; - tpar[1] = Y_MC1_MIN; - - const Float_t X_MC2D=X_MC1D; - const Float_t Z_MC2D=0.; - - Float_t Y_MC2D=4.*Y_MC1_MIN*Z_1S2; - pMC->Gsposp("CC2A", 11, "CM12",X_MC2D,Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 12, "CM12",X_MC2D,-Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 13, "CM12",-X_MC2D,Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 14, "CM12",-X_MC2D,-Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - - Y_MC2D=6.*Y_MC1_MIN*Z_1S2; - pMC->Gsposp("CC2A", 15, "CM12",X_MC2D,Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 16, "CM12",X_MC2D,-Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 17, "CM12",-X_MC2D,Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 18, "CM12",-X_MC2D,-Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - - Y_MC2D=8.*Y_MC1_MIN*Z_1S2; - pMC->Gsposp("CC2A", 19, "CM12",X_MC2D,Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 20, "CM12",X_MC2D,-Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 21, "CM12",-X_MC2D,Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC2A", 22, "CM12",-X_MC2D,-Y_MC2D,Z_MC2D, 0, "ONLY", tpar, 3); - - pMC->Gspos("CM12", 1, "ALIC", 0., 0., zpos2, 0, "ONLY"); - -// Station 2 - iChamber=(AliMUONchamber*) (*fChambers)[12]; - Float_t zpos3=iChamber->ZPosition(); - Float_t zpos4=zpos3+DTPLANES; - -// Parameters of the Trigger Chambers - //Station 2 - const Float_t X_MC3_MIN=X_MC1_MIN*zpos3/zpos1; - const Float_t X_MC3_MED=X_MC1_MED*zpos3/zpos1; - const Float_t X_MC3_MAX=X_MC1_MAX*zpos3/zpos1; - const Float_t Y_MC3_MIN=Y_MC1_MIN*zpos3/zpos1; - const Float_t Y_MC3_MAX=Y_MC1_MAX*zpos3/zpos1; - const Float_t R_MIN3=R_MIN1*zpos3/zpos1; - const Float_t R_MAX3=R_MAX1*zpos3/zpos1; - -// Mother volume definition - tpar[0] = iChamber->frMin; - tpar[1] = iChamber->frMax; - tpar[2] = 0.4; - pMC->Gsvolu("CM21", "TUBE", idtmed[1100], tpar, 3); - pMC->Gsvolu("CM22", "TUBE", idtmed[1100], tpar, 3); - -// Definition of the flange between the beam shielding and the RPC - tpar[0]= R_MIN3; - tpar[1]= R_MAX3; - tpar[2]= 0.4; - - pMC->Gsvolu("CF2A", "TUBE", idtmed[1103], tpar, 3); //Al - pMC->Gspos("CF2A", 1, "CM21", 0., 0., 0., 0, "MANY"); - pMC->Gspos("CF2A", 2, "CM22", 0., 0., 0., 0, "MANY"); - -// Definition of prototype for chambers in the third plane - - tpar[0]= 0.; - tpar[1]= 0.; - tpar[2]= 0.; - - pMC->Gsvolu("CC3A", "BOX ", idtmed[1103], tpar, 0); //Al - pMC->Gsvolu("CB3A", "BOX ", idtmed[1107], tpar, 0); //Bakelite - pMC->Gsvolu("CG3A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer - -// chamber type A - tpar[0] = -1.; - tpar[1] = -1.; - - const Float_t X_MC3A=X_MC3_MED+(X_MC3_MAX-X_MC3_MED)/2.; - const Float_t Y_MC3A=0.; - const Float_t Z_MC3A=0.; - - tpar[2] = 0.1; - pMC->Gsposp("CG3A", 1, "CB3A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.3; - pMC->Gsposp("CB3A", 1, "CC3A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[0] = (X_MC3_MAX-X_MC3_MED)/2.; - tpar[1] = Y_MC3_MIN; - tpar[2] = 0.4; - pMC->Gsposp("CC3A", 1, "CM21",X_MC3A,Y_MC3A,Z_MC3A, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 2, "CM21",-X_MC3A,Y_MC3A,Z_MC3A, 0, "ONLY", tpar, 3); - -// chamber type B - tpar[0] = (X_MC3_MAX-X_MC3_MIN)/2.; - tpar[1] = (Y_MC3_MAX-Y_MC3_MIN)/2.; - - const Float_t X_MC3B=X_MC3_MIN+tpar[0]; - const Float_t Y_MC3B=Y_MC3_MIN+tpar[1]; - const Float_t Z_MC3B=0.; - - pMC->Gsposp("CC3A", 3, "CM21",X_MC3B,Y_MC3B,Z_MC3B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 4, "CM21",-X_MC3B,Y_MC3B,Z_MC3B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 5, "CM21",X_MC3B,-Y_MC3B,Z_MC3B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 6, "CM21",-X_MC3B,-Y_MC3B,Z_MC3B, 0, "ONLY", tpar, 3); - -// chamber type C - tpar[0] = X_MC3_MAX/2.; - tpar[1] = Y_MC3_MAX/2.; - - const Float_t X_MC3C=tpar[0]; - const Float_t Y_MC3C=Y_MC3_MAX+tpar[1]; - const Float_t Z_MC3C=0.; - - pMC->Gsposp("CC3A", 7, "CM21",X_MC3C,Y_MC3C,Z_MC3C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 8, "CM21",-X_MC3C,Y_MC3C,Z_MC3C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 9, "CM21",X_MC3C,-Y_MC3C,Z_MC3C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 10, "CM21",-X_MC3C,-Y_MC3C,Z_MC3C, 0, "ONLY", tpar, 3); - -// chamber type D - tpar[0] = X_MC3_MAX/2.; - tpar[1] = Y_MC3_MIN; - - const Float_t X_MC3D=tpar[0]; - const Float_t Z_MC3D=0.; - - Float_t Y_MC3D=4.*Y_MC3_MIN; - pMC->Gsposp("CC3A", 11, "CM21",X_MC3D,Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 12, "CM21",X_MC3D,-Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 13, "CM21",-X_MC3D,Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 14, "CM21",-X_MC3D,-Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - - Y_MC3D=6.*Y_MC3_MIN; - pMC->Gsposp("CC3A", 15, "CM21",X_MC3D,Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 16, "CM21",X_MC3D,-Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 17, "CM21",-X_MC3D,Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 18, "CM21",-X_MC3D,-Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - - Y_MC3D=8.*Y_MC3_MIN; - pMC->Gsposp("CC3A", 19, "CM21",X_MC3D,Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 20, "CM21",X_MC3D,-Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 21, "CM21",-X_MC3D,Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC3A", 22, "CM21",-X_MC3D,-Y_MC3D,Z_MC3D, 0, "ONLY", tpar, 3); - -// Positioning third plane in ALICE - pMC->Gspos("CM21", 1, "ALIC", 0., 0., zpos3, 0, "ONLY"); - -// End of geometry definition for the third plane - -// Station 2 - plan 4 - same RPCs as plan 3 ==> small non covered area -// Y position moved (ratio zpos4/zpos3) - const Float_t Z_3S4=zpos4/zpos3; - -// Definition of prototype for chambers in the fourth plane - - tpar[0]= 0.; - tpar[1]= 0.; - tpar[2]= 0.; - - pMC->Gsvolu("CC4A", "BOX ", idtmed[1103], tpar, 0); //Al - pMC->Gsvolu("CB4A", "BOX ", idtmed[1107], tpar, 0); //Bakelite - pMC->Gsvolu("CG4A", "BOX ", idtmed[1106], tpar, 0); //Gas streamer - -// chamber type A - tpar[0] = -1.; - tpar[1] = -1.; - - const Float_t X_MC4A=X_MC3A; - const Float_t Y_MC4A=0.; - const Float_t Z_MC4A=0.; - - tpar[2] = 0.1; - pMC->Gsposp("CG4A", 1, "CB4A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.3; - pMC->Gsposp("CB4A", 1, "CC4A", 0., 0., 0., 0, "ONLY",tpar,3); - tpar[2] = 0.4; - tpar[0] = (X_MC3_MAX-X_MC3_MED)/2.; - tpar[1] = Y_MC3_MIN; - pMC->Gsposp("CC4A", 1, "CM22",X_MC4A,Y_MC4A,Z_MC4A, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 2, "CM22",-X_MC4A,Y_MC4A,Z_MC4A, 0, "ONLY", tpar, 3); - -// chamber type B - tpar[0] = (X_MC3_MAX-X_MC3_MIN)/2.; - tpar[1] = (Y_MC3_MAX-Y_MC3_MIN)/2.; - - const Float_t X_MC4B=X_MC3B; - const Float_t Y_MC4B=2.*Y_MC3_MIN*Z_3S4-Y_MC3_MIN*1.5+Y_MC3_MAX*0.5; - const Float_t Z_MC4B=0.; - - pMC->Gsposp("CC4A", 3, "CM22",X_MC4B,Y_MC4B,Z_MC4B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 4, "CM22",-X_MC4B,Y_MC4B,Z_MC4B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 5, "CM22",X_MC4B,-Y_MC4B,Z_MC4B, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 6, "CM22",-X_MC4B,-Y_MC4B,Z_MC4B, 0, "ONLY", tpar, 3); - -// chamber type C - tpar[0] = X_MC3_MAX/2; - tpar[1] = Y_MC3_MAX/2; - - const Float_t X_MC4C=X_MC3C; - const Float_t Y_MC4C=2.*Y_MC3_MIN*Z_3S4-Y_MC3_MIN*2.+Y_MC3_MAX*1.5; - const Float_t Z_MC4C=0.; - - pMC->Gsposp("CC4A", 7, "CM22",X_MC4C,Y_MC4C,Z_MC4C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 8, "CM22",-X_MC4C,Y_MC4C,Z_MC4C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 9, "CM22",X_MC4C,-Y_MC4C,Z_MC4C, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 10, "CM22",-X_MC4C,-Y_MC4C,Z_MC4C, 0, "ONLY", tpar, 3); - -// chamber type D - tpar[0] = X_MC3_MAX/2.; - tpar[1] = Y_MC3_MIN; - - const Float_t X_MC4D=X_MC3D; - const Float_t Z_MC4D=0.; - - Float_t Y_MC4D=4.*Y_MC3_MIN*Z_3S4; - pMC->Gsposp("CC4A", 11, "CM22",X_MC4D,Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 12, "CM22",X_MC4D,-Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 13, "CM22",-X_MC4D,Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 14, "CM22",-X_MC4D,-Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); + AliMUONSegmentationV04 *seg71=new AliMUONSegmentationV04; + seg71->SetPadSize(10.,0.5); + seg71->SetDAnod(0.25); + seg71->SetPadDivision(nseg4); + SetSegmentationModel(chamber-1, 1, seg71); + AliMUONSegmentationV05 *seg72=new AliMUONSegmentationV05; + seg72->SetPadSize(1,10); + seg72->SetDAnod(0.25); + seg72->SetPadDivision(nseg4); + SetSegmentationModel(chamber-1, 2, seg72); + + SetResponseModel(chamber-1, response0); + + chamber=8; +//^^^^^^^^^ + SetNsec(chamber-1,2); + AliMUONSegmentationV04 *seg81=new AliMUONSegmentationV04; + seg81->SetPadSize(10., 0.5); + seg81->SetPadDivision(nseg4); + seg81->SetDAnod(0.25); + SetSegmentationModel(chamber-1, 1, seg81); + + AliMUONSegmentationV05 *seg82=new AliMUONSegmentationV05; + seg82->SetPadSize(1, 10); + seg82->SetPadDivision(nseg4); + seg82->SetDAnod(0.25); + SetSegmentationModel(chamber-1, 2, seg82); + + SetResponseModel(chamber-1, response0); +//-------------------------------------------------------- +// Configuration for Chamber TC9/10 (Station 5) --------- +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + chamber=9; +//^^^^^^^^^ + SetNsec(chamber-1,2); +// + AliMUONSegmentationV04 *seg91=new AliMUONSegmentationV04; + seg91->SetPadSize(10.,0.5); + seg91->SetDAnod(0.25); + seg91->SetPadDivision(nseg4); + SetSegmentationModel(chamber-1, 1, seg91); + + AliMUONSegmentationV05 *seg92=new AliMUONSegmentationV05; + seg92->SetPadSize(1,10); + seg92->SetDAnod(0.25); + seg92->SetPadDivision(nseg4); + + SetSegmentationModel(chamber-1, 2, seg92); + + SetResponseModel(chamber-1, response0); + + chamber=10; +//^^^^^^^^^ + SetNsec(chamber-1,2); + AliMUONSegmentationV04 *seg101=new AliMUONSegmentationV04; + seg101->SetPadSize(10., 0.5); + seg101->SetPadDivision(nseg4); + seg101->SetDAnod(0.25); + SetSegmentationModel(chamber-1, 1, seg101); + + AliMUONSegmentationV05 *seg102=new AliMUONSegmentationV05; + seg102->SetPadSize(1,10); + seg102->SetPadDivision(nseg4); + seg102->SetDAnod(0.25); + SetSegmentationModel(chamber-1, 2, seg102); + + SetResponseModel(chamber-1, response0); - Y_MC4D=6.*Y_MC3_MIN*Z_3S4; - pMC->Gsposp("CC4A", 15, "CM22",X_MC4D,Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 16, "CM22",X_MC4D,-Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 17, "CM22",-X_MC4D,Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 18, "CM22",-X_MC4D,-Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); +//-------------------------------------------------------- +// Configuration for Trigger staions --------------------- +//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + AliMUONResponseTrigger* responseTrigger0 = new AliMUONResponseTrigger; + + chamber=11; + SetNsec(chamber-1,2); + AliMUONSegmentationTriggerX *seg111=new AliMUONSegmentationTriggerX; + SetSegmentationModel(chamber-1, 1, seg111); + AliMUONSegmentationTriggerY *seg112=new AliMUONSegmentationTriggerY; + SetSegmentationModel(chamber-1, 2, seg112); + + SetResponseModel(chamber-1, responseTrigger0); + + chamber=12; + SetNsec(chamber-1,2); + AliMUONSegmentationTriggerX *seg121=new AliMUONSegmentationTriggerX; + SetSegmentationModel(chamber-1, 1, seg121); + AliMUONSegmentationTriggerY *seg122=new AliMUONSegmentationTriggerY; + SetSegmentationModel(chamber-1, 2, seg122); + + SetResponseModel(chamber-1, responseTrigger0); + + chamber=13; + SetNsec(chamber-1,2); + AliMUONSegmentationTriggerX *seg131=new AliMUONSegmentationTriggerX; + SetSegmentationModel(chamber-1, 1, seg131); + AliMUONSegmentationTriggerY *seg132=new AliMUONSegmentationTriggerY; + SetSegmentationModel(chamber-1, 2, seg132); + SetResponseModel(chamber-1, responseTrigger0); + + chamber=14; + SetNsec(chamber-1,2); + AliMUONSegmentationTriggerX *seg141=new AliMUONSegmentationTriggerX; + SetSegmentationModel(chamber-1, 1, seg141); + AliMUONSegmentationTriggerY *seg142=new AliMUONSegmentationTriggerY; + SetSegmentationModel(chamber-1, 2, seg142); + + SetResponseModel(chamber-1, responseTrigger0); +} - Y_MC4D=8.*Y_MC3_MIN*Z_3S4; - pMC->Gsposp("CC4A", 19, "CM22",X_MC4D,Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 20, "CM22",X_MC4D,-Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 21, "CM22",-X_MC4D,Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - pMC->Gsposp("CC4A", 22, "CM22",-X_MC4D,-Y_MC4D,Z_MC4D, 0, "ONLY", tpar, 3); - - pMC->Gspos("CM22", 1, "ALIC", 0., 0., zpos4, 0, "ONLY"); +void AliMUONv0::CreateGeometry() +{ +// Creates coarse geometry for hit density simulations + Int_t *idtmed = fIdtmed->GetArray()-1099; +// + Float_t zpos, dAlu, tpar[3]; + Int_t idAir=idtmed[1100]; + Int_t idAlu=idtmed[1103]; + + AliMUONChamber *iChamber; + // Loop over all chambers (tracking and trigger) + for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++) { + char alu[8]; + char gas[8]; + + iChamber=(AliMUONChamber*) (*fChambers)[ch]; + // Z of the chamber + zpos=iChamber->Z(); + dAlu=iChamber->DAlu(); + if (ch < AliMUONConstants::NTrackingCh()) { + // tracking chambers + sprintf(alu,"CA0%1d",ch); + sprintf(gas,"CG0%1d",ch); + } else { + // trigger chambers + sprintf(alu,"CA%2d",ch); + sprintf(gas,"CG%2d",ch); + } +// + printf("\n %d, %s, %s \n ", ch, alu, gas); + + tpar[0] = iChamber->RInner(); + tpar[1] = iChamber->ROuter(); + tpar[2] = (dAlu+0.2)/2.; + if (ch !=4 && ch !=5) { + gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3); + tpar[2] = 0.1; + gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3); + } else { + gMC->Gsvolu(alu, "TUBE", idAlu, tpar, 3); + tpar[2] = 0.1; + gMC->Gsvolu(gas, "TUBE", idAir, tpar, 3); + } + gMC->Gspos(gas, 1, alu, 0., 0., 0., 0, "ONLY"); + gMC->Gspos(alu, 1, "ALIC", 0., 0., zpos, 0, "ONLY"); + iChamber->SetGid(gMC->VolId(gas)); + } } - //___________________________________________ void AliMUONv0::CreateMaterials() { - // *** DEFINITION OF AVAILABLE MUON MATERIALS *** - // - // Ar-CO2 gas - Float_t ag1[3] = { 39.95,12.01,16. }; - Float_t zg1[3] = { 18.,6.,8. }; - Float_t wg1[3] = { .8,.0667,.13333 }; - Float_t dg1 = .001821; - // - // Ar-buthane-freon gas -- trigger chambers - Float_t atr1[4] = { 39.95,12.01,1.01,19. }; - Float_t ztr1[4] = { 18.,6.,1.,9. }; - Float_t wtr1[4] = { .56,.1262857,.2857143,.028 }; - Float_t dtr1 = .002599; - // - // Ar-CO2 gas - Float_t agas[3] = { 39.95,12.01,16. }; - Float_t zgas[3] = { 18.,6.,8. }; - Float_t wgas[3] = { .74,.086684,.173316 }; - Float_t dgas = .0018327; - // - // Ar-Isobutane gas (80%+20%) -- tracking - Float_t ag[3] = { 39.95,12.01,1.01 }; - Float_t zg[3] = { 18.,6.,1. }; - Float_t wg[3] = { .8,.057,.143 }; - Float_t dg = .0019596; - // - // Ar-Isobutane-Forane-SF6 gas (49%+7%+40%+4%) -- trigger - Float_t atrig[5] = { 39.95,12.01,1.01,19.,32.066 }; - Float_t ztrig[5] = { 18.,6.,1.,9.,16. }; - Float_t wtrig[5] = { .49,1.08,1.5,1.84,0.04 }; - Float_t dtrig = .0031463; - // - // bakelite - - Float_t abak[3] = {12.01 , 1.01 , 16.}; - Float_t zbak[3] = {6. , 1. , 8.}; - Float_t wbak[3] = {6. , 6. , 1.}; - Float_t dbak = 1.4; - - Float_t epsil, stmin, deemax, tmaxfd, stemax; - - Int_t ISXFLD = gAlice->Field()->Integ(); - Float_t SXMGMX = gAlice->Field()->Max(); - // - // --- Define the various materials for GEANT --- - AliMaterial(9, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2); +// Creates materials for coarse geometry AliMaterial(15, "AIR$ ", 14.61, 7.3, .001205, 30423.24, 67500); - AliMixture(19, "Bakelite$", abak, zbak, dbak, -3, wbak); - AliMixture(20, "ArC4H10 GAS$", ag, zg, dg, 3, wg); - AliMixture(21, "TRIG GAS$", atrig, ztrig, dtrig, -5, wtrig); - AliMixture(22, "ArCO2 80%$", ag1, zg1, dg1, 3, wg1); - AliMixture(23, "Ar-freon $", atr1, ztr1, dtr1, 4, wtr1); - AliMixture(24, "ArCO2 GAS$", agas, zgas, dgas, 3, wgas); + AliMaterial(9, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2); - epsil = .001; // Tracking precision, - stemax = -1.; // Maximum displacement for multiple scat - tmaxfd = -20.; // Maximum angle due to field deflection - deemax = -.3; // Maximum fractional energy loss, DLS - stmin = -.8; - // - // Air - AliMedium(1101, "AIR_CH_US ", 15, 1, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); - // - // Aluminum + Float_t epsil = .001; // Tracking precision, + Float_t stemax = -1.; // Maximum displacement for multiple scat + Float_t tmaxfd = -20.; // Maximum angle due to field deflection + Float_t deemax = -.3; // Maximum fractional energy loss, DLS + Float_t stmin = -.8; + Int_t isxfld = gAlice->Field()->Integ(); + Float_t sxmgmx = gAlice->Field()->Max(); - AliMedium(1104, "ALU_CH_US ", 9, 0, ISXFLD, SXMGMX, tmaxfd, fMaxStepAlu, - fMaxDestepAlu, epsil, stmin); // - // Ar-isoC4H10 gas - - AliMedium(1106, "AR_CH_US ", 20, 1, ISXFLD, SXMGMX, tmaxfd, fMaxStepGas, - fMaxDestepGas, epsil, stmin); -// - // Ar-Isobuthane-Forane-SF6 gas - - AliMedium(1107, "GAS_CH_TRIGGER ", 21, 1, ISXFLD, SXMGMX, tmaxfd, stemax, deemax, epsil, stmin); - - AliMedium(1108, "BAKE_CH_TRIGGER ", 19, 0, ISXFLD, SXMGMX, tmaxfd, fMaxStepAlu, + // Air + AliMedium(1, "AIR_CH_US ", 15, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin); + AliMedium(4, "ALU_CH_US ", 9, 0, isxfld, sxmgmx, tmaxfd, fMaxStepAlu, fMaxDestepAlu, epsil, stmin); } -//___________________________________________ - void AliMUONv0::Init() { - printf("\n\n\n Start Init for version 0 - CPC chamber type\n\n\n"); - // // Initialize Tracking Chambers // - for (Int_t i=0; iInit(); - } - // - // Set the chamber (sensitive region) GEANT identifier - AliMC* pMC = AliMC::GetMC(); - ((AliMUONchamber*)(*fChambers)[0])->SetGid(pMC->VolId("C01G")); - ((AliMUONchamber*)(*fChambers)[1])->SetGid(pMC->VolId("C02G")); - ((AliMUONchamber*)(*fChambers)[2])->SetGid(pMC->VolId("C03G")); - ((AliMUONchamber*)(*fChambers)[3])->SetGid(pMC->VolId("C04G")); - ((AliMUONchamber*)(*fChambers)[4])->SetGid(pMC->VolId("C05G")); - ((AliMUONchamber*)(*fChambers)[5])->SetGid(pMC->VolId("C06G")); - ((AliMUONchamber*)(*fChambers)[6])->SetGid(pMC->VolId("C07G")); - ((AliMUONchamber*)(*fChambers)[7])->SetGid(pMC->VolId("C08G")); - ((AliMUONchamber*)(*fChambers)[8])->SetGid(pMC->VolId("C09G")); - ((AliMUONchamber*)(*fChambers)[9])->SetGid(pMC->VolId("C10G")); - ((AliMUONchamber*)(*fChambers)[10])->SetGid(pMC->VolId("CG1A")); - ((AliMUONchamber*)(*fChambers)[11])->SetGid(pMC->VolId("CG2A")); - ((AliMUONchamber*)(*fChambers)[12])->SetGid(pMC->VolId("CG3A")); - ((AliMUONchamber*)(*fChambers)[13])->SetGid(pMC->VolId("CG4A")); - printf("\n\n\n Finished Init for version 0 - CPC chamber type\n\n\n"); + printf("\n\n\n Start Init for version 0 - CPC chamber type\n\n\n"); + for (Int_t i=0; iInit(); + } } -//___________________________________________ void AliMUONv0::StepManager() { +// +// Step manager for hit density simulations Int_t copy, id; static Int_t idvol; static Int_t vol[2]; Int_t ipart; - static Float_t hits[10]; - Float_t pos[3]; - Float_t mom[4]; + TLorentzVector pos; + TLorentzVector mom; Float_t theta,phi; - Float_t destep, step; - static Float_t eloss, xhit, yhit, tlength; - const Float_t big=1.e10; - TClonesArray &lhits = *fHits; - AliMC* pMC = AliMC::GetMC(); + // modifs perso + static Float_t hits[15]; - // - // Set maximum step size for gas - // numed=pMC->GetMedium(); - // - // Only charged tracks - if( !(pMC->TrackCharge()) ) return; + TClonesArray &lhits = *fHits; // // Only gas gap inside chamber // Tag chambers and record hits when track enters idvol=-1; - id=pMC->CurrentVol(0,copy); + id=gMC->CurrentVolID(copy); - for (Int_t i=1; i<=NCH; i++) { - if(id==((AliMUONchamber*)(*fChambers)[i-1])->GetGid()){ + for (Int_t i=1; i<=AliMUONConstants::NCh(); i++) { + if(id==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()){ vol[0]=i; idvol=i-1; } @@ -1331,418 +501,41 @@ void AliMUONv0::StepManager() if (idvol == -1) return; // // Get current particle id (ipart), track position (pos) and momentum (mom) - pMC->TrackPosition(pos); - pMC->TrackMomentum(mom); + gMC->TrackPosition(pos); + gMC->TrackMomentum(mom); - ipart = pMC->TrackPid(); - // - // momentum loss and steplength in last step - destep = pMC->Edep(); - step = pMC->TrackStep(); - + ipart = gMC->TrackPid(); // // record hits when track enters ... - if( pMC->TrackEntering()) { - pMC->SetMaxStep(fMaxStepGas); +// if( !(gMC->TrackCharge()) ) return; + if( gMC->IsTrackEntering()) { Double_t tc = mom[0]*mom[0]+mom[1]*mom[1]; Double_t rt = TMath::Sqrt(tc); theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg; phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg; - hits[0] = Float_t(ipart); // Geant3 particle type - hits[1] = pos[0]; // X-position for hit - hits[2] = pos[1]; // Y-position for hit - hits[3] = pos[2]; // Z-position for hit - hits[4] = theta; // theta angle of incidence - hits[5] = phi; // phi angle of incidence - hits[8] = (Float_t) fNclusters; // first padhit - hits[9] = -1; // last pad hit - // phi angle of incidence - tlength = 0; - eloss = 0; - xhit = pos[0]; - yhit = pos[1]; - // Only if not trigger chamber - if(idvol<10) { - // - // Initialize hit position (cursor) in the segmentation model - ((AliMUONchamber*) (*fChambers)[idvol]) - ->SigGenInit(pos[0], pos[1], pos[2]); - } else { - //geant3->Gpcxyz(); - //printf("In the Trigger Chamber #%d\n",idvol-9); - } - } - - // - // Calculate the charge induced on a pad (disintegration) in case - // - // Mip left chamber ... - if( pMC->TrackExiting() || pMC->TrackStop() || pMC->TrackDisappear()){ - pMC->SetMaxStep(big); - eloss += destep; - tlength += step; + hits[0] = Float_t(ipart); // Geant3 particle type + hits[1] = pos[0]; // X-position for hit + hits[2] = pos[1]; // Y-position for hit + hits[3] = pos[2]; // Z-position for hit + hits[4] = theta; // theta angle of incidence + hits[5] = phi; // phi angle of incidence + hits[8] = -1; // first padhit + hits[9] = -1; // last pad hit + + // modifs personel + hits[10] = mom[3]; // hit Energy + hits[11] = mom[0]; // Px + hits[12] = mom[1]; // Py + hits[13] = mom[2]; // Pz + hits[14] = gMC->TrackTime(); - // Only if not trigger chamber - if(idvol<10) { - if (eloss > 0) MakePadHits(xhit,yhit,eloss,idvol); - } - - hits[6]=tlength; - hits[7]=eloss; - if (fNclusters > (Int_t)hits[8]) { - hits[8]= hits[8]+1; - hits[9]= (Float_t) fNclusters; - } - + // fin modifs perso new(lhits[fNhits++]) - AliMUONhit(fIshunt,gAlice->CurrentTrack(),vol,hits); - eloss = 0; - // - // Check additional signal generation conditions - // defined by the segmentation - // model (boundary crossing conditions) - } else if - (((AliMUONchamber*) (*fChambers)[idvol]) - ->SigGenCond(pos[0], pos[1], pos[2])) - { - ((AliMUONchamber*) (*fChambers)[idvol]) - ->SigGenInit(pos[0], pos[1], pos[2]); -// printf("\n-> MakePadHits, reason special %d",ipart); - if (eloss > 0) MakePadHits(xhit,yhit,eloss,idvol); - xhit = pos[0]; - yhit = pos[1]; - eloss = destep; - tlength += step ; - // - // nothing special happened, add up energy loss - } else { - eloss += destep; - tlength += step ; - } -} + AliMUONHit(fIshunt,gAlice->CurrentTrack(),vol,hits); -//___________________________________________ -void AliMUON::MakePadHits(Float_t xhit,Float_t yhit,Float_t eloss, Int_t idvol) -{ -// -// Calls the charge disintegration method of the current chamber and adds -// the simulated cluster to the root treee -// - Int_t clhits[7]; - Float_t newclust[6][500]; - Int_t nnew; - - -// -// Integrated pulse height on chamber - - - clhits[0]=fNhits+1; -// -// - ((AliMUONchamber*) (*fChambers)[idvol])->DisIntegration(eloss, xhit, yhit, nnew, newclust); -// printf("\n Add new clusters %d %f", nnew, eloss*1.e9); - Int_t ic=0; - -// -// Add new clusters - for (Int_t i=0; i 0) { - ic++; -// Cathode plane - clhits[1] = Int_t(newclust[5][i]); -// Cluster Charge - clhits[2] = Int_t(newclust[0][i]); -// Pad: ix - clhits[3] = Int_t(newclust[1][i]); -// Pad: iy - clhits[4] = Int_t(newclust[2][i]); -// Pad: charge - clhits[5] = Int_t(newclust[3][i]); -// Pad: chamber sector - clhits[6] = Int_t(newclust[4][i]); - - AddCluster(clhits); - } - } -// printf("\n %d new clusters added", ic); -} - -ClassImp(AliMUONchamber) - AliMUONchamber::AliMUONchamber() -{ - fSegmentation = new TObjArray(2); - fResponse=0; - fnsec=1; -} - -void AliMUONchamber::Init() -{ - - ((AliMUONsegmentation *) (*fSegmentation)[0])->Init(this); - if (fnsec==2) { - ((AliMUONsegmentation *) (*fSegmentation)[1])->Init(this); - } - -} - -void AliMUONchamber::DisIntegration(Float_t eloss, Float_t xhit, Float_t yhit, - Int_t& nnew,Float_t newclust[6][500]) -{ -// -// Generates pad hits (simulated cluster) -// using the segmentation and the response model - Float_t dx, dy; - // - // Width of the integration area - // - dx=fResponse->Nsigma()*fResponse->ChwX(); - dy=fResponse->Nsigma()*fResponse->ChwY(); - // - // Get pulse height from energy loss - Float_t qtot = fResponse->IntPH(eloss); - // - // Loop Over Pads - - Float_t qcheck=0, qp; - nnew=0; - for (Int_t i=1; i<=fnsec; i++) { - qcheck=0; - AliMUONsegmentation * segmentation=(AliMUONsegmentation *) (*fSegmentation)[i-1]; - for (segmentation->FirstPad(xhit, yhit, dx, dy); - segmentation->MorePads(); - segmentation->NextPad()) - { - qp=fResponse->IntXY(segmentation); - qp=TMath::Abs(qp); - -// -// - if (qp > 1.e-4) { - qcheck+=qp; - // - // --- store signal information - newclust[0][nnew]=qtot; - newclust[1][nnew]=segmentation->Ix(); - newclust[2][nnew]=segmentation->Iy(); - newclust[3][nnew]=qp * qtot; - newclust[4][nnew]=segmentation->ISector(); - newclust[5][nnew]=(Float_t) i; -// printf("\n pad hit %d %d %f %f ",nnew,i,newclust[1][nnew],newclust[2][nnew]); - nnew++; - - - } - } // Pad loop -// printf("\n check sum is %f %f %f %f %d",qcheck,qtot,xhit,yhit,fGid); - } // Cathode plane loop -} - - -ClassImp(AliMUONsegmentation) -ClassImp(AliMUONresponse) -//___________________________________________ -ClassImp(AliMUONsegmentationV0) - void AliMUONsegmentationV0::Init(AliMUONchamber* Chamber) -{ - fNpx=(Int_t) (Chamber->frMax/fDpx+1); - fNpy=(Int_t) (Chamber->frMax/fDpy+1); -} - - -Float_t AliMUONsegmentationV0::GetAnod(Float_t xhit) -{ - Float_t wire= (xhit<0)? Int_t(xhit/fWireD)+0.5:Int_t(xhit/fWireD)-0.5; - return fWireD*wire; -} - -void AliMUONsegmentationV0::SetPADSIZ(Float_t p1, Float_t p2) -{ - fDpx=p1; - fDpy=p2; -} -void AliMUONsegmentationV0:: - GetPadIxy(Float_t x, Float_t y, Int_t &ix, Int_t &iy) -{ -// returns pad coordinates (ix,iy) for given real coordinates (x,y) -// - ix = (x>0)? Int_t(x/fDpx)+1 : Int_t(x/fDpx)-1; - iy = (y>0)? Int_t(y/fDpy)+1 : Int_t(y/fDpy)-1; - if (iy > fNpy) iy= fNpy; - if (iy < -fNpy) iy=-fNpy; - if (ix > fNpx) ix= fNpx; - if (ix < -fNpx) ix=-fNpx; -} -void AliMUONsegmentationV0:: -GetPadCxy(Int_t ix, Int_t iy, Float_t &x, Float_t &y) -{ -// returns real coordinates (x,y) for given pad coordinates (ix,iy) -// - x = (ix>0) ? Float_t(ix*fDpx)-fDpx/2. : Float_t(ix*fDpx)+fDpx/2.; - y = (iy>0) ? Float_t(iy*fDpy)-fDpy/2. : Float_t(iy*fDpy)+fDpy/2.; -} - -void AliMUONsegmentationV0:: -FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy) -{ - // - // Find the wire position (center of charge distribution) - Float_t x0a=GetAnod(xhit); - // - // and take fNsigma*sigma around this center - Float_t x01=x0a - dx; - Float_t x02=x0a + dx; - Float_t y01=yhit - dy; - Float_t y02=yhit + dy; - // - // find the pads over which the charge distributes - GetPadIxy(x01,y01,fixmin,fiymin); - GetPadIxy(x02,y02,fixmax,fiymax); -// printf("\n %f %f %d %d",x02,y02,fixmax,fiymax); -// printf("\n FirstPad called %f %f ", fDpx, fDpy); -// printf("\n Hit Position %f %f",xhit,yhit); -// printf("\n Integration limits: %i %i %i %i",fixmin,fixmax,fiymin,fiymax); -// printf("\n Integration limits: %f %f %f %f \n",x01,x02,y01,y02); - // - // Set current pad to lower left corner - fix=fixmin; - fiy=fiymin; - GetPadCxy(fix,fiy,fx,fy); -} - -void AliMUONsegmentationV0::NextPad() -{ - // - // Step to next pad in integration region - if (fix != fixmax) { - fix++; - } else if (fiy != fiymax) { - fix=fixmin; - fiy++; - } else { - printf("\n Error: Stepping outside integration region\n "); - } - GetPadCxy(fix,fiy,fx,fy); -} - -Int_t AliMUONsegmentationV0::MorePads() -// -// Are there more pads in the integration region -{ - if (fix == fixmax && fiy == fiymax) { - return 0; - } else { - return 1; - - } -} - -void AliMUONsegmentationV0::SigGenInit(Float_t x,Float_t y,Float_t) -{ -// -// Initialises pad and wire position during stepping - fxt =x; - fyt =y; - GetPadIxy(x,y,fixt,fiyt); - fiwt=Int_t(x/fWireD)+1; -} - -Int_t AliMUONsegmentationV0::SigGenCond(Float_t x,Float_t y,Float_t) -{ -// -// Signal will be generated if particle crosses pad boundary or -// boundary between two wires. - Int_t ixt, iyt; - GetPadIxy(x,y,ixt,iyt); - Int_t iwt=Int_t(x/fWireD)+1; - - if ((ixt != fixt) || (iyt !=fiyt) || (iwt != fiwt)) { - return 1; - } else { - return 0; - } -} -void AliMUONsegmentationV0:: -IntegrationLimits(Float_t& x1,Float_t& x2,Float_t& y1, Float_t& y2) -{ - x1=fxt-fx-fDpx/2.; - x2=x1+fDpx; - y1=fyt-fy-fDpy/2.; - y2=y1+fDpy; -} - -void AliMUONsegmentationV0:: -Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[7], Int_t Ylist[7]) -{ - *Nlist=4;Xlist[0]=Xlist[1]=iX;Xlist[2]=iX-1;Xlist[3]=iX+1; - Ylist[0]=iY-1;Ylist[1]=iY+1;Ylist[2]=Ylist[3]=iY; -} - -void AliMUONsegmentationV0:: -FitXY(AliMUONRecCluster* ,TClonesArray* ) - // Default : Centre of gravity method -{ - ; -} - - -//___________________________________________ -ClassImp(AliMUONresponseV0) -Float_t AliMUONresponseV0::IntPH(Float_t eloss) -{ - // Get number of electrons and return charge - - Int_t nel; - nel= Int_t(eloss*1.e9/26.); - Float_t charge=0; - if (nel == 0) nel=1; - for (Int_t i=1;i<=nel;i++) { - charge -= fChslope*TMath::Log(gRandom->Rndm()); } - return charge; -} -// ------------------------------------------- -Float_t AliMUONresponseV0::IntXY(AliMUONsegmentation * segmentation) -{ - - const Float_t invpitch = 1/fPitch; -// -// Integration limits defined by segmentation model -// - Float_t xi1, xi2, yi1, yi2; - segmentation->IntegrationLimits(xi1,xi2,yi1,yi2); - xi1=xi1*invpitch; - xi2=xi2*invpitch; - yi1=yi1*invpitch; - yi2=yi2*invpitch; -// -// The Mathieson function - Double_t ux1=fSqrtKx3*TMath::TanH(fKx2*xi1); - Double_t ux2=fSqrtKx3*TMath::TanH(fKx2*xi2); - - Double_t uy1=fSqrtKy3*TMath::TanH(fKy2*yi1); - Double_t uy2=fSqrtKy3*TMath::TanH(fKy2*yi2); - - - return Float_t(4.*fKx4*(TMath::ATan(ux2)-TMath::ATan(ux1))* - fKy4*(TMath::ATan(uy2)-TMath::ATan(uy1))); } -// ------------------------------------------- -ClassImp(AliMUONgeometry) - void AliMUONgeometry::InitGeo(Float_t) -{ - fdGas= 0.5; - fdAlu= 2.5/100*8.9; -} - - - - - - - -