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 /* $Id: AliEMCALEMCGeometry.cxx 29514 2008-10-26 10:24:38Z hristov $*/
18 //_________________________________________________________________________
19 // Geometry class for EMCAL : singleton
20 // EMCAL consists of layers of scintillator and lead
21 // with scintillator fiber arranged as "shish-kebab" skewers
22 // Places the the Barrel Geometry of The EMCAL at Midrapidity
23 // between 80 and 180(or 190) degrees of Phi and
26 // EMCAL geometry tree:
27 // EMCAL -> superModule -> module -> tower(cell)
29 // absId -> nSupMod -> nModule -> (nIphi,nIeta)
32 // EMCAL_PDC06 (geometry used for PDC06 simulations, kept for backward compatibility)
33 // = equivalent to SHISH_77_TRD1_2X2_FINAL_110DEG in old notation
34 // EMCAL_COMPLETE (geometry for expected complete detector)
35 // = equivalent to SHISH_77_TRD1_2X2_FINAL_110DEG scTh=0.176 pbTh=0.144
38 // EMCAL_FIRSTYEAR - geometry for December 2009 to December 2010 run period
39 // with four Super Modules
41 // Adding V1 (EMCAL_FIRSTYEARV1, EMCAL_COMPLETEV1) - geometry from December 2009 ;
42 // 1. Fixed bug for positions of modules inside SM
43 // (first module has tilt 0.75 degree);
44 // 2. Added Al front plate (width 1 cm) and 2 paper sheets per sampling
45 // layer (additional 0.2 mm)
46 // The sizes have updated with last information from production
47 // drawing (end of October 2010).
48 // 3. COMPLETEV1 contains now only 10 SM for runs for year 2011
49 // 4. COMPLETE12SMV1 contains 12 SM for runs from year 2012 and on
51 // EMCAL_WSUC (Wayne State test stand)
52 // = no definite equivalent in old notation, was only used by
53 // Aleksei, but kept for testing purposes
59 //*-- Author: Sahal Yacoob (LBL / UCT)
60 // and : Yves Schutz (SUBATECH)
61 // and : Jennifer Klay (LBL)
62 // and : Aleksei Pavlinov (WSU)
63 // and : Magali Estienne (SUBATECH)
65 // --- Root header files ---
66 #include <TObjArray.h>
67 #include <TObjString.h>
74 #include "AliEMCALEMCGeometry.h"
77 ClassImp(AliEMCALEMCGeometry)
79 // these initialisations are needed for a singleton
80 Bool_t AliEMCALEMCGeometry::fgInit = kFALSE;
81 const Char_t* AliEMCALEMCGeometry::fgkDefaultGeometryName = "EMCAL_COMPLETE12SMV1";
84 AliEMCALEMCGeometry::AliEMCALEMCGeometry()
86 fGeoName(0),fArrayOpts(0),fNAdditionalOpts(0),fECPbRadThickness(0.),fECScintThick(0.),
87 fNECLayers(0),fArm1PhiMin(0.),fArm1PhiMax(0.),fArm1EtaMin(0.),fArm1EtaMax(0.),fIPDistance(0.),
88 fShellThickness(0.),fZLength(0.),fNZ(0),fNPhi(0),fSampling(0.),fNumberOfSuperModules(0),
89 fFrontSteelStrip(0.),fLateralSteelStrip(0.),fPassiveScintThick(0.),fPhiModuleSize(0.),
90 fEtaModuleSize(0.),fPhiTileSize(0.),fEtaTileSize(0.),fLongModuleSize(0.),fNPhiSuperModule(0),
91 fNPHIdiv(0),fNETAdiv(0), fNCells(0),fNCellsInSupMod(0),fNCellsInModule(0),
93 fNTRUEta(0), fNTRUPhi(0), fNModulesInTRUEta(0), fNModulesInTRUPhi(0), fNEtaSubOfTRU(0),
95 fTrd1Angle(0.),f2Trd1Dx2(0.),
96 fPhiGapForSM(0.),fKey110DEG(0),fPhiBoundariesOfSM(0), fPhiCentersOfSM(0),fEtaMaxOfTRD1(0),
97 fTrd1AlFrontThick(0.0), fTrd1BondPaperThick(0.),
98 fCentersOfCellsEtaDir(0), fCentersOfCellsXDir(0),fCentersOfCellsPhiDir(0),
99 fEtaCentersOfCells(0),fPhiCentersOfCells(0),fShishKebabTrd1Modules(0),
100 fParSM(), fILOSS(-1), fIHADR(-1),
101 //obsolete member data
102 fGap2Active(0.), fSteelFrontThick(0.), fTrd2AngleY(0.),
103 f2Trd2Dy2(0.), fEmptySpace(0.), fTubsR(0.), fTubsTurnAngle(0.)
105 // default ctor only for internal usage (singleton)
106 // must be kept public for root persistency purposes,
107 // but should never be called by the outside world
108 fParSM[0]=0; fParSM[1]=0; fParSM[2]=0;
109 fEnvelop[0] = 0; fEnvelop[1] = 0; fEnvelop[2] = 0;
110 for(Int_t i = 0; i < 6; i++) fkAdditionalOpts[i] = "";
112 AliDebug(2, "AliEMCALEMCGeometry : default ctor ");
114 //______________________________________________________________________
115 AliEMCALEMCGeometry::AliEMCALEMCGeometry(const Text_t* name, const Text_t* title,
116 const Text_t* mcname, const Text_t* mctitle ) :
118 fGeoName(0),fArrayOpts(0),fNAdditionalOpts(0),fECPbRadThickness(0.),fECScintThick(0.),
119 fNECLayers(0),fArm1PhiMin(0.),fArm1PhiMax(0.),fArm1EtaMin(0.),fArm1EtaMax(0.),fIPDistance(0.),
120 fShellThickness(0.),fZLength(0.),fNZ(0),fNPhi(0),fSampling(0.),fNumberOfSuperModules(0),
121 fFrontSteelStrip(0.),fLateralSteelStrip(0.),fPassiveScintThick(0.),fPhiModuleSize(0.),
122 fEtaModuleSize(0.),fPhiTileSize(0.),fEtaTileSize(0.),fLongModuleSize(0.),fNPhiSuperModule(0),
123 fNPHIdiv(0),fNETAdiv(0), fNCells(0),fNCellsInSupMod(0),fNCellsInModule(0),
125 fNTRUEta(0), fNTRUPhi(0), fNModulesInTRUEta(0), fNModulesInTRUPhi(0), fNEtaSubOfTRU(0),
127 fTrd1Angle(0.),f2Trd1Dx2(0.),
128 fPhiGapForSM(0.),fKey110DEG(0),fPhiBoundariesOfSM(0), fPhiCentersOfSM(0), fEtaMaxOfTRD1(0),
129 fTrd1AlFrontThick(0.0), fTrd1BondPaperThick(0.),
130 fCentersOfCellsEtaDir(0),fCentersOfCellsXDir(0),fCentersOfCellsPhiDir(0),
131 fEtaCentersOfCells(0),fPhiCentersOfCells(0),fShishKebabTrd1Modules(0),
132 fParSM(),fILOSS(-1), fIHADR(-1),
133 //obsolete member data
134 fGap2Active(0.), fSteelFrontThick(0.), fTrd2AngleY(0.),
135 f2Trd2Dy2(0.), fEmptySpace(0.), fTubsR(0.), fTubsTurnAngle(0.)
137 // ctor only for internal usage (singleton)
138 AliDebug(2, Form("AliEMCALEMCGeometry(%s,%s,%s,%s) ", name,title,mcname,mctitle));
140 Init(mcname,mctitle);
142 // CreateListOfTrd1Modules();
144 if (AliDebugLevel()>=2) {
149 //______________________________________________________________________
150 AliEMCALEMCGeometry::AliEMCALEMCGeometry(const AliEMCALEMCGeometry& geom)
152 fGeoName(geom.fGeoName),
153 fArrayOpts(geom.fArrayOpts),
154 fNAdditionalOpts(geom.fNAdditionalOpts),
155 fECPbRadThickness(geom.fECPbRadThickness),
156 fECScintThick(geom.fECScintThick),
157 fNECLayers(geom.fNECLayers),
158 fArm1PhiMin(geom.fArm1PhiMin),
159 fArm1PhiMax(geom.fArm1PhiMax),
160 fArm1EtaMin(geom.fArm1EtaMin),
161 fArm1EtaMax(geom.fArm1EtaMax),
162 fIPDistance(geom.fIPDistance),
163 fShellThickness(geom.fShellThickness),
164 fZLength(geom.fZLength),
167 fSampling(geom.fSampling),
168 fNumberOfSuperModules(geom.fNumberOfSuperModules),
169 fFrontSteelStrip(geom.fFrontSteelStrip),
170 fLateralSteelStrip(geom.fLateralSteelStrip),
171 fPassiveScintThick(geom.fPassiveScintThick),
172 fPhiModuleSize(geom.fPhiModuleSize),
173 fEtaModuleSize(geom.fEtaModuleSize),
174 fPhiTileSize(geom.fPhiTileSize),
175 fEtaTileSize(geom.fEtaTileSize),
176 fLongModuleSize(geom.fLongModuleSize),
177 fNPhiSuperModule(geom.fNPhiSuperModule),
178 fNPHIdiv(geom.fNPHIdiv),
179 fNETAdiv(geom.fNETAdiv),
180 fNCells(geom.fNCells),
181 fNCellsInSupMod(geom.fNCellsInSupMod),
182 fNCellsInModule(geom.fNCellsInModule),
184 fNTRUEta(geom.fNTRUEta),
185 fNTRUPhi(geom.fNTRUPhi),
186 fNModulesInTRUEta(geom.fNModulesInTRUEta),
187 fNModulesInTRUPhi(geom.fNModulesInTRUPhi),
188 fNEtaSubOfTRU(geom.fNEtaSubOfTRU),
190 fTrd1Angle(geom.fTrd1Angle),
191 f2Trd1Dx2(geom.f2Trd1Dx2),
192 fPhiGapForSM(geom.fPhiGapForSM),
193 fKey110DEG(geom.fKey110DEG),
194 fPhiBoundariesOfSM(geom.fPhiBoundariesOfSM),
195 fPhiCentersOfSM(geom.fPhiCentersOfSM),
196 fEtaMaxOfTRD1(geom.fEtaMaxOfTRD1),
197 fTrd1AlFrontThick(geom.fTrd1AlFrontThick),
198 fTrd1BondPaperThick(geom.fTrd1BondPaperThick),
199 fCentersOfCellsEtaDir(geom.fCentersOfCellsEtaDir),
200 fCentersOfCellsXDir(geom.fCentersOfCellsXDir),
201 fCentersOfCellsPhiDir(geom.fCentersOfCellsPhiDir),
202 fEtaCentersOfCells(geom.fEtaCentersOfCells),
203 fPhiCentersOfCells(geom.fPhiCentersOfCells),
204 fShishKebabTrd1Modules(geom.fShishKebabTrd1Modules),
205 fILOSS(geom.fILOSS), fIHADR(geom.fIHADR),
206 //obsolete member data
207 fGap2Active(geom.fGap2Active),
208 fSteelFrontThick(geom.fSteelFrontThick),
209 fTrd2AngleY(geom.fTrd2AngleY),
210 f2Trd2Dy2(geom.f2Trd2Dy2),
211 fEmptySpace(geom.fEmptySpace),
213 fTubsTurnAngle(geom.fTubsTurnAngle)
216 fParSM[0]=geom.fParSM[0];
217 fParSM[1]=geom.fParSM[1];
218 fParSM[2]=geom.fParSM[2];
219 fEnvelop[0] = geom.fEnvelop[0];
220 fEnvelop[1] = geom.fEnvelop[1];
221 fEnvelop[2] = geom.fEnvelop[2];
222 for(Int_t i = 0; i < 6; i++) fkAdditionalOpts[i] = geom.fkAdditionalOpts[i];
226 //______________________________________________________________________
227 AliEMCALEMCGeometry::~AliEMCALEMCGeometry(void){
231 //______________________________________________________________________
232 void AliEMCALEMCGeometry::Init(const Text_t* mcname, const Text_t* mctitle){
234 // Initializes the EMCAL parameters based on the name
235 // Only Shashlyk geometry is available, but various combinations of
236 // layers and number of supermodules can be selected with additional
237 // options or geometry name
240 fkAdditionalOpts[0] = "nl="; // number of sampling layers (fNECLayers)
241 fkAdditionalOpts[1] = "pbTh="; // cm, Thickness of the Pb (fECPbRadThick)
242 fkAdditionalOpts[2] = "scTh="; // cm, Thickness of the Sc (fECScintThick)
243 fkAdditionalOpts[3] = "latSS="; // cm, Thickness of lateral steel strip (fLateralSteelStrip)
244 fkAdditionalOpts[4] = "allILOSS="; // = 0,1,2,3,4 (4 - energy loss without fluctuation)
245 fkAdditionalOpts[5] = "allIHADR="; // = 0,1,2 (0 - no hadronic interaction)
247 fNAdditionalOpts = sizeof(fkAdditionalOpts) / sizeof(char*);
250 fgInit = kFALSE; // Assume failed until proven otherwise.
251 fGeoName = GetName();
254 //Convert old geometry names to new ones
255 if(fGeoName.Contains("SHISH_77_TRD1_2X2_FINAL_110DEG")) {
256 if(fGeoName.Contains("PBTH=0.144") && fGeoName.Contains("SCTH=0.176")) {
257 fGeoName = "EMCAL_COMPLETE";
259 fGeoName = "EMCAL_PDC06";
263 if(fGeoName.Contains("WSUC")) fGeoName = "EMCAL_WSUC";
265 //check that we have a valid geometry name
266 if(!( fGeoName.Contains("EMCAL_PDC06") || fGeoName.Contains("EMCAL_WSUC")
267 || fGeoName.Contains("EMCAL_COMPLETE") || fGeoName.Contains("EMCAL_COMPLETEV1") || fGeoName.Contains("EMCAL_COMPLETE12SMV1")
268 || fGeoName.Contains("EMCAL_FIRSTYEAR") || fGeoName.Contains("EMCAL_FIRSTYEARV1") )) {
269 Fatal("Init", "%s is an undefined geometry!", fGeoName.Data()) ;
272 // Option to know whether we have the "half" supermodule(s) or not
274 if(fGeoName.Contains("COMPLETE") || fGeoName.Contains("PDC06") || fGeoName.Contains("12SM")) fKey110DEG = 1; // for GetAbsCellId
275 if(fGeoName.Contains("COMPLETEV1")) fKey110DEG = 0;
276 fShishKebabTrd1Modules = 0;
279 //default parameters are those of EMCAL_COMPLETE geometry
280 //all others render variations from these at the end of
281 //geometry-name specific options
283 fNumberOfSuperModules = 12; // 12 = 6 * 2 (6 in phi, 2 in Z)
284 fNPhi = 12; // module granularity in phi within smod (azimuth)
285 fNZ = 24; // module granularity along Z within smod (eta)
286 fNPHIdiv = fNETAdiv = 2; // tower granularity within module
287 fArm1PhiMin = 80.0; // degrees, Starting EMCAL Phi position
288 fArm1PhiMax = 200.0; // degrees, Ending EMCAL Phi position
289 fArm1EtaMin = -0.7; // pseudorapidity, Starting EMCAL Eta position
290 fArm1EtaMax = +0.7; // pseudorapidity, Ending EMCAL Eta position
291 fIPDistance = 428.0; // cm, radial distance to front face from nominal vertex point
292 fPhiGapForSM = 2.; // cm, only for final TRD1 geometry
293 fFrontSteelStrip = 0.025; // 0.025cm = 0.25mm (13-may-05 from V.Petrov)
294 fPassiveScintThick = 0.8; // 0.8cm = 8mm (13-may-05 from V.Petrov)
295 fLateralSteelStrip = 0.01; // 0.01cm = 0.1mm (13-may-05 from V.Petrov) - was 0.025
296 fTrd1Angle = 1.5; // in degrees
298 fSampling = 1.; // should be calculated with call to DefineSamplingFraction()
299 fNECLayers = 77; // (13-may-05 from V.Petrov) - can be changed with additional options
300 fECScintThick = 0.176; // scintillator layer thickness
301 fECPbRadThickness = 0.144; // lead layer thickness
303 fPhiModuleSize = 12.26 - fPhiGapForSM / Float_t(fNPhi); // first assumption
304 fEtaModuleSize = fPhiModuleSize;
306 fZLength = 700.; // Z coverage (cm)
309 //needs to be called for each geometry and before setting geometry
310 //parameters which can depend on the outcome
311 CheckAdditionalOptions();
313 //modifications to the above for PDC06 geometry
314 if(fGeoName.Contains("PDC06")){ // 18-may-05 - about common structure
315 fECScintThick = fECPbRadThickness = 0.16;// (13-may-05 from V.Petrov)
316 CheckAdditionalOptions();
319 //modifications to the above for WSUC geometry
320 if(fGeoName.Contains("WSUC")){ // 18-may-05 - about common structure
321 fNumberOfSuperModules = 2; // 27-may-05; Nov 24,2010 for TB
323 fTrd1AlFrontThick = 1.0; // one cm
324 // Bond paper - two sheets around Sc tile
325 fTrd1BondPaperThick = 0.01; // 0.01cm = 0.1 mm
327 fPhiModuleSize = 12.0;
328 fEtaModuleSize = fPhiModuleSize;
329 fLateralSteelStrip = 0.015; // 0.015cm = 0.15mm
331 CheckAdditionalOptions();
334 //In 2009-2010 data taking runs only 4 SM, in the upper position.
335 if(fGeoName.Contains("FIRSTYEAR")){
336 fNumberOfSuperModules = 4;
338 CheckAdditionalOptions();
341 if(fGeoName.Contains("FIRSTYEARV1") || fGeoName.Contains("COMPLETEV1") || fGeoName.Contains("COMPLETE12SMV1") ){
342 // Oct 26,2010 : First module has tilt = 0.75 degree :
343 // look to AliEMCALShishKebabTrd1Module::DefineFirstModule(key)
344 // New sizes from production drawing, added Al front plate.
345 // The thickness of sampling is change due to existing two sheets of paper.
347 // Will replace fFrontSteelStrip
348 fTrd1AlFrontThick = 1.0; // one cm
349 // Bond paper - two sheets around Sc tile
350 fTrd1BondPaperThick = 0.01; // 0.01cm = 0.1 mm
352 fPhiModuleSize = 12.0;
353 fEtaModuleSize = fPhiModuleSize;
354 fLateralSteelStrip = 0.015; // 0.015cm = 0.15mm
356 if(fGeoName.Contains("COMPLETEV1"))
358 fNumberOfSuperModules = 10;
361 else if (fGeoName.Contains("COMPLETE12SMV1"))
363 fNumberOfSuperModules = 12;
366 CheckAdditionalOptions();
369 // constant for transition absid <--> indexes
370 fNCellsInModule = fNPHIdiv*fNETAdiv;
371 fNCellsInSupMod = fNCellsInModule*fNPhi*fNZ;
372 fNCells = fNCellsInSupMod*fNumberOfSuperModules;
373 if(GetKey110DEG() && !fGeoName.Contains("12SMV1")) fNCells -= fNCellsInSupMod; // SM 10 and 11 are 1/2 size on phi
374 if(GetKey110DEG() && fGeoName.Contains("12SMV1") ) fNCells -=2*(2 * fNCellsInSupMod / 3); // SM 10 and 11 are 1/3 size on phi
376 fNPhiSuperModule = fNumberOfSuperModules/2;
377 if(fNPhiSuperModule < 1) fNPhiSuperModule = 1;
379 fPhiTileSize = fPhiModuleSize/double(fNPHIdiv) - fLateralSteelStrip; // 13-may-05
380 fEtaTileSize = fEtaModuleSize/double(fNETAdiv) - fLateralSteelStrip; // 13-may-05
382 fLongModuleSize = fNECLayers*(fECScintThick + fECPbRadThickness);
383 if(fGeoName.Contains("V1")){
384 Double_t ws = fECScintThick + fECPbRadThickness + 2.*fTrd1BondPaperThick; // sampling width
385 // Number of Pb tiles = Number of Sc tiles - 1
386 fLongModuleSize = fTrd1AlFrontThick + (ws*fNECLayers - fECPbRadThickness);
388 f2Trd1Dx2 = fEtaModuleSize + 2.*fLongModuleSize*TMath::Tan(fTrd1Angle*TMath::DegToRad()/2.);
390 if(!fGeoName.Contains("WSUC")) fShellThickness = TMath::Sqrt(fLongModuleSize*fLongModuleSize + f2Trd1Dx2*f2Trd1Dx2);
392 //These parameters are used to create the mother volume to hold the supermodules
393 //2cm padding added to allow for misalignments - JLK 30-May-2008
394 fEnvelop[0] = fIPDistance - 1.; // mother volume inner radius
395 fEnvelop[1] = fIPDistance + fShellThickness + 1.; // mother volume outer r.
396 fEnvelop[2] = fZLength + 2.; //mother volume length
399 fParSM[0] = GetShellThickness()/2.;
400 fParSM[1] = GetPhiModuleSize() * GetNPhi()/2.;
401 fParSM[2] = fZLength/4.; //divide by 4 to get half-length of SM
403 // SM phi boundaries - (0,1),(2,3) .. (10,11) - has the same boundaries; Nov 7, 2006
404 fPhiBoundariesOfSM.Set(fNumberOfSuperModules);
405 fPhiCentersOfSM.Set(fNumberOfSuperModules/2);
406 fPhiBoundariesOfSM[0] = TMath::PiOver2() - TMath::ATan2(fParSM[1] , fIPDistance); // 1th and 2th modules)
407 fPhiCentersOfSM[0] = TMath::PiOver2();
408 if(fNumberOfSuperModules > 1)
409 fPhiBoundariesOfSM[1] = TMath::PiOver2() + TMath::ATan2(fParSM[1] , fIPDistance);
410 if(fNumberOfSuperModules > 2) {
411 Int_t maxPhiBlock =fNumberOfSuperModules/2-1;
412 if(fNumberOfSuperModules > 10) maxPhiBlock = 4;
413 for(int i=1; i<=maxPhiBlock; i++) { // from 2th ro 9th
414 fPhiBoundariesOfSM[2*i] = fPhiBoundariesOfSM[0] + 20.*TMath::DegToRad()*i;
415 fPhiBoundariesOfSM[2*i+1] = fPhiBoundariesOfSM[1] + 20.*TMath::DegToRad()*i;
416 fPhiCentersOfSM[i] = fPhiCentersOfSM[0] + 20.*TMath::DegToRad()*i;
419 if(fNumberOfSuperModules > 10) {
420 fPhiBoundariesOfSM[10] = fPhiBoundariesOfSM[0] + 20.*TMath::DegToRad()*5; // in the ideal case the phi-gap is constant
421 fPhiBoundariesOfSM[11] = fPhiBoundariesOfSM[10] + 2.*TMath::ATan2((fParSM[1])/3., fIPDistance); // one_third SMs
422 fPhiCentersOfSM[5] = (fPhiBoundariesOfSM[10]+fPhiBoundariesOfSM[11])/2.;
425 //called after setting of scintillator and lead layer parameters
426 DefineSamplingFraction(mcname,mctitle);
429 // TRU parameters - Apr 29,08 by PAI.
430 // These parameters values was updated at Nov 05, 2007
431 // As is on Olivier BOURRION (LPSC) ppt preasentation
432 // at ALICE trigger meeting at 13th-14th March
433 fNTRUEta = 1; // was 3
434 fNTRUPhi = 3; // was 1
435 fNModulesInTRUEta = 24; // was 8
436 fNModulesInTRUPhi = 4; // was 12
438 // 3*6*10 + 2*6*2 = 204 -> matrix (nphi(17), neta(12))
444 //___________________________________________________________________
445 void AliEMCALEMCGeometry::PrintGeometry()
447 // Separate routine is callable from broswer; Nov 7,2006
448 printf("\nInit: geometry of EMCAL named %s :\n", fGeoName.Data());
450 for(Int_t i=0; i<fArrayOpts->GetEntries(); i++){
451 TObjString *o = (TObjString*)fArrayOpts->At(i);
452 printf(" %i : %s \n", i, o->String().Data());
455 printf("Granularity: %d in eta and %d in phi\n", GetNZ(), GetNPhi()) ;
456 printf("Layout: phi = (%7.1f, %7.1f), eta = (%5.2f, %5.2f), IP = %7.2f -> for EMCAL envelope only\n",
457 GetArm1PhiMin(), GetArm1PhiMax(),GetArm1EtaMin(), GetArm1EtaMax(), GetIPDistance() );
459 printf( " ECAL : %d x (%f cm Pb, %f cm Sc) \n",
460 GetNECLayers(), GetECPbRadThick(), GetECScintThick() ) ;
461 printf(" fSampling %5.2f \n", fSampling );
462 printf(" fIPDistance %6.3f cm \n", fIPDistance);
463 printf(" fNPhi %i | fNZ %i \n", fNPhi, fNZ);
464 printf(" fNCellsInModule %i : fNCellsInSupMod %i : fNCells %i\n",fNCellsInModule, fNCellsInSupMod, fNCells);
465 printf(" X:Y module size %6.3f , %6.3f cm \n", fPhiModuleSize, fEtaModuleSize);
466 printf(" X:Y tile size %6.3f , %6.3f cm \n", fPhiTileSize, fEtaTileSize);
467 printf(" #of sampling layers %i(fNECLayers) \n", fNECLayers);
468 printf(" fLongModuleSize %6.3f cm \n", fLongModuleSize);
469 printf(" #supermodule in phi direction %i \n", fNPhiSuperModule );
470 printf(" fILOSS %i : fIHADR %i \n", fILOSS, fIHADR);
471 printf(" fTrd1Angle %7.4f\n", fTrd1Angle);
472 printf(" f2Trd1Dx2 %7.4f\n", f2Trd1Dx2);
473 printf(" fTrd1AlFrontThick %7.4f \n", fTrd1AlFrontThick);
474 printf(" fTrd1BondPaperThick %5.4f \n", fTrd1BondPaperThick);
475 printf("SM dimensions(TRD1) : dx %7.2f dy %7.2f dz %7.2f (SMOD, BOX)\n",
476 fParSM[0],fParSM[1],fParSM[2]);
477 printf(" fPhiGapForSM %7.4f cm (%7.4f <- phi size in degree)\n",
478 fPhiGapForSM, TMath::ATan2(fPhiGapForSM,fIPDistance)*TMath::RadToDeg());
479 if(GetKey110DEG() && !fGeoName.Contains("12SMV1") ) printf(" Last two modules have size 10 degree in phi (180<phi<190)\n");
480 if(GetKey110DEG() && fGeoName.Contains("12SMV1")) printf(" Last two modules have size 6.6 degree in phi (180<phi<186.6)\n");
481 printf(" phi SM boundaries \n");
482 for(int i=0; i<fPhiBoundariesOfSM.GetSize()/2.; i++) {
483 printf(" %i : %7.5f(%7.2f) -> %7.5f(%7.2f) : center %7.5f(%7.2f) \n", i,
484 fPhiBoundariesOfSM[2*i], fPhiBoundariesOfSM[2*i]*TMath::RadToDeg(),
485 fPhiBoundariesOfSM[2*i+1], fPhiBoundariesOfSM[2*i+1]*TMath::RadToDeg(),
486 fPhiCentersOfSM[i], fPhiCentersOfSM[i]*TMath::RadToDeg());
491 //______________________________________________________________________
492 void AliEMCALEMCGeometry::CheckAdditionalOptions()
495 // Additional options that
496 // can be used to select
497 // the specific geometry of
500 // adeed allILOSS= and allIHADR= for MIP investigation
501 fArrayOpts = new TObjArray;
502 Int_t nopt = ParseString(fGeoName, *fArrayOpts);
503 if(nopt==1) { // no aditional option(s)
504 fArrayOpts->Delete();
509 for(Int_t i=1; i<nopt; i++){
510 TObjString *o = (TObjString*)fArrayOpts->At(i);
512 TString addOpt = o->String();
514 for(Int_t j=0; j<fNAdditionalOpts; j++) {
515 TString opt = fkAdditionalOpts[j];
516 if(addOpt.Contains(opt,TString::kIgnoreCase)) {
522 AliDebug(2,Form("<E> option |%s| unavailable : ** look to the file AliEMCALGeometry.h **\n",
526 AliDebug(2,Form("<I> option |%s| is valid : number %i : |%s|\n",
527 addOpt.Data(), indj, fkAdditionalOpts[indj]));
528 if (addOpt.Contains("NL=",TString::kIgnoreCase)) {// number of sampling layers
529 sscanf(addOpt.Data(),"NL=%i", &fNECLayers);
530 AliDebug(2,Form(" fNECLayers %i (new) \n", fNECLayers));
531 } else if(addOpt.Contains("PBTH=",TString::kIgnoreCase)) {//Thickness of the Pb(fECPbRadThicknes)
532 sscanf(addOpt.Data(),"PBTH=%f", &fECPbRadThickness);
533 } else if(addOpt.Contains("SCTH=",TString::kIgnoreCase)) {//Thickness of the Sc(fECScintThick)
534 sscanf(addOpt.Data(),"SCTH=%f", &fECScintThick);
535 } else if(addOpt.Contains("LATSS=",TString::kIgnoreCase)) {// Thickness of lateral steel strip (fLateralSteelStrip)
536 sscanf(addOpt.Data(),"LATSS=%f", &fLateralSteelStrip);
537 AliDebug(2,Form(" fLateralSteelStrip %f (new) \n", fLateralSteelStrip));
538 } else if(addOpt.Contains("ILOSS=",TString::kIgnoreCase)) {// As in Geant
539 sscanf(addOpt.Data(),"ALLILOSS=%i", &fILOSS);
540 AliDebug(2,Form(" fILOSS %i \n", fILOSS));
541 } else if(addOpt.Contains("IHADR=",TString::kIgnoreCase)) {// As in Geant
542 sscanf(addOpt.Data(),"ALLIHADR=%i", &fIHADR);
543 AliDebug(2,Form(" fIHADR %i \n", fIHADR));
549 //__________________________________________________________________
550 void AliEMCALEMCGeometry::DefineSamplingFraction(const Text_t* mcname, const Text_t* mctitle)
553 // Look http://rhic.physics.wayne.edu/~pavlinov/ALICE/SHISHKEBAB/RES/linearityAndResolutionForTRD1.html
554 // Keep for compatibilty
557 // Sampling factor for G3
558 fSampling = 10.87; // Default value - Nov 25,2010
559 if(fNECLayers == 69) { // 10% layer reduction
561 } else if(fNECLayers == 61) { // 20% layer reduction
563 } else if(fNECLayers == 77) {
564 if(fGeoName.Contains("V1")){
565 fSampling = 10.87; //Adding paper sheets and cover plate; Nov 25,2010
566 } else if (fECScintThick>0.159 && fECScintThick<0.161) { // original sampling fraction, equal layers
567 fSampling = 12.327; // fECScintThick = fECPbRadThickness = 0.160;
568 } else if (fECScintThick>0.175 && fECScintThick<0.177) { // 10% Pb thicknes reduction
569 fSampling = 10.5; // fECScintThick = 0.176, fECPbRadThickness=0.144;
570 } else if(fECScintThick>0.191 && fECScintThick<0.193) { // 20% Pb thicknes reduction
571 fSampling = 8.93; // fECScintThick = 0.192, fECPbRadThickness=0.128;
575 // Default sampling factor for G3, modify it for other transport model
576 TString mcName = mcname;
577 TString mcTitle = mctitle;
579 Float_t samplingFactorTranportModel = 1. ;
580 if (mcName.Contains("Geant3")) samplingFactorTranportModel = 1.;//0.988 // Do nothing
581 else if(mcName.Contains("Fluka") ) samplingFactorTranportModel = 1.; // To be set
582 else if(mcName.Contains("Geant4")){
583 if(mcTitle.Contains("EMV")) samplingFactorTranportModel = 1.096; // 0.906, 0.896 (OPT)
584 else samplingFactorTranportModel = 0.86; // 1.15 (CHIPS), 1.149 (BERT), 1.147 (BERT_CHIPS)
587 AliDebug(2,Form("MC modeler <%s>, Title <%s>: Sampling %f, model fraction with respect to G3 %f, final sampling %f \n",
588 mcName.Data(),mcTitle.Data(),fSampling,samplingFactorTranportModel,fSampling*samplingFactorTranportModel));
591 fSampling*=samplingFactorTranportModel;
595 //________________________________________________________________________________________________
596 Double_t AliEMCALEMCGeometry::GetPhiCenterOfSM(Int_t nsupmod) const
598 //returns center of supermodule in phi
600 return fPhiCentersOfSM[i];
604 //________________________________________________________________________________________________
605 Bool_t AliEMCALEMCGeometry::GetPhiBoundariesOfSM(Int_t nSupMod, Double_t &phiMin, Double_t &phiMax) const
607 // 0<= nSupMod <=11; phi in rad
609 if(nSupMod<0 || nSupMod >11) return kFALSE;
611 phiMin = (Double_t)fPhiBoundariesOfSM[2*i];
612 phiMax = (Double_t)fPhiBoundariesOfSM[2*i+1];
616 //________________________________________________________________________________________________
617 Bool_t AliEMCALEMCGeometry::GetPhiBoundariesOfSMGap(Int_t nPhiSec, Double_t &phiMin, Double_t &phiMax) const
619 // 0<= nPhiSec <=4; phi in rad
620 // 0; gap boundaries between 0th&2th | 1th&3th SM
621 // 1; gap boundaries between 2th&4th | 3th&5th SM
622 // 2; gap boundaries between 4th&6th | 5th&7th SM
623 // 3; gap boundaries between 6th&8th | 7th&9th SM
624 // 4; gap boundaries between 8th&10th | 9th&11th SM
625 if(nPhiSec<0 || nPhiSec >4) return kFALSE;
626 phiMin = fPhiBoundariesOfSM[2*nPhiSec+1];
627 phiMax = fPhiBoundariesOfSM[2*nPhiSec+2];
631 //________________________________________________________________________________________________
632 int AliEMCALEMCGeometry::ParseString(const TString &topt, TObjArray &Opt)
634 //Parse string, does what? GCB 08/09
635 Ssiz_t begin, index, end, end2;
636 begin = index = end = end2 = 0;
637 TRegexp separator("[^ ;,\\t\\s/]+");
638 while ( (begin < topt.Length()) && (index != kNPOS) ) {
639 // loop over given options
640 index = topt.Index(separator,&end,begin);
641 if (index >= 0 && end >= 1) {
642 TString substring(topt(index,end));
643 Opt.Add(new TObjString(substring.Data()));
647 return Opt.GetEntries();