X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=EMCAL%2FAliEMCALShishKebabTrd1Module.cxx;h=f797403ef4152a50a0acad4a6699d96907fc9331;hb=3619f7423c705e1e04856f804f1f92911a2be829;hp=678a0ca116c6c83776d88bbdee8d46935d1c8d32;hpb=1ae500a2aac37a680262f44413990e407a73f47f;p=u%2Fmrichter%2FAliRoot.git diff --git a/EMCAL/AliEMCALShishKebabTrd1Module.cxx b/EMCAL/AliEMCALShishKebabTrd1Module.cxx index 678a0ca116c..f797403ef41 100644 --- a/EMCAL/AliEMCALShishKebabTrd1Module.cxx +++ b/EMCAL/AliEMCALShishKebabTrd1Module.cxx @@ -1,5 +1,5 @@ /************************************************************************** - * 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. * @@ -17,8 +17,8 @@ //_________________________________________________________________________ // 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 @@ -26,14 +26,13 @@ #include "AliLog.h" #include "AliEMCALShishKebabTrd1Module.h" -//#include -#include "AliEMCALGeometry.h" +#include "AliEMCALEMCGeometry.h" -#include +#include ClassImp(AliEMCALShishKebabTrd1Module) - AliEMCALGeometry *AliEMCALShishKebabTrd1Module::fgGeometry=0; + //AliEMCALEMCGeometry *AliEMCALShishKebabTrd1Module::fgGeometry=0; Double_t AliEMCALShishKebabTrd1Module::fga=0.; Double_t AliEMCALShishKebabTrd1Module::fga2=0.; Double_t AliEMCALShishKebabTrd1Module::fgb=0.; @@ -42,8 +41,9 @@ ClassImp(AliEMCALShishKebabTrd1Module) Double_t AliEMCALShishKebabTrd1Module::fgtanBetta=0; // //_____________________________________________________________________________ -AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALGeometry *g) +AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEMCALEMCGeometry *g) : TNamed(), + fGeometry(g), fOK(), fA(0.), fB(0.), @@ -56,23 +56,27 @@ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(Double_t theta, AliEM fOB2(), fThetaOB1(0.), fThetaOB2(0.), - fOK3X3() + fOK3X3(), + fORB(), + fORT() { - // theta in radians ; first object shold be with theta=pi/2. - if(fgGeometry==0) { - fTheta = TMath::PiOver2(); - fgGeometry = g; - if(GetParameters()) { - DefineFirstModule(); - } - } else Warning("AliEMCALShishKebabTrd1Module(theta)","You should call this constractor just once !!"); + // ctor + + TString snam(g->GetName()); + Int_t key=0; + if (snam.Contains("v1",TString::kIgnoreCase)) key=1; //EMCAL_COMPLETEV1 vs EMCAL_COMPLETEv1 (or other) + + if(GetParameters()) { + DefineFirstModule(key); + } DefineName(fTheta); - AliInfo(Form("AliEMCALShishKebabTrd1Module - first module: theta %1.4f geometry %s",fTheta,g->GetName())); + AliDebug(10,Form("AliEMCALShishKebabTrd1Module - first module key=%i: theta %1.4f geometry %s\n",key,fTheta, g->GetName())); } //_____________________________________________________________________________ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd1Module &leftNeighbor) : TNamed(), + fGeometry(leftNeighbor.fGeometry), fOK(), fA(0.), fB(0.), @@ -85,8 +89,13 @@ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd fOB2(), fThetaOB1(0.), fThetaOB2(0.), - fOK3X3() + fOK3X3(), + fORB(), + fORT() { + + // ctor + // printf("** Left Neighbor : %s **\n", leftNeighbor.GetName()); fTheta = leftNeighbor.GetTheta() - fgangle; @@ -98,6 +107,7 @@ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(AliEMCALShishKebabTrd //________________________________________________________________ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKebabTrd1Module& mod) : TNamed(mod.GetName(),mod.GetTitle()), + fGeometry(mod.fGeometry), fOK(mod.fOK), fA(mod.fA), fB(mod.fB), @@ -107,9 +117,14 @@ AliEMCALShishKebabTrd1Module::AliEMCALShishKebabTrd1Module(const AliEMCALShishKe fOK2(mod.fOK2), fOB(mod.fOB), fOB1(mod.fOB1), - fOB2(mod.fOB2) + fOB2(mod.fOB2), + fThetaOB1(mod.fThetaOB1), + fThetaOB2(mod.fThetaOB2), + fORB(mod.fORB), + fORT(mod.fORT) { - //copy ctor + // copy ctor + for (Int_t i=0; i<3; i++) fOK3X3[i] = mod.fOK3X3[i]; } @@ -143,7 +158,8 @@ void AliEMCALShishKebabTrd1Module::Init(Double_t A, Double_t B) } void AliEMCALShishKebabTrd1Module::DefineAllStaff() -{ +{ + //Define some parameters DefineName(fTheta); // Centers of cells - 2X2 case Double_t kk1 = (fga+fga2)/(2.*4.); // kk1=kk2 @@ -176,20 +192,58 @@ void AliEMCALShishKebabTrd1Module::DefineAllStaff() // Jul 30, 2007 - for taking into account a position of shower maximum fThetaOB1 = fTheta - fgangle/4.; // ?? fThetaOB2 = fTheta + fgangle/4.; + + // Position of right/top point of module + // Gives the posibility to estimate SM size in z direction + Double_t xBottom = (fgr - fB) / fA; + Double_t yBottom = fgr; + fORB.Set(xBottom, yBottom); + + 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; + fORT.Set(xTop, yTop); } //_____________________________________________________________________________ -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(" key=%i : wrong case \n",key); + assert(0); + } TObject::SetUniqueID(1); // DefineAllStaff(); @@ -205,24 +259,26 @@ void AliEMCALShishKebabTrd1Module::DefineName(Double_t theta) //_____________________________________________________________________________ Bool_t AliEMCALShishKebabTrd1Module::GetParameters() { - // Get needing module parameters from EMCAL geometry - if(!fgGeometry) fgGeometry = AliEMCALGeometry::GetInstance(); - TString sn(fgGeometry->GetName()); // 2-Feb-05 - sn.ToUpper(); - if(!fgGeometry) { + + // Get needing module parameters from EMCAL geometry + + if(!fGeometry) { Warning("GetParameters()"," No geometry "); return kFALSE; - } - - fga = (Double_t)fgGeometry->GetEtaModuleSize(); - fgb = (Double_t)fgGeometry->GetLongModuleSize(); - fgangle = Double_t(fgGeometry->GetTrd1Angle())*TMath::DegToRad(); + } + + TString sn(fGeometry->GetName()); // 2-Feb-05 + sn.ToUpper(); + + fga = (Double_t)fGeometry->GetEtaModuleSize(); + fgb = (Double_t)fGeometry->GetLongModuleSize(); + fgangle = Double_t(fGeometry->GetTrd1Angle())*TMath::DegToRad(); fgtanBetta = TMath::Tan(fgangle/2.); - fgr = (Double_t)fgGeometry->GetIPDistance(); + fgr = (Double_t)fGeometry->GetIPDistance(); - if(!sn.Contains("TRD2")) fgr += fgGeometry->GetSteelFrontThickness(); + fgr += fGeometry->GetSteelFrontThickness(); - fga2 = Double_t(fgGeometry->Get2Trd1Dx2()); + fga2 = Double_t(fGeometry->Get2Trd1Dx2()); //PH PrintShish(0); return kTRUE; } @@ -232,14 +288,18 @@ Bool_t AliEMCALShishKebabTrd1Module::GetParameters() 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()); @@ -270,23 +330,26 @@ 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) { + if(ieta==0) { v = fOB2; - theta = fThetaOB2; + theta = fTheta; } else if(ieta==1) { v = fOB1; - theta = fThetaOB1; + theta = fTheta; } else { assert(0); } + 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); } @@ -294,21 +357,17 @@ void AliEMCALShishKebabTrd1Module::GetPositionAtCenterCellLine(Int_t ieta, Doubl 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 thetaBottom = TMath::ATan2(fORB.Y(),fORB.X()); 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 thetaTop = TMath::ATan2(fORT.Y(),fORT.X()); 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()); + printf(" Right bottom point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", + etaBottom, thetaBottom, thetaBottom * TMath::RadToDeg(), fORB.X(), fORB.Y()); + printf(" Right top point of module : eta %5.4f : theta %6.4f (%6.2f) : x(zglob) %7.2f y(phi) %5.2f \n", + etaTop, thetaTop, thetaTop * TMath::RadToDeg(), fORT.X(), fORT.Y()); } return etaBottom>etaTop ? etaBottom : etaTop; }