Double_t & mean, Double_t & rms);
protected:
+public: // PAI
short Max( const AliCaloBunchInfo *const bunch, int *const maxindex) const;
UShort_t Max(const UShort_t *data, const int length ) const;
bool CheckBunchEdgesForMax( const AliCaloBunchInfo *const bunch) const;
//*-- Author: Yves Schutz (SUBATECH)
//
//*-- Additional Contributions: Sahal Yacoob (LBNL/UCT)
+// : Alexei Pavlinov (WSU)
//
//////////////////////////////////////////////////////////////////////////////
Float_t wsteel[4] = { .715,.18,.1,.005 };
AliMixture(4, "STAINLESS STEEL$", asteel, zsteel, 7.88, 4, wsteel);
+ // Oct 26,2010 : Multipurpose Copy Paper UNV-21200), weiht 75 g/m**2.
+ // *Cellulose C6H10O5
+ // Component C A=12.01 Z=6. W=6./21.
+ // Component H A=1. Z=1. W=10./21.
+ // Component O A=16. Z=8. W=5./21.
+ Float_t apaper[3] = { 12.01, 1.0, 16.0};
+ Float_t zpaper[3] = { 26.0, 1.0, 8.0};
+ Float_t wpaper[3] = {6./21., 10./21., 5./21.};
+ AliMixture(5, "BondPaper$", apaper, zpaper, 0.75, 3, wpaper);
+
// DEFINITION OF THE TRACKING MEDIA
// for EMCAL: idtmed[1599->1698] equivalent to fIdtmed[0->100]
// 25-aug-04 by PAI : see PMD/AliPMDv0.cxx for STEEL definition -> idtmed[1603]
AliMedium(4, "S steel$", 4, 0,
- isxfld, sxmgmx, 10.0, 0.1, 0.1, 0.001, 0.001, 0, 0) ;
+ isxfld, sxmgmx, 10.0, 0.01, 0.1, 0.001, 0.001, 0, 0) ;
+
+ // Oct 26,2010 -> idtmed[1604]
+ Float_t stemax = 0.001;
+ AliMedium(5, "Paper$", 5, 0,
+ isxfld, sxmgmx, 10.0, stemax, 0.1, 0.001, 0.001, 0, 0) ;
//set constants for Birk's Law implentation
// EMCAL_COMPLETE (geometry for expected complete detector)
// = equivalent to SHISH_77_TRD1_2X2_FINAL_110DEG scTh=0.176 pbTh=0.144
// in old notation
+//
+// EMCAL_FIRSTYEAR - geometry for December 2009 to December 2010 run period
+// with four Super Modules
+//
+// EMCAL_FIRSTYEARV1 - geometry for December 2009 to December 2010 run period;
+// 1. Fixed bug for positions of modules inside SM
+// (first module has tilt 0.75 degree);
+// 2. Added Al front plate (width 1 cm) and 2 paper sheets per sampling
+// layer (additional 0.2 mm)
+// The sizes have updated with last information from production
+// drawing (end of October 2010).
+//
// EMCAL_WSUC (Wayne State test stand)
// = no definite equivalent in old notation, was only used by
// Aleksei, but kept for testing purposes
//
fTrd1Angle(0.),f2Trd1Dx2(0.),
fPhiGapForSM(0.),fKey110DEG(0),fPhiBoundariesOfSM(0), fPhiCentersOfSM(0),fEtaMaxOfTRD1(0),
+ fTrd1AlFrontThick(0.0), fTrd1BondPaperThick(0.),
fCentersOfCellsEtaDir(0), fCentersOfCellsXDir(0),fCentersOfCellsPhiDir(0),
fEtaCentersOfCells(0),fPhiCentersOfCells(0),fShishKebabTrd1Modules(0),
- fILOSS(-1), fIHADR(-1),
+ fParSM(), fILOSS(-1), fIHADR(-1),
//obsolete member data
- fAlFrontThick(0.), fGap2Active(0.), fSteelFrontThick(0.), fTrd2AngleY(0.),
+ fGap2Active(0.), fSteelFrontThick(0.), fTrd2AngleY(0.),
f2Trd2Dy2(0.), fEmptySpace(0.), fTubsR(0.), fTubsTurnAngle(0.)
{
// default ctor only for internal usage (singleton)
//
fTrd1Angle(0.),f2Trd1Dx2(0.),
fPhiGapForSM(0.),fKey110DEG(0),fPhiBoundariesOfSM(0), fPhiCentersOfSM(0), fEtaMaxOfTRD1(0),
+ fTrd1AlFrontThick(0.0), fTrd1BondPaperThick(0.),
fCentersOfCellsEtaDir(0),fCentersOfCellsXDir(0),fCentersOfCellsPhiDir(0),
fEtaCentersOfCells(0),fPhiCentersOfCells(0),fShishKebabTrd1Modules(0),
- fILOSS(-1), fIHADR(-1),
+ fParSM(),fILOSS(-1), fIHADR(-1),
//obsolete member data
- fAlFrontThick(0.), fGap2Active(0.), fSteelFrontThick(0.), fTrd2AngleY(0.),
+ fGap2Active(0.), fSteelFrontThick(0.), fTrd2AngleY(0.),
f2Trd2Dy2(0.), fEmptySpace(0.), fTubsR(0.), fTubsTurnAngle(0.)
{
// ctor only for internal usage (singleton)
fPhiBoundariesOfSM(geom.fPhiBoundariesOfSM),
fPhiCentersOfSM(geom.fPhiCentersOfSM),
fEtaMaxOfTRD1(geom.fEtaMaxOfTRD1),
+ fTrd1AlFrontThick(geom.fTrd1AlFrontThick),
+ fTrd1BondPaperThick(geom.fTrd1BondPaperThick),
fCentersOfCellsEtaDir(geom.fCentersOfCellsEtaDir),
fCentersOfCellsXDir(geom.fCentersOfCellsXDir),
fCentersOfCellsPhiDir(geom.fCentersOfCellsPhiDir),
fShishKebabTrd1Modules(geom.fShishKebabTrd1Modules),
fILOSS(geom.fILOSS), fIHADR(geom.fIHADR),
//obsolete member data
- fAlFrontThick(geom.fAlFrontThick),
fGap2Active(geom.fGap2Active),
fSteelFrontThick(geom.fSteelFrontThick),
fTrd2AngleY(geom.fTrd2AngleY),
//In 2009-2010 data taking runs only 4 SM, in the upper position.
if(fGeoName.Contains("FIRSTYEAR")){
- fNumberOfSuperModules = 4;
- fArm1PhiMax = 120.0;
- CheckAdditionalOptions();
+ fNumberOfSuperModules = 4;
+ fArm1PhiMax = 120.0;
+ if(fGeoName.Contains("FIRSTYEARV1")){
+ // Oct 26,2010 : First module has tilt = 0.75 degree :
+ // look to AliEMCALShishKebabTrd1Module::DefineFirstModule(key)
+ // New sizes from production drawing, added Al front plate.
+ // The thickness of sampling is change due to existing two sheets of paper.
+
+ // Will replace fFrontSteelStrip
+ fTrd1AlFrontThick = 1.0; // one cm
+ // Bond paper - two sheets around Sc tile
+ fTrd1BondPaperThick = 0.01; // 0.01cm = 0.1 mm
+
+ fPhiModuleSize = 12.0;
+ fEtaModuleSize = fPhiModuleSize;
+ fLateralSteelStrip = 0.015; // 0.015cm = 0.15mm
+ }
+ CheckAdditionalOptions();
}
// constant for transition absid <--> indexes
fEtaTileSize = fEtaModuleSize/double(fNETAdiv) - fLateralSteelStrip; // 13-may-05
fLongModuleSize = fNECLayers*(fECScintThick + fECPbRadThickness);
+ if(fGeoName.Contains("FIRSTYEARV1")){
+ Double_t ws = fECScintThick + fECPbRadThickness + 2.*fTrd1BondPaperThick; // sampling width
+ // Number of Pb tiles = Number of Sc tiles - 1
+ fLongModuleSize = fTrd1AlFrontThick + (ws*fNECLayers - fECPbRadThickness);
+ }
f2Trd1Dx2 = fEtaModuleSize + 2.*fLongModuleSize*TMath::Tan(fTrd1Angle*TMath::DegToRad()/2.);
+
if(!fGeoName.Contains("WSUC")) fShellThickness = TMath::Sqrt(fLongModuleSize*fLongModuleSize + f2Trd1Dx2*f2Trd1Dx2);
//These parameters are used to create the mother volume to hold the supermodules
printf(" fILOSS %i : fIHADR %i \n", fILOSS, fIHADR);
printf(" fTrd1Angle %7.4f\n", fTrd1Angle);
printf(" f2Trd1Dx2 %7.4f\n", f2Trd1Dx2);
+ printf(" fTrd1AlFrontThick %7.4f \n", fTrd1AlFrontThick);
+ printf(" fTrd1BondPaperThick %5.4f \n", fTrd1BondPaperThick);
printf("SM dimensions(TRD1) : dx %7.2f dy %7.2f dz %7.2f (SMOD, BOX)\n",
fParSM[0],fParSM[1],fParSM[2]);
printf(" fPhiGapForSM %7.4f cm (%7.4f <- phi size in degree)\n",
//
Bool_t IsInitialized(void) const { return fgInit ; }
static const Char_t* GetDefaultGeometryName() {return fgkDefaultGeometryName;}
- void PrintGeometry(); //*MENU*
+ void PrintGeometry(); //*MENU*
- void Init(void); // initializes the parameters of EMCAL
+ void Init(void); // initializes the parameters of EMCAL
void CheckAdditionalOptions(); //
void DefineSamplingFraction(); // Jun 5, 2006
Float_t GetTrd1Angle() const {return fTrd1Angle;}
Float_t Get2Trd1Dx2() const {return f2Trd1Dx2;}
Float_t GetEtaMaxOfTRD1() const {return fEtaMaxOfTRD1;}
+ Float_t GetTrd1AlFrontThick() const { return fTrd1AlFrontThick;}
+ Float_t GetTrd1BondPaperThick() const {return fTrd1BondPaperThick;}
// --
Int_t GetNCellsInSupMod() const {return fNCellsInSupMod;}
Int_t GetNCellsInModule() const {return fNCellsInModule; }
//////////////////////////////////////////////////
// Obsolete methods to be thrown out when feasible
- Float_t GetAlFrontThickness() const { return fAlFrontThick;}
Float_t GetGap2Active() const {return fGap2Active ;}
Float_t GetSteelFrontThickness() const { return fSteelFrontThick;}
Float_t GetTrd2AngleY()const {return fTrd2AngleY;}
Float_t Get2Trd2Dy2() const {return f2Trd2Dy2;}
Float_t GetTubsR() const {return fTubsR;}
Float_t GetTubsTurnAngle() const {return fTubsTurnAngle;}
- Float_t GetIP2ECASection() const { return ( GetIPDistance() + GetAlFrontThickness()
- + GetGap2Active() ) ; }
+ // Float_t GetIP2ECASection() const { return ( GetIPDistance() + GetAlFrontThickness()
+ // + GetGap2Active() ) ; }
//////////////////////////////////////////////////
static Bool_t fgInit; // Tells if geometry has been succesfully set up.
TArrayD fPhiBoundariesOfSM; // phi boundaries of SM in rad; size is fNumberOfSuperModules;
TArrayD fPhiCentersOfSM; // phi of centers of SMl size is fNumberOfSuperModules/2
Float_t fEtaMaxOfTRD1; // max eta in case of TRD1 geometry (see AliEMCALShishKebabTrd1Module)
+ // Oct 26,2010
+ Float_t fTrd1AlFrontThick; // Thickness of the Al front plate
+ Float_t fTrd1BondPaperThick; // Thickness of the Bond Paper sheet
// Local Coordinates of SM
TArrayD fCentersOfCellsEtaDir; // size fNEta*fNETAdiv (for TRD1 only) (eta or z in SM, in cm)
TArrayD fCentersOfCellsXDir; // size fNEta*fNETAdiv (for TRD1 only) ( x in SM, in cm)
////////////////////////////////////////////////////////////
//Obsolete member data that will be thrown out when feasible
//
- Float_t fAlFrontThick; // Thickness of the front Al face of the support box
Float_t fGap2Active; // Gap between the envelop and the active material
Float_t fSteelFrontThick; // Thickness of the front stell face of the support box - 9-sep-04
// TRD2 options - 27-jan-07
///////////////////////////////////////////////////////////
- ClassDef(AliEMCALEMCGeometry, 1) // EMCAL geometry class
+ ClassDef(AliEMCALEMCGeometry, 2) // EMCAL geometry class
};
#endif // AliEMCALEMCGEOMETRY_H
}
}
+void AliEMCALGeoUtils::PrintLocalTrd1(Int_t pri) const
+{
+ // For comparing with numbers from drawing
+ for(Int_t i=0; i<GetShishKebabTrd1Modules()->GetSize(); i++){
+ printf(" %s | ", GetShishKebabModule(i)->GetName());
+ if(i==0 && pri<1) GetShishKebabModule(i)->PrintShish(1);
+ else GetShishKebabModule(i)->PrintShish(pri);
+ }
+}
+
//________________________________________________________________________________________________
void AliEMCALGeoUtils::EtaPhiFromIndex(Int_t absId,Double_t &eta,Double_t &phi) const
{
// Generate the list of Trd1 modules
// which will make up the EMCAL
// geometry
+ // key: look to the AliEMCALShishKebabTrd1Module::
AliDebug(2,Form(" AliEMCALGeometry::CreateListOfTrd1Modules() started "));
}
}
-
-
void PrintGeometry();
void PrintCellIndexes(Int_t absId=0, int pri=0, const char *tit="") const ; //*MENU*
+ void PrintLocalTrd1(Int_t pri=0) const; //*MENU*
virtual void Browse(TBrowser* b);
virtual Bool_t IsFolder() const;
Float_t fIPDistance; // Radial Distance of the inner surface of the EMCAL
Float_t fLongModuleSize; // Size of long module
// Geometry Parameters
- Float_t fShellThickness; // Total thickness in (x,y) direction
- Float_t fZLength; // Total length in z direction
- Float_t fSampling; // Sampling factor
+ Float_t fShellThickness; // Total thickness in (x,y) direction
+ Float_t fZLength; // Total length in z direction
+ Float_t fSampling; // Sampling factor
Int_t fFastOR2DMap[48][64]; // FastOR 2D Map over full EMCal
// EMCAL_COMPLETE (geometry for expected complete detector)
// = equivalent to SHISH_77_TRD1_2X2_FINAL_110DEG scTh=0.176 pbTh=0.144
// in old notation
+// EMCAL_4SMs - geometry for December 2009 to December 2010 run period;
+// fixed bug for positions of modules inside SM
+// (first module has tilt 0.75 degree);
+// the sizes updated with last information from production
+// drawing (end of October 2010).
+//
+//
// EMCAL_WSUC (Wayne State test stand)
// = no definite equivalent in old notation, was only used by
// Aleksei, but kept for testing purposes
//*-- Author: Sahal Yacoob (LBL / UCT)
// and : Yves Schutz (SUBATECH)
// and : Jennifer Klay (LBL)
-// and : Aleksei Pavlinov (WSU)
+// and : Alexei Pavlinov (WSU)
//
//--- Root header files ---
//
//*-- Author: Sahal Yacoob (LBL / UCT)
//*-- and : Yves Schutz (Subatech)
-//*-- and : Aleksei Pavlinov (WSU) - shashlyk staff
+//*-- and : Alexei Pavlinov (WSU) - shashlyk staff
//*-- and : Gustavo Conesa: Add TRU mapping. TRU parameters still not fixed.
// --- ROOT system ---
Float_t GetLongModuleSize(void) const {return fEMCGeometry->GetLongModuleSize();}
Float_t GetTrd1Angle(void) const {return fEMCGeometry->GetTrd1Angle();}
Float_t Get2Trd1Dx2(void) const {return fEMCGeometry->Get2Trd1Dx2();}
- // --
+ Float_t GetTrd1AlFrontThick() const {return fEMCGeometry->GetTrd1AlFrontThick();}
+ Float_t GetTrd1BondPaperThick() const {return fEMCGeometry->GetTrd1BondPaperThick();}
+ // --
Int_t GetNCellsInSupMod(void) const {return fEMCGeometry->GetNCellsInSupMod();}
Int_t GetNCellsInModule(void) const {return fEMCGeometry->GetNCellsInModule(); }
Int_t GetKey110DEG(void) const {return fEMCGeometry->GetKey110DEG();}
void SetNTRUEta(Int_t ntru) { fEMCGeometry->SetNTRUEta(ntru);}
void SetNTRUPhi(Int_t ntru) { fEMCGeometry->SetNTRUPhi(ntru);}
void SetSampling(Float_t samp) { fEMCGeometry->SetSampling(samp);}
-
-/* /////////////////// */
-/* // useful utilities */
-/* // */
-/* Float_t AngleFromEta(Float_t eta) const { // returns theta in radians for a given pseudorapidity */
-/* return 2.0*TMath::ATan(TMath::Exp(-eta)); */
-/* } */
-/* Float_t ZFromEtaR(Float_t r,Float_t eta) const { // returns z in for a given */
-/* // pseudorapidity and r=sqrt(x*x+y*y). */
-/* return r/TMath::Tan(AngleFromEta(eta)); */
-/* } */
+
+ void PrintGeometry() {fEMCGeometry->PrintGeometry();} //*MENU*
//////////////////////////////////////////////////
// Obsolete methods to be thrown out when feasible
- Float_t GetAlFrontThickness(void) const { return fEMCGeometry->GetAlFrontThickness();}
Float_t GetGap2Active(void) const {return fEMCGeometry->GetGap2Active();}
Float_t GetSteelFrontThickness(void) const { return fEMCGeometry->GetSteelFrontThickness();}
Float_t GetTrd2AngleY(void) const {return fEMCGeometry->GetTrd2AngleY();}
Float_t Get2Trd2Dy2(void) const {return fEMCGeometry->Get2Trd2Dy2();}
Float_t GetTubsR(void) const {return fEMCGeometry->GetTubsR();}
Float_t GetTubsTurnAngle(void) const {return fEMCGeometry->GetTubsTurnAngle();}
- Float_t GetIP2ECASection(void) const { return fEMCGeometry->GetIP2ECASection(); }
+ //Float_t GetAlFrontThickness(void) const { return fEMCGeometry->GetAlFrontThickness();}
+ // Float_t GetIP2ECASection(void) const { return fEMCGeometry->GetIP2ECASection(); }
//////////////////////////////////////////////////
protected:
/**************************************************************************
- * Copyright(c) 1998-2004, ALICE Experiment at CERN, All rights reserved. *
+ * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
* *
* Author: The ALICE Off-line Project. *
* Contributors are mentioned in the code where appropriate. *
//_________________________________________________________________________
// Main class for TRD1 geometry of Shish-Kebab case.
-// Author: Aleksei Pavlinov(WSU).
-// Sep 20004 - Nov 2006
+// Author: Alexei Pavlinov(WSU).
+// Sep 20004 - Nov 2006; Apr 2010
// See web page with description of Shish-Kebab geometries:
// http://pdsfweb01.nersc.gov/~pavlinov/ALICE/SHISHKEBAB/RES/shishkebabALICE.html
// Nov 9,2006 - added case of 3X3
fORB(),
fORT()
{
- // theta in radians ; first object shold be with theta=pi/2.
- fTheta = TMath::PiOver2();
+ TString snam(g->GetName());
+ Int_t key=0;
+ if(snam.Contains("FIRSTYEARv1",TString::kIgnoreCase)) key=1;
if(GetParameters()) {
- DefineFirstModule();
+ DefineFirstModule(key);
}
DefineName(fTheta);
- AliDebug(1,Form("AliEMCALShishKebabTrd1Module - first module: theta %1.4f geometry %s",fTheta,g->GetName()));
+ printf("AliEMCALShishKebabTrd1Module - first module key=%i: theta %1.4f geometry %s\n",key,fTheta, g->GetName());
}
//_____________________________________________________________________________
}
//_____________________________________________________________________________
-void AliEMCALShishKebabTrd1Module::DefineFirstModule()
+void AliEMCALShishKebabTrd1Module::DefineFirstModule(const Int_t key)
{
- // Define first module
- fOK.Set(fga2/2., fgr + fgb/2.); // position the center of module vs o
+ // Oct 23-25, 2010
+ // key=0 - zero tilt of first module;
+ // key=1 - angle=fgangle/2 = 0.75 degree.
+ // This is what we have in produced SM.
- // parameters of right line : y = A*z + B in system where zero point is IP.
- fThetaA = fTheta - fgangle/2.;
- fA = TMath::Tan(fThetaA);
- Double_t xA = fga/2. + fga2/2., yA = fgr;
- fB = yA - fA*xA;
+ // Define first module
+ if(key==0) {
+ // theta in radians ; first object theta=pi/2.
+ fTheta = TMath::PiOver2();
+ fOK.Set(fga2/2., fgr + fgb/2.); // position the center of module vs o
+
+ // parameters of right line : y = A*z + B in system where zero point is IP.
+ fThetaA = fTheta - fgangle/2.;
+ fA = TMath::Tan(fThetaA);
+ Double_t xA = fga/2. + fga2/2.;
+ Double_t yA = fgr;
+ fB = yA - fA*xA;
+
+ } else if(key==1) {
+ // theta in radians ; first object theta = 90-0.75 = 89.25 degree
+ fTheta = 89.25*TMath::DegToRad();
+ Double_t al1 = fgangle/2.;
+ Double_t x = 0.5*(fga*TMath::Cos(al1) + fgb*TMath::Sin(al1));
+ Double_t y = 0.5*(fgb + fga*TMath::Sin(al1))*TMath::Cos(al1);
+ fOK.Set(x, fgr + y);
+ // parameters of right line : y = A*z + B in system where zero point is IP.
+ fThetaA = fTheta - fgangle/2.;
+ fA = TMath::Tan(fThetaA);
+ Double_t xA = fga*TMath::Cos(al1);
+ Double_t yA = fgr;
+ fB = yA - fA*xA;
+ } else {
+ printf("<E> key=%i : wrong case \n",key);
+ assert(0);
+ }
TObject::SetUniqueID(1); //
DefineAllStaff();
void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const
{
// service method
- if(pri>=0) {
- printf("PrintShish() \n a %7.3f:%7.3f | b %7.2f | r %7.2f \n TRD1 angle %7.6f(%5.2f) | tanBetta %7.6f",
- fga, fga2, fgb, fgr, fgangle, fgangle*TMath::RadToDeg(), fgtanBetta);
- printf(" fTheta %f : %5.2f : cos(theta) %f\n",
- fTheta, GetThetaInDegree(),TMath::Cos(fTheta));
- if(pri>=1) {
- printf(" %i |%s| theta %f : fOK.Phi = %f(%5.2f)\n",
+ if(pri>=0) {
+ if(pri >= 1) {
+ printf("PrintShish() \n a %7.3f:%7.3f | b %7.2f | r %7.2f \n TRD1 angle %7.6f(%5.2f) | tanBetta %7.6f",
+ fga, fga2, fgb, fgr, fgangle, fgangle*TMath::RadToDeg(), fgtanBetta);
+ printf(" fTheta %f : %5.2f : cos(theta) %f\n",
+ fTheta, GetThetaInDegree(),TMath::Cos(fTheta));
+ printf(" OK : %i |%s| theta %f : phi = %f(%5.2f) \n",
GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg());
+ }
+ printf(" y %9.3f x %9.3f xrb %9.3f (right bottom on r=%9.3f ) \n",
+ fOK.X(), fOK.Y(), fORB.X(),fORB.Y());
+ if(pri>=2) {
printf(" A %f B %f | fThetaA %7.6f(%5.2f)\n", fA,fB, fThetaA,fThetaA*TMath::RadToDeg());
printf(" fOK : X %9.4f: Y %9.4f : eta %5.3f\n", fOK.X(), fOK.Y(), GetEtaOfCenterOfModule());
printf(" fOK1 : X %9.4f: Y %9.4f : (local, ieta=2)\n", fOK1.X(), fOK1.Y());
}
x = v.X() + TMath::Cos(theta) * dist;
y = v.Y() + TMath::Sin(theta) * dist;
+ // printf(" GetPositionAtCenterCellLine() %s : dist %f : ieta %i : x %f %f v.X() | y %f %f v.Y() : cos %f sin %f \n",
+ //GetName(), dist, ieta, v.X(),x, y,v.Y(),TMath::Cos(theta),TMath::Sin(theta));
v.Set(x,y);
- //printf(" GetPositionAtCenterCellLine() : dist %f : ieta %i : x %f | y %f \n", dist, ieta, x, y);
}
#ifndef ALIEMCALSHISHKEBABTRD1MODULE_H
#define ALIEMCALSHISHKEBABTRD1MODULE_H
-/* Copyright(c) 1998-2004, ALICE Experiment at CERN, All rights reserved. *
+/* Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice */
/* $Id$ */
//_________________________________________________________________________
// Main class for TRD1 geometry of Shish-Kebab case.
-// Author: Aleksei Pavlinov(WSU).
-// Nov 2004; Feb 2006
+// Author: Alexei Pavlinov(WSU).
+// Nov 2004; Feb 2006; Apr 2010; Oct 23, 2010
#include <TNamed.h>
#include <TMath.h>
virtual ~AliEMCALShishKebabTrd1Module(void) {}
Bool_t GetParameters();
void DefineName(Double_t theta);
- void DefineFirstModule();
+ void DefineFirstModule(const Int_t key=0); // key=0-zero tilt of first module
Double_t GetTheta() const {return fTheta;}
TVector2& GetCenterOfModule() {return fOK;}
static Double_t fga; // 2*dx1=2*dy1
static Double_t fga2; // 2*dx2
static Double_t fgb; // 2*dz1
- static Double_t fgangle; // ~1 degree
+ static Double_t fgangle; // in rad (1.5 degree)
static Double_t fgtanBetta; // tan(fgangle/2.)
static Double_t fgr; // radius to IP
// This class places a Geometry of the EMCAL in the ALICE Detector as defined in AliEMCALGeometry.cxx
//*-- Author: Yves Schutz (SUBATECH)
//*-- and : Sahal Yacoob (LBL / UCT)
-// : Aleksei Pavlinov (WSU) SHASHLYK
+// : Alexei Pavlinov (WSU) SHASHLYK
// --- ROOT system ---
#include <cassert>
ClassImp(AliEMCALv0)
-// EMCAL material
+// EMCAL material: look to the AliEMCAL.cxx
enum
{
kIdAIR = 1599,
kIdPB = 1600,
kIdSC = 1601,
- kIdSTEEL = 1603
+ kIdAL = 1602,
+ kIdSTEEL = 1603,
+ kIdPAPER = 1604
};
TString ntmp(GetTitle());
ntmp.ToUpper();
- AliEMCALGeometry *geom = GetGeometry() ;
- fShishKebabModules = geom->GetShishKebabTrd1Modules();
+ AliEMCALGeometry *g = GetGeometry() ;
+ TString gn(g->GetName()); gn.ToUpper();
+ fShishKebabModules = g->GetShishKebabTrd1Modules();
+ fGeometry = g;
+ fSampleWidth = double(g->GetECPbRadThick()+g->GetECScintThick());
+ if(gn.Contains("FIRSTYEARV1")) fSampleWidth += 2.*g->GetTrd1BondPaperThick();
+ printf("<I> AliEMCALv0::AliEMCALv : fGeometry %p : gMC %p : fSampleWidth %5.4f\n",
+ fGeometry, gMC, fSampleWidth);
}
//______________________________________________________________________
//______________________________________________________________________
void AliEMCALv0::CreateShishKebabGeometry()
{
+ // Oct 26,2010
// TRD1
AliEMCALGeometry * g = GetGeometry();
TString gn(g->GetName()); gn.ToUpper();
+ Double_t trd1Angle = g->GetTrd1Angle()*TMath::DegToRad(), tanTrd1 = TMath::Tan(trd1Angle/2.);
// see AliModule::fFIdTmedArr
// fIdTmedArr = fIdtmed->GetArray() - 1599 ; // see AliEMCAL::::CreateMaterials()
// int kIdAIR=1599, kIdPB = 1600, kIdSC = 1601, kIdSTEEL = 1603;
// Sensitive SC (2x2 tiles)
double parSCM0[5]={0,0,0,0}, *dummy = 0, parTRAP[11];
- // double wallThickness = g->GetPhiModuleSize()/2. - g->GetPhiTileSize(); // Need check
- double wallThickness = g->GetPhiModuleSize()/g->GetNPHIdiv() - g->GetPhiTileSize();
- for(int i=0; i<3; i++) parSCM0[i] = fParEMOD[i] - wallThickness;
- parSCM0[3] = fParEMOD[3];
- gMC->Gsvolu("SCM0", "TRD1", fIdTmedArr[kIdAIR], parSCM0, 4);
- gMC->Gspos("SCM0", 1, "EMOD", 0., 0., 0., 0, "ONLY") ;
+ if(!gn.Contains("FIRSTYEARV1")) {
+ double wallThickness = g->GetPhiModuleSize()/g->GetNPHIdiv() - g->GetPhiTileSize();
+ for(int i=0; i<3; i++) parSCM0[i] = fParEMOD[i] - wallThickness;
+ parSCM0[3] = fParEMOD[3];
+ gMC->Gsvolu("SCM0", "TRD1", fIdTmedArr[kIdAIR], parSCM0, 4);
+ gMC->Gspos("SCM0", 1, "EMOD", 0., 0., 0., 0, "ONLY") ;
+ } else {
+ double wTh = g->GetLateralSteelStrip();
+ parSCM0[0] = fParEMOD[0] - wTh + tanTrd1*g->GetTrd1AlFrontThick();
+ parSCM0[1] = fParEMOD[1] - wTh;
+ parSCM0[2] = fParEMOD[2] - wTh;
+ parSCM0[3] = fParEMOD[3] - g->GetTrd1AlFrontThick()/2.;
+ gMC->Gsvolu("SCM0", "TRD1", fIdTmedArr[kIdAIR], parSCM0, 4);
+ double zshift = g->GetTrd1AlFrontThick()/2.;
+ gMC->Gspos("SCM0", 1, "EMOD", 0., 0., zshift, 0, "ONLY");
+ //
+ CreateAlFrontPlate("EMOD","ALFP");
+ }
if(g->GetNPHIdiv()==2 && g->GetNETAdiv()==2) {
// Division to tile size - 1-oct-04
gMC->Gspos("SCMX", 2, "SCMY", xpos, 0.0, 0.0, fIdRotm, "ONLY");
// put LED to the SCM0
AliEMCALShishKebabTrd1Module *mod = (AliEMCALShishKebabTrd1Module*)fShishKebabModules->At(0);
- gMC->Gsvolu("PBTI", "BOX", fIdTmedArr[kIdPB], dummy, 0);
-
- par[1] = parSCM0[2]/2; // y
- par[2] = g->GetECPbRadThick()/2.; // z
+ Double_t tanBetta = mod->GetTanBetta();
- int nr=0;
+ int nr=0;
ypos = 0.0;
- zpos = -fSampleWidth*g->GetNECLayers()/2. + g->GetECPbRadThick()/2.;
double xCenterSCMX = (parTRAP[4] + parTRAP[8])/2.;
- AliDebug(2,Form(" Pb tiles \n"));
- for(int iz=0; iz<g->GetNECLayers(); iz++){
- par[0] = (parSCM0[0] + mod->GetTanBetta()*fSampleWidth*iz)/2.;
- xpos = par[0] - xCenterSCMX;
- gMC->Gsposp("PBTI", ++nr, "SCMX", xpos, ypos, zpos, 0, "ONLY", par, 3) ;
- AliDebug(3,Form(" %i xpos %f zpos %f par[0] %f \n", iz+1, xpos, zpos, par[0]));
- zpos += fSampleWidth;
- }
- AliDebug(2,Form(" Number of Pb tiles in SCMX %i \n", nr));
+ if(!gn.Contains("FIRSTYEARV1")) {
+ par[1] = parSCM0[2]/2; // y
+ par[2] = g->GetECPbRadThick()/2.; // z
+ gMC->Gsvolu("PBTI", "BOX", fIdTmedArr[kIdPB], dummy, 0);
+ zpos = -fSampleWidth*g->GetNECLayers()/2. + g->GetECPbRadThick()/2.;
+ AliDebug(2,Form(" Pb tiles \n"));
+ for(int iz=0; iz<g->GetNECLayers(); iz++){
+ par[0] = (parSCM0[0] + tanBetta*fSampleWidth*iz)/2.;
+ xpos = par[0] - xCenterSCMX;
+ gMC->Gsposp("PBTI", ++nr, "SCMX", xpos, ypos, zpos, 0, "ONLY", par, 3) ;
+ AliDebug(3,Form(" %i xpos %f zpos %f par[0] %f \n", iz+1, xpos, zpos, par[0]));
+ zpos += fSampleWidth;
+ }
+ AliDebug(2,Form(" Number of Pb tiles in SCMX %i \n", nr));
+ } else {
+ // Oct 26, 2010
+ // First sheet of paper
+ par[1] = parSCM0[2]/2.; // y
+ par[2] = g->GetTrd1BondPaperThick()/2.; // z
+ par[0] = parSCM0[0]/2.; // x
+ gMC->Gsvolu("PAP1", "BOX", fIdTmedArr[kIdPAPER], par, 3);
+ xpos = par[0] - xCenterSCMX;
+ zpos = -parSCM0[3] + g->GetTrd1BondPaperThick()/2.;
+ gMC->Gspos("PAP1", 1, "SCMX", xpos, ypos, zpos, 0, "ONLY");
+ for(int iz=0; iz<g->GetNECLayers()-1; iz++){
+ nr = iz + 1;
+ Double_t dz = g->GetECScintThick() + g->GetTrd1BondPaperThick() + fSampleWidth*iz;
+ // PB + 2 paper sheets
+ par[2] = g->GetECPbRadThick()/2. + g->GetTrd1BondPaperThick(); // z
+ par[0] = (parSCM0[0] + tanBetta*dz)/2.;
+ TString pa(Form("PA%2.2i",nr));
+ gMC->Gsvolu(pa.Data(), "BOX", fIdTmedArr[kIdPAPER], par, 3);
+ xpos = par[0] - xCenterSCMX;
+ zpos = -parSCM0[3] + dz + par[2];
+ gMC->Gspos(pa.Data(), 1, "SCMX", xpos, ypos, zpos, 0, "ONLY") ;
+ // Pb
+ TString pb(Form("PB%2.2i",nr));
+ par[2] = g->GetECPbRadThick()/2.; // z
+ gMC->Gsvolu(pb.Data(), "BOX", fIdTmedArr[kIdPB], par, 3);
+ gMC->Gspos(pb.Data(), 1, pa.Data(), 0.0, 0.0, 0.0, 0, "ONLY") ;
+ }
+ }
} else if(g->GetNPHIdiv()==3 && g->GetNETAdiv()==3) {
printf(" before AliEMCALv0::Trd1Tower3X3() : parSCM0");
Double_t par[3], xpos=0., ypos=0., zpos=0., rpos=0., dphi=0., phi=0.0, phiRad=0.;
Double_t par1C = 0.;
// ===== define Super Module from air - 14x30 module ==== ;
- fSampleWidth = double(g->GetECPbRadThick()+g->GetECScintThick());
AliDebug(2,Form("\n ## Super Module | fSampleWidth %5.3f ## %s \n", fSampleWidth, gn.Data()));
par[0] = g->GetShellThickness()/2.;
par[1] = g->GetPhiModuleSize()*g->GetNPhi()/2.;
void AliEMCALv0::CreateEmod(const char* mother, const char* child)
{
// 17-may-05; mother="SMOD"; child="EMOD"
+ // Oct 26,2010
AliEMCALGeometry * g = GetGeometry();
TString gn(g->GetName()); gn.ToUpper();
// Module definition
Double_t xpos=0., ypos=0., zpos=0.;
- Double_t parSCPA[5], zposSCPA=0.; // passive SC - 13-MAY-05, TRD1 case
Double_t trd1Angle = g->GetTrd1Angle()*TMath::DegToRad(), tanTrd1 = TMath::Tan(trd1Angle/2.);
- int nr=0;
- fIdRotm=0;
+
if(strcmp(mother,"SMOD")==0) {
fParEMOD[0] = g->GetEtaModuleSize()/2.; // dx1
fParEMOD[1] = g->Get2Trd1Dx2()/2.; // dx2
fParEMOD[2] = g->GetPhiModuleSize()/2.;; // dy
fParEMOD[3] = g->GetLongModuleSize()/2.; // dz
gMC->Gsvolu(child, "TRD1", fIdTmedArr[kIdSTEEL], fParEMOD, 4);
- // if(gn.Contains("WSUC") || gn.Contains("MAY05")){
- if(0){ // Jul 12 - should be checked
- parSCPA[0] = g->GetEtaModuleSize()/2. + tanTrd1*g->GetFrontSteelStrip(); // dx1
- parSCPA[1] = parSCPA[0] + tanTrd1*g->GetPassiveScintThick(); // dx2
- parSCPA[2] = g->GetPhiModuleSize()/2.; // dy
- parSCPA[3] = g->GetPassiveScintThick()/2.; // dz
- gMC->Gsvolu("SCPA", "TRD1", fIdTmedArr[kIdSC], parSCPA, 4);
- zposSCPA = -fParEMOD[3] + g->GetFrontSteelStrip() + g->GetPassiveScintThick()/2.;
- gMC->Gspos ("SCPA", ++nr, child, 0.0, 0.0, zposSCPA, 0, "ONLY");
- }
}
- nr = 0;
+ int nr=0;
+ fIdRotm=0;
// X->Z(0, 0); Y->Y(90, 90); Z->X(90, 0)
AliEMCALShishKebabTrd1Module *mod=0; // current module
mod = (AliEMCALShishKebabTrd1Module*)fShishKebabModules->At(iz);
angle = mod->GetThetaInDegree();
if(!gn.Contains("WSUC")) { // ALICE
- if(iz==0) AliMatrix(fIdRotm, 0.,0., 90.,90., 90.,0.); // z'(x); y'(y); x'(z)
- else AliMatrix(fIdRotm, 90.-angle,180., 90.0,90.0, angle, 0.);
+ AliMatrix(fIdRotm, 90.-angle,180., 90.0,90.0, angle, 0.);
phiOK = mod->GetCenterOfModule().Phi()*180./TMath::Pi();
// printf(" %2i | angle | %6.3f - %6.3f = %6.3f(eta %5.3f)\n",
//iz+1, angle, phiOK, angle-phiOK, mod->GetEtaOfCenterOfModule());
AliDebug(2,Form(" Number of modules in Super Module(%s) %i \n", mother, nr));
}
+void AliEMCALv0::CreateAlFrontPlate(const char* mother, const char* child)
+{
+ // Oct 26,2010 : Al front plate : ALFP
+ AliEMCALGeometry * g = GetGeometry();
+ TString gn(g->GetName()); gn.ToUpper();
+ Double_t trd1Angle = g->GetTrd1Angle()*TMath::DegToRad(), tanTrd1 = TMath::Tan(trd1Angle/2.);
+ Double_t parALFP[5], zposALFP=0.;
+
+ parALFP[0] = g->GetEtaModuleSize()/2. - g->GetLateralSteelStrip(); // dx1
+ parALFP[1] = parALFP[0] + tanTrd1*g->GetTrd1AlFrontThick(); // dx2
+ parALFP[2] = g->GetPhiModuleSize()/2. - g->GetLateralSteelStrip(); // dy
+ parALFP[3] = g->GetTrd1AlFrontThick()/2.; // dz
+ gMC->Gsvolu(child, "TRD1", fIdTmedArr[kIdAL], parALFP, 4);
+ zposALFP = -fParEMOD[3] + g->GetTrd1AlFrontThick()/2.;
+ gMC->Gspos (child, 1, mother, 0.0, 0.0, zposALFP, 0, "ONLY");
+}
+
//______________________________________________________________________
void AliEMCALv0::Trd1Tower3X3(const double *parSCM0)
{
AliEMCALGeometry * g = GetGeometry();
double par[3];
- // double fSampleWidth = double(g->GetECPbRadThick()+g->GetECScintThick());
double xpos = 0.0, ypos = 0.0;
double zpos = -fSampleWidth*g->GetNECLayers()/2. + g->GetECPbRadThick()/2.;
AliEMCALGeometry * g = GetGeometry();
double par[3];
- // double fSampleWidth = double(g->GetECPbRadThick()+g->GetECScintThick());
double xpos = 0.0, ypos = 0.0;
double zpos = -fSampleWidth*g->GetNECLayers()/2. + g->GetECPbRadThick()/2.;
double coef = (parTrd1[1] - parTrd1[0]) / (2.*parTrd1[3]);
AliEMCALGeometry * g = GetGeometry();
double par[5], parPB[5], parSC[5];
- //double fSampleWidth = double(g->GetECPbRadThick()+g->GetECScintThick());
double xpos = 0.0, ypos = 0.0;
double zpos = -fSampleWidth*g->GetNECLayers()/2. + g->GetECPbRadThick()/2.;
if(name == "SCMX") { // common trapezoid - 11 parameters
// gMC->Gsvolu("SCTI", "BOX", fIdTmedArr[kIdSC], dummy, 0);
double parSC[3];
- //double fSampleWidth = double(g->GetECPbRadThick()+g->GetECScintThick());
double xpos = 0.0, ypos = 0.0, zpos = 0.0, ztmp=0;;
double tanx = (parPBMO[1] - parPBMO[0]) / (2.*parPBMO[4]); // tanx = tany now
double tany = (parPBMO[3] - parPBMO[2]) / (2.*parPBMO[4]);
// As above
return TString("v0") ;
}
-
- // ShishKebab
+ // ShishKebab
void CreateShishKebabGeometry();
void CreateSmod(const char* mother="XEN1");
void CreateEmod(const char* mother="SMOD", const char* child="EMOD");
+ void CreateAlFrontPlate(const char* mother="EMOD", const char* child="ALFP");
// TRD1
void Trd1Tower3X3(const double *parSCM0);
void Trd1Tower4X4() const;
//*-- An object of this class does not produce digits
//*-- It is the one to use if you do want to produce outputs in TREEH
//*--
-//*-- Author : Aleksei Pavlinov (WSU)
+//*-- Author : Alexei Pavlinov (WSU)
// This Class not stores information on all particles prior to EMCAL entry - in order to facilitate analysis.
// This is done by setting fIShunt =2, and flagging all parents of particles entering the EMCAL.
void AliEMCALv2::DrawCalorimeterCut(const char *name, int axis, double dcut)
{
// Size of tower is 5.6x5.6x24.8 (25.0); cut on Z axiz
- TString g(fGeometry->GetName());
+ TString g(GetGeometry()->GetName());
g.ToUpper();
gMC->Gsatt("*", "seen", 0);