#include <TFolder.h>
#include <TGeometry.h>
#include <TROOT.h>
#include <TRandom.h>
#include <TTree.h>
#include <TVirtualMC.h>
#include <TGeoPhysicalNode.h>
#include <TGeoManager.h>
#include <TGeoMatrix.h>
#include <TVector3.h>
#include <string.h>
#include <stdlib.h>
#include "AliConst.h"
#include "AliPHOSGeometry.h"
#include "AliPHOSLoader.h"
#include "AliPHOSv0.h"
#include "AliRun.h"
#include "AliLog.h"
#include "AliGeomManager.h"
ClassImp(AliPHOSv0)
AliPHOSv0::AliPHOSv0(const char *name, const char *title):
AliPHOS(name,title)
{
GetGeometry() ;
}
void AliPHOSv0::CreateGeometry()
{
AliPHOSv0 *phostmp = dynamic_cast<AliPHOSv0*>(gAlice->GetModule("PHOS")) ;
if ( phostmp == NULL ) {
fprintf(stderr, "PHOS detector not found!\n") ;
return;
}
AliPHOSGeometry * geom = GetGeometry() ;
Int_t *idtmed = fIdtmed->GetArray() - 699 ;
TVirtualMC::GetMC()->Gsvolu("PHOS", "TRD1", idtmed[798], geom->GetPHOSParams(), 4) ;
this->CreateGeometryforEMC() ;
if (strstr(fTitle.Data(),"noCPV") == 0)
this->CreateGeometryforCPV() ;
this->CreateGeometryforSupport() ;
Int_t idrotm[99] ;
Int_t iXYZ,iAngle;
char im[5] ;
Bool_t anyModuleCreated=0 ;
for (Int_t iModule = 0; iModule < 5 ; iModule++ ) {
snprintf(im,5,"%d",iModule+1) ;
if(strstr(GetTitle(),im)==0 && strcmp(GetTitle(),"IHEP")!=0 && strcmp(GetTitle(),"noCPV")!=0)
continue ;
anyModuleCreated=1 ;
Float_t angle[3][2];
for (iXYZ=0; iXYZ<3; iXYZ++)
for (iAngle=0; iAngle<2; iAngle++)
angle[iXYZ][iAngle] = geom->GetModuleAngle(iModule,iXYZ, iAngle);
AliMatrix(idrotm[iModule],
angle[0][0],angle[0][1],
angle[1][0],angle[1][1],
angle[2][0],angle[2][1]) ;
Float_t pos[3];
for (iXYZ=0; iXYZ<3; iXYZ++)
pos[iXYZ] = geom->GetModuleCenter(iModule,iXYZ);
TVirtualMC::GetMC()->Gspos("PHOS", iModule+1, "ALIC", pos[0], pos[1], pos[2],
idrotm[iModule], "ONLY") ;
}
if(!anyModuleCreated)
AliError("No one PHOS module was created") ;
}
void AliPHOSv0::CreateGeometryforEMC()
{
/*
<H2>
Geant3 geometry tree of PHOS-EMC in ALICE
</H2>
<P><CENTER>
<IMG Align=BOTTOM ALT="EMC geant tree" SRC="../../images/EMCinAlice.gif">
</CENTER><P>
*/
//END_HTML
Int_t *idtmed = fIdtmed->GetArray() - 699 ;
AliPHOSGeometry * geom = GetGeometry() ;
AliPHOSEMCAGeometry * emcg = geom->GetEMCAGeometry() ;
Float_t par[4];
Int_t ipar;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetStripHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PSTR", "BOX ", idtmed[716], par, 3) ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetAirCellHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PCEL", "BOX ", idtmed[798], par, 3);
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetWrappedHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PWRA", "BOX ", idtmed[702], par, 3);
const Float_t * pin = emcg->GetAPDHalfSize() ;
const Float_t * preamp = emcg->GetPreampHalfSize() ;
Float_t y = (emcg->GetAirGapLed()-2*pin[1]-2*preamp[1])/2;
TVirtualMC::GetMC()->Gspos("PWRA", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetCrystalHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PXTL", "BOX ", idtmed[699], par, 3) ;
TVirtualMC::GetMC()->Gspos("PXTL", 1, "PWRA", 0.0, 0.0, 0.0, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetAPDHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PPIN", "BOX ", idtmed[705], par, 3) ;
const Float_t * crystal = emcg->GetCrystalHalfSize() ;
y = crystal[1] + emcg->GetAirGapLed() /2 - preamp[1];
TVirtualMC::GetMC()->Gspos("PPIN", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetPreampHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PREA", "BOX ", idtmed[711], par, 3) ;
y = crystal[1] + emcg->GetAirGapLed() /2 + pin[1] ;
TVirtualMC::GetMC()->Gspos("PREA", 1, "PCEL", 0.0, y, 0.0, 0, "ONLY") ;
const Float_t* splate = emcg->GetSupportPlateHalfSize();
y = -splate[1] ;
const Float_t* acel = emcg->GetAirCellHalfSize() ;
for(Int_t lev = 2, icel = 1;
icel <= emcg->GetNCellsXInStrip()*emcg->GetNCellsZInStrip();
icel += 2, lev += 2) {
Float_t x = (2*(lev / 2) - 1 - emcg->GetNCellsXInStrip())* acel[0] ;
Float_t z = acel[2];
TVirtualMC::GetMC()->Gspos("PCEL", icel, "PSTR", x, y, +z, 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PCEL", icel + 1, "PSTR", x, y, -z, 0, "ONLY") ;
}
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetSupportPlateHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PSUP", "BOX ", idtmed[701], par, 3) ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetSupportPlateInHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PSHO", "BOX ", idtmed[798], par, 3) ;
Float_t z = emcg->GetSupportPlateThickness()/2 ;
TVirtualMC::GetMC()->Gspos("PSHO", 1, "PSUP", 0.0, 0.0, z, 0, "ONLY") ;
y = acel[1] ;
TVirtualMC::GetMC()->Gspos("PSUP", 1, "PSTR", 0.0, y, 0.0, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetInnerThermoHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PTII", "BOX ", idtmed[706], par, 3) ;
const Float_t * inthermo = emcg->GetInnerThermoHalfSize() ;
const Float_t * strip = emcg->GetStripHalfSize() ;
y = inthermo[1] - strip[1] ;
Int_t irow;
Int_t nr = 1 ;
Int_t icol ;
for(irow = 0; irow < emcg->GetNStripX(); irow ++){
Float_t x = (2*irow + 1 - emcg->GetNStripX())* strip[0] ;
for(icol = 0; icol < emcg->GetNStripZ(); icol ++){
z = (2*icol + 1 - emcg->GetNStripZ()) * strip[2] ;
TVirtualMC::GetMC()->Gspos("PSTR", nr, "PTII", x, y, z, 0, "ONLY") ;
nr++ ;
}
}
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetAirGapHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PAGA", "BOX ", idtmed[798], par, 3) ;
const Float_t * agap = emcg->GetAirGapHalfSize() ;
y = agap[1] - inthermo[1] ;
TVirtualMC::GetMC()->Gspos("PTII", 1, "PAGA", 0.0, y, 0.0, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetCoolerHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PCOR", "BOX ", idtmed[701], par, 3) ;
const Float_t * cooler = emcg->GetCoolerHalfSize() ;
y = cooler[1] - agap[1] ;
TVirtualMC::GetMC()->Gspos("PAGA", 1, "PCOR", 0.0, y, 0.0, 0, "ONLY") ;
for (ipar=0; ipar<4; ipar++) par[ipar] = *(emcg->GetOuterThermoParams() + ipar);
TVirtualMC::GetMC()->Gsvolu("PTIO", "TRD1", idtmed[706], par, 4) ;
const Float_t * outparams = emcg->GetOuterThermoParams() ;
Int_t idrotm[99] ;
AliMatrix(idrotm[1], 90.0, 0.0, 0.0, 0.0, 90.0, 270.0) ;
z = outparams[3] - cooler[1] ;
TVirtualMC::GetMC()->Gspos("PCOR", 1, "PTIO", 0., 0.0, z, idrotm[1], "ONLY") ;
for (ipar=0; ipar<4; ipar++) par[ipar] = *(emcg->GetAlCoverParams() + ipar);
TVirtualMC::GetMC()->Gsvolu("PCOL", "TRD1", idtmed[701], par, 4) ;
const Float_t * covparams = emcg->GetAlCoverParams() ;
z = covparams[3] - outparams[3] ;
TVirtualMC::GetMC()->Gspos("PTIO", 1, "PCOL", 0., 0.0, z, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFiberGlassHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFGC", "BOX ", idtmed[717], par, 3) ;
z = - outparams[3] ;
TVirtualMC::GetMC()->Gspos("PFGC", 1, "PCOL", 0., 0.0, z, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetWarmAlCoverHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PWAR", "BOX ", idtmed[701], par, 3) ;
const Float_t * warmcov = emcg->GetWarmAlCoverHalfSize() ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetWarmThermoHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PWTI", "BOX ", idtmed[706], par, 3) ;
const Float_t * warmthermo = emcg->GetWarmThermoHalfSize() ;
z = -warmcov[2] + warmthermo[2] ;
TVirtualMC::GetMC()->Gspos("PWTI", 1, "PWAR", 0., 0.0, z, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetTCables1HalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PCA1", "BOX ", idtmed[718], par, 3) ;
const Float_t * cbox = emcg->GetTCables1HalfSize() ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetTSupport1HalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PBE1", "BOX ", idtmed[701], par, 3) ;
const Float_t * beams = emcg->GetTSupport1HalfSize() ;
Int_t isup ;
for(isup = 0; isup < emcg->GetNTSuppots(); isup++){
Float_t x = -cbox[0] + beams[0] + (2*beams[0]+emcg->GetTSupportDist())*isup ;
TVirtualMC::GetMC()->Gspos("PBE1", isup, "PCA1", x, 0.0, 0.0, 0, "ONLY") ;
}
z = -warmthermo[2] + cbox[2];
TVirtualMC::GetMC()->Gspos("PCA1", 1, "PWTI", 0.0, 0.0, z, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetTCables2HalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PCA2", "BOX ", idtmed[718], par, 3) ;
const Float_t * cbox2 = emcg->GetTCables2HalfSize() ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetTSupport2HalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PBE2", "BOX ", idtmed[701], par, 3) ;
for(isup = 0; isup < emcg->GetNTSuppots(); isup++){
Float_t x = -cbox[0] + beams[0] + (2*beams[0]+emcg->GetTSupportDist())*isup ;
TVirtualMC::GetMC()->Gspos("PBE2", isup, "PCA2", x, 0.0, 0.0, 0, "ONLY") ;
}
z = -warmthermo[2] + 2*cbox[2] + cbox2[2];
TVirtualMC::GetMC()->Gspos("PCA2", 1, "PWTI", 0.0, 0.0, z, 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFrameXHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFRX", "BOX ", idtmed[716], par, 3) ;
const Float_t * posit1 = emcg->GetFrameXPosition() ;
TVirtualMC::GetMC()->Gspos("PFRX", 1, "PWTI", posit1[0], posit1[1], posit1[2], 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PFRX", 2, "PWTI", posit1[0], -posit1[1], posit1[2], 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFrameZHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFRZ", "BOX ", idtmed[716], par, 3) ;
const Float_t * posit2 = emcg->GetFrameZPosition() ;
TVirtualMC::GetMC()->Gspos("PFRZ", 1, "PWTI", posit2[0], posit2[1], posit2[2], 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PFRZ", 2, "PWTI", -posit2[0], posit2[1], posit2[2], 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFGupXHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFG1", "BOX ", idtmed[717], par, 3) ;
const Float_t * posit3 = emcg->GetFGupXPosition() ;
TVirtualMC::GetMC()->Gspos("PFG1", 1, "PWTI", posit3[0], posit3[1], posit3[2], 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PFG1", 2, "PWTI", posit3[0], -posit3[1], posit3[2], 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFGupZHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFG2", "BOX ", idtmed[717], par, 3) ;
const Float_t * posit4 = emcg->GetFGupZPosition();
TVirtualMC::GetMC()->Gspos("PFG2", 1, "PWTI", posit4[0], posit4[1], posit4[2], 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PFG2", 2, "PWTI", -posit4[0], posit4[1], posit4[2], 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFGlowXHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFG3", "BOX ", idtmed[717], par, 3) ;
const Float_t * posit5 = emcg->GetFGlowXPosition() ;
TVirtualMC::GetMC()->Gspos("PFG3", 1, "PWTI", posit5[0], posit5[1], posit5[2], 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PFG3", 2, "PWTI", posit5[0], -posit5[1], posit5[2], 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFGlowZHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PFG4", "BOX ", idtmed[717], par, 3) ;
const Float_t * posit6 = emcg->GetFGlowZPosition() ;
TVirtualMC::GetMC()->Gspos("PFG4", 1, "PWTI", posit6[0], posit6[1], posit6[2], 0, "ONLY") ;
TVirtualMC::GetMC()->Gspos("PFG4", 2, "PWTI", -posit6[0], posit6[1], posit6[2], 0, "ONLY") ;
for (ipar=0; ipar<3; ipar++) par[ipar] = *(emcg->GetFEEAirHalfSize() + ipar);
TVirtualMC::GetMC()->Gsvolu("PAFE", "BOX ", idtmed[798], par, 3) ;
const Float_t * posit7 = emcg->GetFEEAirPosition() ;
TVirtualMC::GetMC()->Gspos("PAFE", 1, "PWTI", posit7[0], posit7[1], posit7[2], 0, "ONLY") ;
for (ipar=0; ipar<4; ipar++) par[ipar] = *(emcg->GetEMCParams() + ipar);
TVirtualMC::GetMC()->Gsvolu("PEMC", "TRD1", idtmed[798], par, 4) ;
z = - warmcov[2] ;
TVirtualMC::GetMC()->Gspos("PCOL", 1, "PEMC", 0., 0., z, 0, "ONLY") ;
z = covparams[3] ;
TVirtualMC::GetMC()->Gspos("PWAR", 1, "PEMC", 0., 0., z, 0, "ONLY") ;
z = geom->GetCPVBoxSize(1) / 2. ;
TVirtualMC::GetMC()->Gspos("PEMC", 1, "PHOS", 0., 0., z, 0, "ONLY") ;
}
void AliPHOSv0::CreateGeometryforCPV()
{
/*
<H2>
Geant3 geometry of PHOS-CPV in ALICE
</H2>
<table width=700>
<tr>
<td>CPV perspective view</td>
<td>CPV front view </td>
</tr>
<tr>
<td> <img height=300 width=290 src="../../images/CPVallPersp.gif"> </td>
<td> <img height=300 width=290 src="../../images/CPVallFront.gif"> </td>
</tr>
<tr>
<td>One CPV module, perspective view </td>
<td>One CPV module, front view (extended in vertical direction) </td>
</tr>
<tr>
<td><img height=300 width=290 src="../../images/CPVmodulePers.gif"></td>
<td><img height=300 width=290 src="../../images/CPVmoduleSide.gif"></td>
</tr>
</table>
<H2>
Geant3 geometry tree of PHOS-CPV in ALICE
</H2>
<center>
<img height=300 width=290 src="../../images/CPVtree.gif">
</center>
*/
//END_HTML
Float_t par[3], x,y,z;
Int_t *idtmed = fIdtmed->GetArray() - 699 ;
AliPHOSGeometry * geom = GetGeometry() ;
par[0] = geom->GetCPVBoxSize(0) / 2.0 ;
par[1] = geom->GetCPVBoxSize(1) / 2.0 ;
par[2] = geom->GetCPVBoxSize(2) / 2.0 ;
TVirtualMC::GetMC()->Gsvolu("PCPV", "BOX ", idtmed[798], par, 3) ;
const Float_t * emcParams = geom->GetEMCAGeometry()->GetEMCParams() ;
z = - emcParams[3] ;
Int_t rotm ;
AliMatrix(rotm, 90.,0., 0., 0., 90., 90.) ;
TVirtualMC::GetMC()->Gspos("PCPV", 1, "PHOS", 0.0, 0.0, z, rotm, "ONLY") ;
par[0] = geom->GetGassiplexChipSize(0)/2.;
par[1] = geom->GetGassiplexChipSize(1)/2.;
par[2] = geom->GetGassiplexChipSize(2)/2.;
TVirtualMC::GetMC()->Gsvolu("PCPC","BOX ",idtmed[707],par,3);
par[1] = geom->GetCPVCuNiFoilThickness()/2;
TVirtualMC::GetMC()->Gsvolu("PCPD","BOX ",idtmed[710],par,3);
y = -(geom->GetGassiplexChipSize(1)/2 - par[1]);
TVirtualMC::GetMC()->Gspos("PCPD",1,"PCPC",0,y,0,0,"ONLY");
Float_t xStep = geom->GetCPVActiveSize(0) / (geom->GetNumberOfCPVChipsPhi() + 1);
Float_t zStep = geom->GetCPVActiveSize(1) / (geom->GetNumberOfCPVChipsZ() + 1);
Int_t copy = 0;
y = geom->GetCPVFrameSize(1)/2 - geom->GetFTPosition(0) +
geom->GetCPVTextoliteThickness() / 2 + geom->GetGassiplexChipSize(1) / 2 + 0.1;
for (Int_t ix=0; ix<geom->GetNumberOfCPVChipsPhi(); ix++) {
x = xStep * (ix+1) - geom->GetCPVActiveSize(0)/2;
for (Int_t iz=0; iz<geom->GetNumberOfCPVChipsZ(); iz++) {
copy++;
z = zStep * (iz+1) - geom->GetCPVActiveSize(1)/2;
TVirtualMC::GetMC()->Gspos("PCPC",copy,"PCPV",x,y,z,0,"ONLY");
}
}
par[0] = geom->GetCPVActiveSize(0) / 2;
par[1] = geom->GetCPVTextoliteThickness() / 2;
par[2] = geom->GetCPVActiveSize(1) / 2;
TVirtualMC::GetMC()->Gsvolu("PCPF","BOX ",idtmed[707],par,3);
par[1] = (geom->GetFTPosition(2) - geom->GetFTPosition(1) - geom->GetCPVTextoliteThickness()) / 2;
TVirtualMC::GetMC()->Gsvolu("PCPG","BOX ",idtmed[715],par,3);
for (Int_t i=0; i<4; i++) {
y = geom->GetCPVFrameSize(1) / 2 - geom->GetFTPosition(i) + geom->GetCPVTextoliteThickness()/2;
TVirtualMC::GetMC()->Gspos("PCPF",i+1,"PCPV",0,y,0,0,"ONLY");
if(i==1){
y-= (geom->GetFTPosition(2) - geom->GetFTPosition(1)) / 2;
TVirtualMC::GetMC()->Gspos("PCPG",1,"PCPV ",0,y,0,0,"ONLY");
}
}
par[1]=0.001;
TVirtualMC::GetMC()->Gsvolu("PCPQ","BOX ",idtmed[715],par,3);
TVirtualMC::GetMC()->Gspos ("PCPQ",1,"PCPG",0,0,0,0,"ONLY");
par[1] = geom->GetCPVCuNiFoilThickness() / 2;
TVirtualMC::GetMC()->Gsvolu("PCP1","BOX ",idtmed[710],par,3);
y = geom->GetCPVTextoliteThickness()/2 - par[1];
TVirtualMC::GetMC()->Gspos ("PCP1",1,"PCPF",0,y,0,0,"ONLY");
par[0] = geom->GetCPVFrameSize(0)/2;
par[1] = geom->GetCPVFrameSize(1)/2;
par[2] = geom->GetCPVBoxSize(2) /2;
TVirtualMC::GetMC()->Gsvolu("PCF1","BOX ",idtmed[701],par,3);
par[0] = geom->GetCPVBoxSize(0)/2 - geom->GetCPVFrameSize(0);
par[1] = geom->GetCPVFrameSize(1)/2;
par[2] = geom->GetCPVFrameSize(2)/2;
TVirtualMC::GetMC()->Gsvolu("PCF2","BOX ",idtmed[701],par,3);
for (Int_t j=0; j<=1; j++) {
x = TMath::Sign(1,2*j-1) * (geom->GetCPVBoxSize(0) - geom->GetCPVFrameSize(0)) / 2;
TVirtualMC::GetMC()->Gspos("PCF1",j+1,"PCPV", x,0,0,0,"ONLY");
z = TMath::Sign(1,2*j-1) * (geom->GetCPVBoxSize(2) - geom->GetCPVFrameSize(2)) / 2;
TVirtualMC::GetMC()->Gspos("PCF2",j+1,"PCPV",0, 0,z,0,"ONLY");
}
}
void AliPHOSv0::CreateGeometryforSupport()
{
/*
<H2>
Geant3 geometry of the PHOS's support
</H2>
<P><CENTER>
<IMG Align=BOTTOM ALT="EMC geant tree" SRC="../../images/PHOS_support.gif">
</CENTER><P>
*/
//END_HTML
Float_t par[5], x0,y0,z0 ;
Int_t i,j,copy;
Int_t *idtmed = fIdtmed->GetArray() - 699 ;
AliPHOSGeometry * geom = GetGeometry() ;
par[0] = geom->GetRailRoadSize(0) / 2.0 ;
par[1] = geom->GetRailRoadSize(1) / 2.0 ;
par[2] = geom->GetRailRoadSize(2) / 2.0 ;
TVirtualMC::GetMC()->Gsvolu("PRRD", "BOX ", idtmed[798], par, 3) ;
y0 = -(geom->GetRailsDistanceFromIP() - geom->GetRailRoadSize(1) / 2.0) ;
TVirtualMC::GetMC()->Gspos("PRRD", 1, "ALIC", 0.0, y0, 0.0, 0, "ONLY") ;
par[0] = geom->GetRailOuterSize(0) / 2.0 ;
par[1] = geom->GetRailOuterSize(1) / 2.0 ;
par[2] = geom->GetRailOuterSize(2) / 2.0 ;
TVirtualMC::GetMC()->Gsvolu("PRAI", "BOX ", idtmed[798], par, 3) ;
for (i=0; i<2; i++) {
x0 = (2*i-1) * geom->GetDistanceBetwRails() / 2.0 ;
TVirtualMC::GetMC()->Gspos("PRAI", i, "PRRD", x0, 0.0, 0.0, 0, "ONLY") ;
}
par[0] = geom->GetRailPart1(0) / 2.0 ;
par[1] = geom->GetRailPart1(1) / 2.0 ;
par[2] = geom->GetRailPart1(2) / 2.0 ;
TVirtualMC::GetMC()->Gsvolu("PRP1", "BOX ", idtmed[716], par, 3) ;
y0 = - (geom->GetRailOuterSize(1) - geom->GetRailPart1(1)) / 2.0 ;
TVirtualMC::GetMC()->Gspos("PRP1", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ;
y0 = (geom->GetRailOuterSize(1) - geom->GetRailPart1(1)) / 2.0 - geom->GetRailPart3(1);
TVirtualMC::GetMC()->Gspos("PRP1", 2, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ;
par[0] = geom->GetRailPart2(0) / 2.0 ;
par[1] = geom->GetRailPart2(1) / 2.0 ;
par[2] = geom->GetRailPart2(2) / 2.0 ;
TVirtualMC::GetMC()->Gsvolu("PRP2", "BOX ", idtmed[716], par, 3) ;
y0 = - geom->GetRailPart3(1) / 2.0 ;
TVirtualMC::GetMC()->Gspos("PRP2", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ;
par[0] = geom->GetRailPart3(0) / 2.0 ;
par[1] = geom->GetRailPart3(1) / 2.0 ;
par[2] = geom->GetRailPart3(2) / 2.0 ;
TVirtualMC::GetMC()->Gsvolu("PRP3", "BOX ", idtmed[716], par, 3) ;
y0 = (geom->GetRailOuterSize(1) - geom->GetRailPart3(1)) / 2.0 ;
TVirtualMC::GetMC()->Gspos("PRP3", 1, "PRAI", 0.0, y0, 0.0, 0, "ONLY") ;
par[1] = TMath::Sqrt(TMath::Power((geom->GetIPtoCPVDistance() + geom->GetOuterBoxSize(3)),2) +
TMath::Power((geom->GetOuterBoxSize(1)/2),2))+10. ;
par[0] = par[1] - geom->GetCradleWall(1) ;
par[2] = geom->GetCradleWall(2) / 2.0 ;
par[3] = geom->GetCradleWall(3) ;
par[4] = geom->GetCradleWall(4) ;
TVirtualMC::GetMC()->Gsvolu("PCRA", "TUBS", idtmed[716], par, 5) ;
par[0] += geom->GetCradleWallThickness() ;
par[1] -= geom->GetCradleWallThickness() ;
par[2] -= geom->GetCradleWallThickness() ;
TVirtualMC::GetMC()->Gsvolu("PCRE", "TUBS", idtmed[798], par, 5) ;
TVirtualMC::GetMC()->Gspos ("PCRE", 1, "PCRA", 0.0, 0.0, 0.0, 0, "ONLY") ;
for (i=0; i<2; i++) {
z0 = (2*i-1) * (geom->GetOuterBoxSize(2) + geom->GetCradleWall(2) )/ 2.0 ;
TVirtualMC::GetMC()->Gspos("PCRA", i, "ALIC", 0.0, 0.0, z0, 0, "ONLY") ;
}
par[0] = geom->GetCradleWheel(0) / 2;
par[1] = geom->GetCradleWheel(1) / 2;
par[2] = geom->GetCradleWheel(2) / 2;
TVirtualMC::GetMC()->Gsvolu("PWHE", "BOX ", idtmed[716], par, 3) ;
y0 = -(geom->GetRailsDistanceFromIP() - geom->GetRailRoadSize(1) -
geom->GetCradleWheel(1)/2) ;
for (i=0; i<2; i++) {
z0 = (2*i-1) * ((geom->GetOuterBoxSize(2) + geom->GetCradleWheel(2))/ 2.0 +
geom->GetCradleWall(2));
for (j=0; j<2; j++) {
copy = 2*i + j;
x0 = (2*j-1) * geom->GetDistanceBetwRails() / 2.0 ;
TVirtualMC::GetMC()->Gspos("PWHE", copy, "ALIC", x0, y0, z0, 0, "ONLY") ;
}
}
}
void AliPHOSv0::AddAlignableVolumes() const
{
TString volpath, symname;
AliGeomManager::ELayerID idPHOS1 = AliGeomManager::kPHOS1;
AliGeomManager::ELayerID idPHOS2 = AliGeomManager::kPHOS2;
Int_t modUID, modnum = 0;
TString physModulePath="/ALIC_1/PHOS_";
TString symbModuleName="PHOS/Module";
Int_t nModules = GetGeometry()->GetNModules();
char im[5] ;
for(Int_t iModule=1; iModule<=nModules; iModule++){
snprintf(im,5,"%d",iModule) ;
modUID = AliGeomManager::LayerToVolUID(idPHOS1,modnum++);
if(strstr(GetTitle(),im)==0 && strcmp(GetTitle(),"IHEP")!=0 && strcmp(GetTitle(),"noCPV")!=0)
continue ;
volpath = physModulePath;
volpath += iModule;
if (!gGeoManager->CheckPath(volpath.Data())) {
AliError(Form("Volume path %s not valid!",volpath.Data()));
continue;
}
symname = symbModuleName;
symname += iModule;
if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data(),modUID))
continue ;
TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID) ;
Float_t angle = GetGeometry()->GetPHOSAngle(iModule);
TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig();
TGeoHMatrix *matTtoL = new TGeoHMatrix;
matTtoL->RotateZ(-90.+angle);
matTtoL->MultiplyLeft(&(globMatrix->Inverse()));
alignableEntry->SetMatrix(matTtoL);
}
symbModuleName="PHOS/Module";
modnum=0;
for(Int_t iModule=1; iModule<=nModules; iModule++){
if(strstr(GetTitle(),"noCPV"))
continue ;
snprintf(im,5,"%d",iModule) ;
modUID = AliGeomManager::LayerToVolUID(idPHOS2,modnum++);
if(strstr(GetTitle(),im)==0 && strcmp(GetTitle(),"IHEP")!=0)
continue ;
volpath = physModulePath;
volpath += iModule;
volpath += "/PCPV_1";
if (!gGeoManager->CheckPath(volpath.Data())) {
AliError(Form("Volume path %s not valid!",volpath.Data()));
continue;
}
symname = symbModuleName;
symname += iModule;
symname += "/CPV";
if(!gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data(),modUID))
AliFatal(Form("Alignable entry %s not created. Volume path %s not valid", symname.Data(),volpath.Data()));
TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID) ;
Float_t angle = GetGeometry()->GetPHOSAngle(iModule);
TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig();
TGeoHMatrix *matTtoL = new TGeoHMatrix;
matTtoL->RotateZ(-90.+angle);
matTtoL->MultiplyLeft(&(globMatrix->Inverse()));
alignableEntry->SetMatrix(matTtoL);
}
TString physCradlePath="/ALIC_1/PCRA_";
TString symbCradleName="PHOS/Cradle";
Int_t nCradles = 2;
for(Int_t iCradle=0; iCradle<nCradles; iCradle++){
volpath = physCradlePath;
volpath += iCradle;
symname = symbCradleName;
symname += iCradle;
gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
}
TString physWheelPath="/ALIC_1/PWHE_";
TString symbWheelName="PHOS/Wheel";
Int_t nWheels = 4;
for(Int_t iWheel=0; iWheel<nWheels; iWheel++){
volpath = physWheelPath;
volpath += iWheel;
symname = symbWheelName;
symname += iWheel;
gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
}
const Int_t nStripsX = GetGeometry()->GetEMCAGeometry()->GetNStripX();
const Int_t nStripsZ = GetGeometry()->GetEMCAGeometry()->GetNStripZ();
TString partialPhysStripName(100);
TString fullPhysStripName(100);
TString partialSymbStripName(100);
TString fullSymbStripName(100);
for(Int_t module = 1; module <= nModules; ++module){
snprintf(im,5,"%d",module) ;
if(strstr(GetTitle(),im)==0 && strcmp(GetTitle(),"IHEP")!=0 && strcmp(GetTitle(),"noCPV")!=0)
continue ;
volpath = physModulePath;
volpath += module;
if (!gGeoManager->CheckPath(volpath.Data())) {
AliError(Form("Volume path %s does not exist",volpath.Data())) ;
continue;
}
partialPhysStripName = physModulePath;
partialPhysStripName += module;
partialPhysStripName += "/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1/PSTR_";
partialSymbStripName = symbModuleName;
partialSymbStripName += module;
partialSymbStripName += "/Strip_";
for(Int_t i = 0, ind1D = 1; i < nStripsX; ++i){
for(Int_t j = 0; j < nStripsZ; ++j, ++ind1D){
fullPhysStripName = partialPhysStripName;
fullPhysStripName += ind1D;
fullSymbStripName = partialSymbStripName;
fullSymbStripName += i;
fullSymbStripName += '_';
fullSymbStripName += j;
gGeoManager->SetAlignableEntry(fullSymbStripName.Data(), fullPhysStripName.Data());
TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(fullSymbStripName.Data()) ;
const char *path = alignableEntry->GetTitle();
if (!gGeoManager->cd(path))
AliFatal(Form("Volume path %s not valid!",path));
TGeoHMatrix matLtoT = *gGeoManager->GetCurrentMatrix() ;
Double_t refl[3]={-1.,-1.,-1.} ;
matLtoT.SetScale(refl) ;
TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT.Inverse());
char phosPath[50] ;
snprintf(phosPath,50,"/ALIC_1/PHOS_%d",module) ;
if (!gGeoManager->cd(phosPath)){
AliFatal("Geo manager can not find path \n");
}
TGeoHMatrix *mPHOS = gGeoManager->GetCurrentMatrix();
if (mPHOS)
matTtoL->Multiply(mPHOS);
else{
AliFatal("Geo matrixes are not loaded \n") ;
}
Double_t rot[9]={1.,0.,0., 0.,1.,0., 0.,0.,1.} ;
matTtoL->SetRotation(rot) ;
alignableEntry->SetMatrix(matTtoL);
}
}
}
}
Float_t AliPHOSv0::ZMin(void) const
{
AliPHOSGeometry * geom = GetGeometry() ;
return -geom->GetOuterBoxSize(2)/2.;
}
Float_t AliPHOSv0::ZMax(void) const
{
AliPHOSGeometry * geom = GetGeometry() ;
return geom->GetOuterBoxSize(2)/2.;
}
void AliPHOSv0::Init(void)
{
Int_t i;
if(AliLog::GetGlobalDebugLevel()>0) {
TString st ;
for(i=0;i<35;i++)
st += "*";
Info("Init", "%s", st.Data()) ;
AliPHOSGeometry * geom = GetGeometry() ;
if (geom!=0)
Info("Init", "AliPHOS%s: PHOS geometry intialized for %s", Version().Data(), geom->GetName()) ;
else
Info("Init", "AliPHOS%s: PHOS geometry initialization failed !", Version().Data()) ;
Info("Init", "%s", st.Data()) ;
}
}