// --- Standard library ---
-#include <iostream.h>
#include <stdlib.h>
// --- AliRoot header files ---
AliPHOSGeometry * AliPHOSGeometry::fgGeom = 0 ;
Bool_t AliPHOSGeometry::fgInit = kFALSE ;
+//____________________________________________________________________________
+AliPHOSGeometry::AliPHOSGeometry(void)
+{
+ // default ctor
+ // must be kept public for root persistency purposes,
+ // but should never be called by the outside world
+ fPHOSAngle = 0 ;
+ fGeometryEMCA = 0;
+ fGeometrySUPP = 0;
+ fGeometryCPV = 0;
+ fgGeom = 0;
+ fRotMatrixArray = 0;
+}
//____________________________________________________________________________
AliPHOSGeometry::~AliPHOSGeometry(void)
{
if (fRotMatrixArray) fRotMatrixArray->Delete() ;
if (fRotMatrixArray) delete fRotMatrixArray ;
- if (fPHOSAngle ) delete fPHOSAngle ;
+ if (fPHOSAngle ) delete[] fPHOSAngle ;
}
//____________________________________________________________________________
// Initializes the PHOS parameters :
// IHEP is the Protvino CPV (cathode pad chambers)
// GPS2 is the Subatech Pre-Shower (two micromegas sandwiching a passive lead converter)
- // MIXT 4 PHOS modules withe the IHEP CPV qnd one PHOS module with the Subatche Pre-Shower
+ // MIXT 4 PHOS modules withe the IHEP CPV and one PHOS module with the Subatech Pre-Shower
+ TString test(GetName()) ;
+ if (test != "IHEP" && test != "GPS2" && test != "MIXT") {
+ Fatal("Init", "%s is not a known geometry (choose among IHEP, GPS2 and MIXT)", test.Data() ) ;
+ }
+
fgInit = kTRUE ;
fNModules = 5;
this->SetPHOSAngles() ;
fRotMatrixArray = new TObjArray(fNModules) ;
- // post the geometry into the appropriate folder
- TFolder * folder = (TFolder*)gROOT->FindObjectAny("YSAlice/WhiteBoard/Geometry/PHOS");
- if ( !folder ) {
- cerr << "ERROR: AliPHOSGeometry::Init -> No WhiteBoard/Geometry/PHOS found !" << endl ;
- abort();
- } else {
- folder->SetOwner() ;
- folder->Add(this) ;
- }
-
}
-
//____________________________________________________________________________
AliPHOSGeometry * AliPHOSGeometry::GetInstance()
{
// Returns the pointer of the unique instance; singleton specific
- return (AliPHOSGeometry *) fgGeom ;
+ return static_cast<AliPHOSGeometry *>( fgGeom ) ;
}
//____________________________________________________________________________
}
}
else {
- if ( strcmp(fgGeom->GetName(), name) != 0 ) {
- cout << "AliPHOSGeometry <E> : current geometry is " << fgGeom->GetName() << endl
- << " you cannot call " << name << endl ;
- }
+ if ( strcmp(fgGeom->GetName(), name) != 0 )
+ ::Error("GetInstance", "Current geometry is %s. You cannot call %s", fgGeom->GetName(), name) ;
else
rv = (AliPHOSGeometry *) fgGeom ;
}
Float_t pphi = 2 * TMath::ATan( GetOuterBoxSize(0) / ( 2.0 * GetIPtoUpperCPVsurface() ) ) ;
pphi *= kRADDEG ;
if (pphi > fAngle){
- cout << "AliPHOSGeometry: PHOS modules overlap!\n";
- cout << "pphi = " << pphi << " fAngle " << fAngle << endl ;
+ Error("SetPHOSAngles", "PHOS modules overlap!\n pphi = %f fAngle = %f", pphi, fAngle);
}
pphi = fAngle;
else if ( opt == Degre() )
conv = 180. / TMath::Pi() ;
else {
- cout << "<I> AliPHOSGeometry::EmcXtalCoverage : " << opt << " unknown option; result in radian " << endl ;
+ Warning("EmcModuleCoverage", "%s unknown option; result in radian", opt) ;
conv = 1. ;
}
Float_t phi = GetPHOSAngle(mod) * (TMath::Pi() / 180.) ;
Float_t y0 = GetIPtoCrystalSurface() ;
- Float_t * strip = fGeometryEMCA->GetStripHalfSize() ;
- Float_t x0 = fGeometryEMCA->GetNStripX()*strip[0] ;
- Float_t z0 = fGeometryEMCA->GetNStripZ()*strip[2] ;
- Double_t angle = TMath::ATan( x0 / y0 ) ;
+ Float_t x0 = GetCellStep()*GetNPhi() ;
+ Float_t z0 = GetCellStep()*GetNZ();
+ Double_t angle = TMath::ATan( x0 / y0 / 2 ) ;
phi = phi + 1.5 * TMath::Pi() ; // to follow the convention of the particle generator(PHOS is between 220 and 320 deg.)
Double_t max = phi - angle ;
Double_t min = phi + angle ;
pM = TMath::Max(max, min) * conv ;
pm = TMath::Min(max, min) * conv ;
- angle = TMath::ATan( z0 / y0 ) ;
+ angle = TMath::ATan( z0 / y0 / 2 ) ;
max = TMath::Pi() / 2. + angle ; // to follow the convention of the particle generator(PHOS is at 90 deg.)
min = TMath::Pi() / 2. - angle ;
tM = TMath::Max(max, min) * conv ;
else if ( opt == Degre() )
conv = 180. / TMath::Pi() ;
else {
- cout << "<I> AliPHOSGeometry::EmcXtalCoverage : " << opt << " unknown option; result in radian " << endl ;
+ Warning("EmcXtalCoverage", "%s unknown option; result in radian", opt) ;
conv = 1. ;
}
}
}
+//____________________________________________________________________________
+Bool_t AliPHOSGeometry::Impact(const TParticle * particle) const
+{
+ // Check if a particle being propagates from IP along the straight line impacts EMC
+
+ Bool_t in=kFALSE;
+ Int_t moduleNumber=0;
+ Double_t z,x;
+ ImpactOnEmc(particle->Theta(),particle->Phi(),moduleNumber,z,x);
+ if(moduleNumber) in=kTRUE;
+ else in=kFALSE;
+ return in;
+}
+
//____________________________________________________________________________
Bool_t AliPHOSGeometry::RelToAbsNumbering(const Int_t * relid, Int_t & AbsId) const
{
}
//____________________________________________________________________________
+void AliPHOSGeometry::RelPosToAbsId(const Int_t module , const Double_t x, const Double_t z, Int_t & AbsId)const{
+ // Converts local PHOS-module (x, z) coordinates to absId
+ if(!module){
+ AbsId = 0 ;
+ return ;
+ }
+
+ Int_t relid[4] ;
+ relid[0] = module ;
+ relid[1] = 0 ;
+ relid[2] = static_cast<Int_t>(TMath::Ceil(GetNPhi()/2.+ x/GetCellStep()));
+ relid[3] = static_cast<Int_t>(TMath::Ceil(GetNZ()/2. - z/GetCellStep())) ;
+
+ RelToAbsNumbering(relid,AbsId) ;
+
+}
+//____________________________________________________________________________
void AliPHOSGeometry::RelPosInAlice(const Int_t id, TVector3 & pos ) const
{
// Converts the absolute numbering into the global ALICE coordinate system
// Converts the relative numbering into the local PHOS-module (x, z) coordinates
// Note: sign of z differs from that in the previous version (Yu.Kharlov, 12 Oct 2000)
- Int_t row = relid[2] ; //offset along x axiz
- Int_t column = relid[3] ; //offset along z axiz
+ Int_t row = relid[2] ; //offset along x axis
+ Int_t column = relid[3] ; //offset along z axis
- if ( relid[1] == 0 ) { // its a PbW04 crystal
- x = - ( GetNPhi()/2. - row + 0.5 ) * GetCrystalSize(0) ; // position ox Xtal with respect
- z = ( GetNZ() /2. - column + 0.5 ) * GetCrystalSize(2) ; // of center of PHOS module
+ if ( relid[1] == 0 ) { // its a PbW04 crystal
+ x = - ( GetNPhi()/2. - row + 0.5 ) * GetCellStep() ; // position of Xtal with respect
+ z = ( GetNZ() /2. - column + 0.5 ) * GetCellStep() ; // of center of PHOS module
}
else {
x = - ( GetNumberOfCPVPadsPhi()/2. - row - 0.5 ) * GetPadSizePhi() ; // position of pad with respect