X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCParam.cxx;h=4d90fd272f4fef9293b618bfeed8317b271a3fd3;hb=de31eda25b1e6bcb83a300aaf5891fa7e219bbb9;hp=bf99ecf237b030c5eacd8928e35f22512a19a30b;hpb=0bbae0f2c896b50dbceec473819b9f15563722b4;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCParam.cxx b/TPC/AliTPCParam.cxx index bf99ecf237b..4d90fd272f4 100644 --- a/TPC/AliTPCParam.cxx +++ b/TPC/AliTPCParam.cxx @@ -13,51 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.10 2000/07/10 20:57:39 hristov -Update of TPC code and macros by M.Kowalski - -Revision 1.9 2000/06/30 12:07:50 kowal2 -Updated from the TPC-PreRelease branch - -Revision 1.8.4.4 2000/06/26 07:39:42 kowal2 -Changes to obey the coding rules - -Revision 1.8.4.3 2000/06/25 08:38:41 kowal2 -Splitted from AliTPCtracking - -Revision 1.8.4.2 2000/06/14 16:48:24 kowal2 -Parameter setting improved. Removed compiler warnings - -Revision 1.8.4.1 2000/06/09 07:12:21 kowal2 - -Updated defaults - -Revision 1.8 2000/04/17 09:37:33 kowal2 -removed obsolete AliTPCDigitsDisplay.C - -Revision 1.7.8.2 2000/04/10 08:44:51 kowal2 - -New transformations added -Different pad and pad-rows geometries for different sectors - -Revision 1.7.8.1 2000/04/10 07:56:53 kowal2 -Not used anymore - removed - -Revision 1.7 1999/10/08 13:10:35 fca -Values in SetDefault are in radiants - -Revision 1.6 1999/10/08 06:27:59 fca -Defaults updated - -Revision 1.5 1999/10/05 17:18:27 fca -Correct GetWire check on even/odd fnWires - -Revision 1.4 1999/09/29 09:24:34 fca -Introduction of the Copyright and cvs Log - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////// // Manager and of geomety classes for set: TPC // @@ -72,14 +28,13 @@ Introduction of the Copyright and cvs Log // -#include -#include -#include -#include #include - - +#include +#include +#include "AliAlignObj.h" +#include "AliAlignObjAngles.h" +#include "AliLog.h" ClassImp(AliTPCParam) @@ -94,7 +49,8 @@ AliTPCParam::AliTPCParam() fResponseBin = 0; fResponseWeight = 0; fRotAngle = 0; - SetTitle("75x40_100x60"); + fTrackingMatrix = fClusterMatrix = fGlobalMatrix = 0; + SetTitle("75x40_100x60_150x60"); SetDefault(); } @@ -108,6 +64,24 @@ AliTPCParam::~AliTPCParam() if (fResponseWeight!=0) delete [] fResponseWeight; if (fRotAngle !=0) delete [] fRotAngle; + if (fTrackingMatrix) { + for(Int_t i = 0; i < fNSector; i++) + delete fTrackingMatrix[i]; + delete [] fTrackingMatrix; + } + + if (fClusterMatrix) { + for(Int_t i = 0; i < fNSector; i++) + delete fClusterMatrix[i]; + delete [] fClusterMatrix; + } + + if (fGlobalMatrix) { + for(Int_t i = 0; i < fNSector; i++) + delete fGlobalMatrix[i]; + delete [] fGlobalMatrix; + } + } @@ -131,7 +105,7 @@ Int_t AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index) const if ( (xyz[0]>0) && (xyz[1]<0) ) angle=2*TMath::Pi()+angle; } - sector=Int_t((angle-fInnerAngleShift)/fInnerAngle); + sector=Int_t(TMath::Nint((angle-fInnerAngleShift)/fInnerAngle)); Float_t cos,sin; AdjustCosSin(sector,cos,sin); @@ -139,7 +113,7 @@ Int_t AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index) const if (x1>fOuterRadiusLow) { - sector=Int_t((angle-fOuterAngleShift)/fOuterAngle)+fNInnerSector; + sector=Int_t(TMath::Nint((angle-fOuterAngleShift)/fOuterAngle))+fNInnerSector; if (xyz[2]<0) sector+=(fNOuterSector>>1); } else @@ -149,7 +123,7 @@ Int_t AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index) const return sector; } -Bool_t AliTPCParam::Transform(Float_t *xyz, Int_t *index, Int_t* oindex) +Bool_t AliTPCParam::Transform(Float_t */*xyz*/, Int_t *index, Int_t* /*oindex*/) { //transformation from input coodination system to output coordination system switch (index[0]){ @@ -222,7 +196,7 @@ void AliTPCParam::SetSectorAngles(Float_t innerangle, Float_t innershift, Float { // // set opening angles - const static Float_t kDegtoRad = 0.01745329251994; + static const Float_t kDegtoRad = 0.01745329251994; fInnerAngle = innerangle; //opening angle of Inner sector fInnerAngleShift = innershift; //shift of first inner sector center to the 0 fOuterAngle = outerangle; //opening angle of outer sector @@ -258,7 +232,7 @@ Float_t AliTPCParam::GetOuterAngleShift() const } -Int_t AliTPCParam::GetIndex(Int_t sector, Int_t row) +Int_t AliTPCParam::GetIndex(Int_t sector, Int_t row) const { // //give index of the given sector and pad row @@ -297,77 +271,92 @@ void AliTPCParam::SetDefault() // //sector default parameters // - const static Float_t kInnerRadiusLow = 82.97; - const static Float_t kOuterRadiusLow = 133.58; - const static Float_t kInnerRadiusUp = 133.17; - const static Float_t kOuterRadiusUp = 247.78; - const static Float_t kInnerAngle = 20; // 20 degrees - const static Float_t kInnerAngleShift = 10; - const static Float_t kOuterAngle = 20; // 20 degrees - const static Float_t kOuterAngleShift = 10; - const static Float_t kInnerFrameSpace = 1.5; - const static Float_t kOuterFrameSpace = 1.5; - const static Float_t kInnerWireMount = 1.370825926; - const static Float_t kOuterWireMount = 1.370825926; - const static Float_t kZLength =250.; - const static Int_t kGeometryType = 0; //straight rows + static const Float_t kInnerRadiusLow = 83.65; + static const Float_t kInnerRadiusUp = 133.3; + static const Float_t kOuterRadiusLow = 133.5; + static const Float_t kOuterRadiusUp = 247.7; + static const Float_t kInnerAngle = 20; // 20 degrees + static const Float_t kInnerAngleShift = 10; + static const Float_t kOuterAngle = 20; // 20 degrees + static const Float_t kOuterAngleShift = 10; + static const Float_t kInnerFrameSpace = 1.5; + static const Float_t kOuterFrameSpace = 1.5; + static const Float_t kInnerWireMount = 1.2; + static const Float_t kOuterWireMount = 1.4; + static const Float_t kZLength =250.; + static const Int_t kGeometryType = 0; //straight rows + static const Int_t kNRowLow = 63; + static const Int_t kNRowUp1 = 64; + static const Int_t kNRowUp2 = 32; + static const Int_t kNRowUp = 96; // //wires default parameters // - const static Int_t kNInnerWiresPerPad = 3; - const static Int_t kInnerDummyWire = 2; - const static Float_t kInnerOffWire = 0.5; - const static Int_t kNOuterWiresPerPad = 4; - const static Int_t kOuterDummyWire = 2; - const static Float_t kOuterOffWire = 0.5; + static const Int_t kNInnerWiresPerPad = 3; + static const Int_t kInnerDummyWire = 2; + static const Float_t kInnerWWPitch = 0.25; + static const Float_t kRInnerFirstWire = 84.475; + static const Float_t kRInnerLastWire = 132.475; + static const Float_t kInnerOffWire = 0.5; + static const Int_t kNOuter1WiresPerPad = 4; + static const Int_t kNOuter2WiresPerPad = 6; + static const Float_t kOuterWWPitch = 0.25; + static const Float_t kROuterFirstWire = 134.225; + static const Float_t kROuterLastWire = 246.975; + static const Int_t kOuterDummyWire = 2; + static const Float_t kOuterOffWire = 0.5; // //pad default parameters // - const static Float_t kInnerPadPitchLength = 0.75; - const static Float_t kInnerPadPitchWidth = 0.40; - const static Float_t kInnerPadLength = 0.75; - const static Float_t kInnerPadWidth = 0.40; - const static Float_t kOuterPadPitchLength = 1.0; - const static Float_t kOuterPadPitchWidth = 0.6; - const static Float_t kOuterPadLength = 1.0; - const static Float_t kOuterPadWidth = 0.6; - const static Bool_t kBMWPCReadout = kTRUE; //MWPC readout - another possibility GEM - const static Int_t kNCrossRows = 1; //number of rows to cross-talk + static const Float_t kInnerPadPitchLength = 0.75; + static const Float_t kInnerPadPitchWidth = 0.40; + static const Float_t kInnerPadLength = 0.75; + static const Float_t kInnerPadWidth = 0.40; + static const Float_t kOuter1PadPitchLength = 1.0; + static const Float_t kOuterPadPitchWidth = 0.6; + static const Float_t kOuter1PadLength = 1.0; + static const Float_t kOuterPadWidth = 0.6; + static const Float_t kOuter2PadPitchLength = 1.5; + static const Float_t kOuter2PadLength = 1.5; + + static const Bool_t kBMWPCReadout = kTRUE; //MWPC readout - another possibility GEM + static const Int_t kNCrossRows = 1; //number of rows to cross-talk // //gas default parameters // - const static Float_t kDiffT = 2.2e-2; - const static Float_t kDiffL = 2.2e-2; - const static Float_t kGasGain = 2.e4; - const static Float_t kDriftV =2.83e6; - const static Float_t kOmegaTau = 0.145; - const static Float_t kAttCoef = 250.; - const static Float_t kOxyCont = 5.e-6; + static const Float_t kDiffT = 2.2e-2; + static const Float_t kDiffL = 2.2e-2; + static const Float_t kGasGain = 2.e4; + static const Float_t kDriftV =2.83e6; + static const Float_t kOmegaTau = 0.145; + static const Float_t kAttCoef = 250.; + static const Float_t kOxyCont = 5.e-6; // //electronic default parameters // - const static Float_t kPadCoupling=0.5; - const static Int_t kZeroSup=2; - const static Float_t kNoise = 1000; - const static Float_t kChipGain = 12; - const static Float_t kChipNorm = 0.4; - const static Float_t kTSample = 2.e-7; - const static Float_t kTFWHM = 1.9e-7; //fwhm of charge distribution - const static Int_t kMaxTBin =445; - const static Int_t kADCSat =1024; - const static Float_t kADCDynRange =2000.; - // - // - // - const static Float_t kBField =0.2; - const static Float_t kNPrimLoss =10.9; - const static Float_t kNTotalLoss =39.9; + static const Float_t kPadCoupling=0.5; + static const Int_t kZeroSup=2; + static const Float_t kNoise = 1000; + static const Float_t kChipGain = 12; + static const Float_t kChipNorm = 0.4; + static const Float_t kTSample = 2.e-7; + static const Float_t kTFWHM = 1.9e-7; //fwhm of charge distribution + static const Int_t kMaxTBin =445; + static const Int_t kADCSat =1024; + static const Float_t kADCDynRange =2000.; // //response constants // - const static Int_t kNResponseMax=100; - const static Float_t kResponseThreshold=0.01; + static const Int_t kNResponseMax=100; + static const Float_t kResponseThreshold=0.01; + //L1 constants + // static const Float_t kGateDelay=6.1e-6; //In s + static const Float_t kGateDelay=0.; //For the moment no gating + // static const Float_t kL1Delay=6.5e-6; //In s + static const Float_t kL1Delay=0.; //For the moment no delay + // static const UShort_t kNTBinsBeforeL1=14; + static const UShort_t kNTBinsBeforeL1=0; //For the moment no shift fbStatus = kFALSE; // //set sector parameters @@ -383,15 +372,26 @@ void AliTPCParam::SetDefault() SetSectorAngles(kInnerAngle,kInnerAngleShift,kOuterAngle,kOuterAngleShift); SetZLength(kZLength); SetGeometryType(kGeometryType); + SetRowNLow(kNRowLow); + SetRowNUp1 (kNRowUp1); + SetRowNUp2(kNRowUp2); + SetRowNUp(kNRowUp); // //set wire parameters // SetInnerNWires(kNInnerWiresPerPad); SetInnerDummyWire(kInnerDummyWire); SetInnerOffWire(kInnerOffWire); - SetOuterNWires(kNOuterWiresPerPad); + SetOuter1NWires(kNOuter1WiresPerPad); + SetOuter2NWire(kNOuter2WiresPerPad); SetOuterDummyWire(kOuterDummyWire); SetOuterOffWire(kOuterOffWire); + SetInnerWWPitch(kInnerWWPitch); + SetRInnerFirstWire(kRInnerFirstWire); + SetRInnerLastWire(kRInnerLastWire); + SetOuterWWPitch(kOuterWWPitch); + SetROuterFirstWire(kROuterFirstWire); + SetROuterLastWire(kROuterLastWire); // //set pad parameter // @@ -399,9 +399,11 @@ void AliTPCParam::SetDefault() SetInnerPadPitchWidth(kInnerPadPitchWidth); SetInnerPadLength(kInnerPadLength); SetInnerPadWidth(kInnerPadWidth); - SetOuterPadPitchLength(kOuterPadPitchLength); + SetOuter1PadPitchLength(kOuter1PadPitchLength); + SetOuter2PadPitchLength(kOuter2PadPitchLength); SetOuterPadPitchWidth(kOuterPadPitchWidth); - SetOuterPadLength(kOuterPadLength); + SetOuter1PadLength(kOuter1PadLength); + SetOuter2PadLength(kOuter2PadLength); SetOuterPadWidth(kOuterPadWidth); SetMWPCReadout(kBMWPCReadout); SetNCrossRows(kNCrossRows); @@ -428,15 +430,19 @@ void AliTPCParam::SetDefault() SetMaxTBin(kMaxTBin); SetADCSat(kADCSat); SetADCDynRange(kADCDynRange); - //set magnetic field - SetBField(kBField); - SetNPrimLoss(kNPrimLoss); - SetNTotalLoss(kNTotalLoss); +// //set magnetic field +// SetBField(kBField); +// SetNPrimLoss(kNPrimLoss); +// SetNTotalLoss(kNTotalLoss); // //set response parameters // SetNResponseMax(kNResponseMax); - SetResponseThreshold(kResponseThreshold); + SetResponseThreshold(static_cast(kResponseThreshold)); + //L1 data + SetGateDelay(kGateDelay); + SetL1Delay(kL1Delay); + SetNTBinsBeforeL1(kNTBinsBeforeL1); } @@ -486,30 +492,26 @@ Bool_t AliTPCParam::Update() fRotAngle[i+2] =angle; fRotAngle[j+2] =angle; } + fZWidth = fTSample*fDriftV; fTotalNormFac = fPadCoupling*fChipNorm*kQel*1.e15*fChipGain*fADCSat/fADCDynRange; fNoiseNormFac = kQel*1.e15*fChipGain*fADCSat/fADCDynRange; //wire section - Int_t nwire; + /* Int_t nwire; Float_t wspace; //available space for wire Float_t dummyspace; //dummyspace for wire - - fInnerWWPitch = Float_t((Double_t)fInnerPadPitchLength/(Double_t)fNInnerWiresPerPad); + wspace =fInnerRadiusUp-fInnerRadiusLow-2*fInnerOffWire; nwire = Int_t(wspace/fInnerWWPitch); wspace = Float_t(nwire)*fInnerWWPitch; - dummyspace =(fInnerRadiusUp-fInnerRadiusLow-wspace)/2.; - fRInnerFirstWire = fInnerRadiusLow+dummyspace; - fRInnerLastWire = fRInnerFirstWire+fInnerWWPitch*(Float_t)(nwire); - - fOuterWWPitch = Float_t((Double_t)fOuterPadPitchLength/(Double_t)fNOuterWiresPerPad); + dummyspace =(fInnerRadiusUp-fInnerRadiusLow-wspace)/2.; wspace =fOuterRadiusUp-fOuterRadiusLow-2*fOuterOffWire; nwire = Int_t(wspace/fOuterWWPitch); wspace = Float_t(nwire)*fOuterWWPitch; dummyspace =(fOuterRadiusUp-fOuterRadiusLow-wspace)/2.; fROuterFirstWire = fOuterRadiusLow+dummyspace; fROuterLastWire = fROuterFirstWire+fOuterWWPitch*(Float_t)(nwire); - + */ // //response data @@ -518,14 +520,88 @@ Bool_t AliTPCParam::Update() if (fResponseWeight==0) delete [] fResponseBin; fResponseBin = new Int_t[3*fNResponseMax]; fResponseWeight = new Float_t[fNResponseMax]; - + + //L1 data + fNTBinsL1 = fL1Delay/fTSample - (Float_t)fNTBinsBeforeL1; fbStatus = kTRUE; return kTRUE; } -Bool_t AliTPCParam::GetStatus() +Bool_t AliTPCParam::ReadGeoMatrices(){ + // + //read geo matrixes + // + if (!gGeoManager){ + AliFatal("Geo manager not initialized\n"); + } + AliAlignObjAngles o; + // + if (fTrackingMatrix) delete [] fTrackingMatrix; + fTrackingMatrix = new TGeoHMatrix*[fNSector]; + if (fClusterMatrix) delete [] fClusterMatrix; + fClusterMatrix = new TGeoHMatrix*[fNSector]; + if (fGlobalMatrix) delete [] fGlobalMatrix; + fGlobalMatrix = new TGeoHMatrix*[fNSector]; + // + for (Int_t isec=0; iseccd(path); + TGeoHMatrix* m = gGeoManager->GetCurrentMatrix(); + // + TGeoRotation mchange; + mchange.RotateY(90); mchange.RotateX(90); + Float_t ROCcenter[3]; + GetChamberCenter(isec,ROCcenter); + // + // Convert to global coordinate system + // + fGlobalMatrix[isec] = new TGeoHMatrix(*m); + fGlobalMatrix[isec]->Multiply(&(mchange.Inverse())); + TGeoTranslation center("center",-ROCcenter[0],-ROCcenter[1],-ROCcenter[2]); + fGlobalMatrix[isec]->Multiply(¢er); + // + // cluster correction matrix + // + fClusterMatrix[isec] = new TGeoHMatrix; + Double_t sectorAngle = 20.*(isec%18)+10; + TGeoHMatrix rotMatrix; + rotMatrix.RotateZ(sectorAngle); + if (GetGlobalMatrix(isec)->GetTranslation()[2]>0){ + // + // mirrored system + // + TGeoRotation mirrorZ; + mirrorZ.SetAngles(90,0,90,90,180,0); + fClusterMatrix[isec]->Multiply(&mirrorZ); + } + TGeoTranslation trans(0,0,GetZLength()); + fClusterMatrix[isec]->MultiplyLeft(&trans); + fClusterMatrix[isec]->MultiplyLeft((GetGlobalMatrix(isec))); + fClusterMatrix[isec]->MultiplyLeft(&(rotMatrix.Inverse())); + } + return kTRUE; +} + + +Bool_t AliTPCParam::GetStatus() const { //get information about object consistency return fbStatus; @@ -541,6 +617,16 @@ Int_t AliTPCParam::GetNRowUp() const //get the number of pad rows in up sector return fNRowUp; } +Int_t AliTPCParam::GetNRowUp1() const +{ + //get the number of pad rows in up1 sector + return fNRowUp1; +} +Int_t AliTPCParam::GetNRowUp2() const +{ + //get the number of pad rows in up2 sector + return fNRowUp2; +} Float_t AliTPCParam::GetPadRowRadiiLow(Int_t irow) const { //get the pad row (irow) radii @@ -577,4 +663,64 @@ Int_t AliTPCParam::GetNPadsUp(Int_t irow) const else return 0; } +Float_t AliTPCParam::GetYInner(Int_t irow) const +{ + return fYInner[irow]; +} + + +Float_t AliTPCParam::GetYOuter(Int_t irow) const +{ + return fYOuter[irow]; +} + +Int_t AliTPCParam::GetSectorIndex(Float_t angle, Int_t row, Float_t z) const +{ + // returns the sector index + // takes as input the angle, index of the pad row and z position + if(row<0) return -1; + + if (angle > 2.*TMath::Pi()) angle -= 2.*TMath::Pi(); + if (angle < 0. ) angle += 2.*TMath::Pi(); + + Int_t sector; + if(row>1); + } + else { + sector=Int_t(TMath::Nint((angle-fOuterAngleShift)/fOuterAngle))+fNInnerSector; + if (z<0) sector += (fNOuterSector>>1); + } + + return sector; +} + +Float_t AliTPCParam::GetChamberCenter(Int_t isec, Float_t * center) const +{ + // returns the default radial position + // of the readout chambers + + const Float_t kROCcenterIn = 110.2; + const Float_t kROCcenterOut = 188.45; + + if (isec