X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EMCAL%2FAliEMCALShishKebabTrd1Module.cxx;h=fc752423dc8c806d39c35660df72b322eb7e689e;hb=63e6d88e3536530022b00a07b5f66068710f8423;hp=a56953606a37ff4c0eb2dfecbbd29f94a226ef81;hpb=dc7da4367156024a9c39d5b7e9f89360fdaececa;p=u%2Fmrichter%2FAliRoot.git diff --git a/EMCAL/AliEMCALShishKebabTrd1Module.cxx b/EMCAL/AliEMCALShishKebabTrd1Module.cxx index a56953606a3..fc752423dc8 100644 --- a/EMCAL/AliEMCALShishKebabTrd1Module.cxx +++ b/EMCAL/AliEMCALShishKebabTrd1Module.cxx @@ -18,17 +18,19 @@ //_________________________________________________________________________ // Main class for TRD1 geometry of Shish-Kebab case. // Author: Aleksei Pavlinov(WSU). -// Sep 20004. +// Sep 20004 - Nov 2006 // 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 //_________________________________________________________________________ +#include "AliLog.h" #include "AliEMCALShishKebabTrd1Module.h" -//#include #include "AliEMCALGeometry.h" +#include + #include -#include ClassImp(AliEMCALShishKebabTrd1Module) @@ -40,10 +42,24 @@ ClassImp(AliEMCALShishKebabTrd1Module) Double_t AliEMCALShishKebabTrd1Module::fgangle=0.; // around one degree Double_t AliEMCALShishKebabTrd1Module::fgtanBetta=0; // -AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALGeometry *g) : TNamed() +//_____________________________________________________________________________ +AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALGeometry *g) + : TNamed(), + fOK(), + fA(0.), + fB(0.), + fThetaA(0.), + fTheta(theta), + fOK1(), + fOK2(), + fOB(), + fOB1(), + fOB2(), + fThetaOB1(0.), + fThetaOB2(0.), + fOK3X3() { // theta in radians ; first object shold be with theta=pi/2. - fTheta = theta; if(fgGeometry==0) { fTheta = TMath::PiOver2(); fgGeometry = g; @@ -52,17 +68,55 @@ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEM } } else Warning("AliEMCALShishKebabTrd1Module(theta)","You should call this constractor just once !!"); DefineName(fTheta); - cout<< "AliEMCALShishKebabTrd1Module - first module: theta " << fTheta << " geometry " << g << endl; + AliInfo(Form("AliEMCALShishKebabTrd1Module - first module: theta %1.4f geometry %s",fTheta,g->GetName())); } -AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor) : TNamed() +//_____________________________________________________________________________ +AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor) + : TNamed(), + fOK(), + fA(0.), + fB(0.), + fThetaA(0.), + fTheta(0.), + fOK1(), + fOK2(), + fOB(), + fOB1(), + fOB2(), + fThetaOB1(0.), + fThetaOB2(0.), + fOK3X3() { // printf("** Left Neighbor : %s **\n", leftNeighbor.GetName()); - TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1); fTheta = leftNeighbor.GetTheta() - fgangle; + + TObject::SetUniqueID(leftNeighbor.GetUniqueID()+1); + Init(leftNeighbor.GetA(),leftNeighbor.GetB()); } +//________________________________________________________________ +AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod) + : TNamed(mod.GetName(),mod.GetTitle()), + fOK(mod.fOK), + fA(mod.fA), + fB(mod.fB), + fThetaA(mod.fThetaA), + fTheta(mod.fTheta), + fOK1(mod.fOK1), + fOK2(mod.fOK2), + fOB(mod.fOB), + fOB1(mod.fOB1), + fOB2(mod.fOB2), + fThetaOB1(mod.fThetaOB1), + fThetaOB2(mod.fThetaOB2) +{ + //copy ctor + for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i]; +} + +//________________________________________________________________ void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B) { // Define parameter module from parameters A,B from previos. @@ -88,8 +142,13 @@ void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B) fA = TMath::Tan(fThetaA); // !! fB = yA - fA*xA; + DefineAllStaff(); +} + +void AliEMCALShishKebabTrd1Module::DefineAllStaff() +{ DefineName(fTheta); - // Centers of module + // Centers of cells - 2X2 case Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2 Double_t xk1 = fOK.X() - kk1*TMath::Sin(fTheta); @@ -100,12 +159,29 @@ void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B) Double_t yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr; fOK2.Set(xk2,yk2); - // May 15, 2006; position of cell face of cells + // Centers of cells - 3X3 case; Nov 9,2006 + fOK3X3[1].Set(fOK.X(), fOK.Y()-fgr); // coincide with module center + + kk1 = ((fga+fga2)/4. + fga/6.)/2.; + + xk1 = fOK.X() - kk1*TMath::Sin(fTheta); + yk1 = fOK.Y() + kk1*TMath::Cos(fTheta) - fgr; + fOK3X3[0].Set(xk1,yk1); + + xk2 = fOK.X() + kk1*TMath::Sin(fTheta); + yk2 = fOK.Y() - kk1*TMath::Cos(fTheta) - fgr; + fOK3X3[2].Set(xk2,yk2); + + // May 15, 2006; position of module(cells) center face fOB.Set(fOK.X()-fgb/2.*TMath::Cos(fTheta), fOK.Y()-fgb/2.*TMath::Sin(fTheta)-fgr); fOB1.Set(fOB.X()-fga/4.*TMath::Sin(fTheta), fOB.Y()+fga/4.*TMath::Cos(fTheta)); fOB2.Set(fOB.X()+fga/4.*TMath::Sin(fTheta), fOB.Y()-fga/4.*TMath::Cos(fTheta)); + // Jul 30, 2007 - for taking into account a position of shower maximum + fThetaOB1 = fTheta - fgangle/4.; // ?? + fThetaOB2 = fTheta + fgangle/4.; } +//_____________________________________________________________________________ void AliEMCALShishKebabTrd1Module::DefineFirstModule() { // Define first module @@ -117,23 +193,19 @@ void AliEMCALShishKebabTrd1Module::DefineFirstModule() Double_t xA = fga/2. + fga2/2., yA = fgr; fB = yA - fA*xA; - Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2 - fOK1.Set(fOK.X() - kk1, fOK.Y()-fgr); - fOK2.Set(fOK.X() + kk1, fOK.Y()-fgr); - - fOB.Set(fOK.X(),fOK.Y()-fgb/2.-fgr); - fOB1.Set(fOB.X()-fga/4., fOB.Y()); - fOB2.Set(fOB.X()+fga/4., fOB.Y()); - TObject::SetUniqueID(1); // + + DefineAllStaff(); } +//_____________________________________________________________________________ void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta) { // Define name of object SetName(Form("%2i(%5.2f)", TObject::GetUniqueID(), theta*TMath::RadToDeg())); } +//_____________________________________________________________________________ Bool_t AliEMCALShishKebabTrd1Module::GetParameters() { // Get needing module parameters from EMCAL geometry @@ -150,13 +222,16 @@ Bool_t AliEMCALShishKebabTrd1Module::GetParameters() fgangle = Double_t(fgGeometry->GetTrd1Angle())*TMath::DegToRad(); fgtanBetta = TMath::Tan(fgangle/2.); fgr = (Double_t)fgGeometry->GetIPDistance(); + if(!sn.Contains("TRD2")) fgr += fgGeometry->GetSteelFrontThickness(); + fga2 = Double_t(fgGeometry->Get2Trd1Dx2()); //PH PrintShish(0); return kTRUE; } // service methods +//_____________________________________________________________________________ void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const { // service method @@ -169,23 +244,74 @@ void AliEMCALShishKebabTrd1Module::PrintShish(int pri) const printf(" %i |%s| theta %f : fOK.Phi = %f(%5.2f)\n", GetUniqueID(), GetName(), fTheta, fOK.Phi(),fOK.Phi()*TMath::RadToDeg()); 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 \n", fOK.X(), fOK.Y()); - printf(" fOK1 : X %9.4f: Y %9.4f (local, ieta=2)\n", fOK1.X(), fOK1.Y()); - printf(" fOK2 : X %9.4f: Y %9.4f (local, ieta=1)\n\n", fOK2.X(), fOK2.Y()); + 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()); + printf(" fOK2 : X %9.4f: Y %9.4f : (local, ieta=1)\n\n", fOK2.X(), fOK2.Y()); printf(" fOB : X %9.4f: Y %9.4f \n", fOB.X(), fOB.Y()); printf(" fOB1 : X %9.4f: Y %9.4f (local, ieta=2)\n", fOB1.X(), fOB1.Y()); printf(" fOB2 : X %9.4f: Y %9.4f (local, ieta=1)\n", fOB2.X(), fOB2.Y()); + // 3X3 + printf(" 3X3 \n"); + for(int ieta=0; ieta<3; ieta++) { + printf(" fOK3X3[%i] : X %9.4f: Y %9.4f (local) \n", ieta, fOK3X3[ieta].X(), fOK3X3[ieta].Y()); + } // fOK.Dump(); + GetMaxEtaOfModule(pri); } } } +//_____________________________________________________________________________ Double_t AliEMCALShishKebabTrd1Module::GetThetaInDegree() const { return fTheta*TMath::RadToDeg(); } +//_____________________________________________________________________________ Double_t AliEMCALShishKebabTrd1Module::GetEtaOfCenterOfModule() const { return -TMath::Log(TMath::Tan(fOK.Phi()/2.)); } + +void AliEMCALShishKebabTrd1Module::GetPositionAtCenterCellLine(Int_t ieta, Double_t dist, TVector2 &v) +{ + // Jul 30, 2007 + static Double_t theta=0., x=0., y=0.; + if(ieta==0) { + v = fOB2; + theta = fThetaOB2; + } else if(ieta==1) { + v = fOB1; + theta = fThetaOB1; + } else { + assert(0); + } + x = v.X() + TMath::Cos(theta) * dist; + y = v.Y() + TMath::Sin(theta) * dist; + v.Set(x,y); + //printf(" GetPositionAtCenterCellLine() : dist %f : ieta %i : x %f | y %f \n", dist, ieta, x, y); +} + + +//_____________________________________________________________________________ +Double_t AliEMCALShishKebabTrd1Module::GetMaxEtaOfModule(int pri) const +{ + // Right bottom point of module + Double_t xBottom = (fgr - fB) / fA; + Double_t thetaBottom = TMath::ATan2(fgr, xBottom); + Double_t etaBottom = ThetaToEta(thetaBottom); + // Right top point of module + Double_t l = fgb / TMath::Cos(fgangle/2.); // length of lateral module side + Double_t xTop = xBottom + l*TMath::Cos(TMath::ATan(fA)); + Double_t yTop = fA*xTop + fB; + Double_t thetaTop = TMath::ATan2(yTop, xTop); + Double_t etaTop = ThetaToEta(thetaTop); + + if(pri) { + printf(" Right bottom point of module : eta %5.4f : theta %6.4f (%6.2f) \n", + etaBottom, thetaBottom, thetaBottom * TMath::RadToDeg()); + printf(" Right top point of module : eta %5.4f : theta %6.4f (%6.2f) \n", + etaTop, thetaTop, thetaTop * TMath::RadToDeg()); + } + return etaBottom>etaTop ? etaBottom : etaTop; +}