X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCParam.cxx;h=0a3c340f1c7e64c456a93ca0a6864a0c6984b886;hb=1e4ec417458b79766a8e47989ae9e9e7e45cd642;hp=e577c749a2afc40cf14f2c450c914a5da2e522e5;hpb=1936493934365ed89c915ea283ff553376bffc14;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCParam.cxx b/TPC/AliTPCParam.cxx index e577c749a2a..0a3c340f1c7 100644 --- a/TPC/AliTPCParam.cxx +++ b/TPC/AliTPCParam.cxx @@ -13,72 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.16 2002/10/14 14:57:42 hristov -Merging the VirtualMC branch to the main development branch (HEAD) - -Revision 1.13.4.1 2002/06/10 15:26:11 hristov -Merged with v3-08-02 - -Revision 1.15 2002/05/07 17:24:02 kowal2 -Updated wires positions - -Revision 1.14 2002/03/29 06:57:45 kowal2 -Restored backward compatibility to use the hits from Dec. 2000 production. - -Revision 1.13 2002/03/18 17:59:13 kowal2 -Chnges in the pad geometry - 3 pad lengths introduced. - -Revision 1.12 2002/02/05 09:12:26 hristov -Small mods for gcc 3.02 - -Revision 1.11 2000/11/02 07:33:48 kowal2 -Automatic streamer generation. - -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 // @@ -93,28 +28,107 @@ Introduction of the Copyright and cvs Log // -#include -#include -#include -#include #include - - +#include +#include +#include "AliAlignObj.h" +#include "AliAlignObjParams.h" +#include "AliLog.h" ClassImp(AliTPCParam) //___________________________________________ AliTPCParam::AliTPCParam() + :AliDetectorParam(), + fbStatus(kFALSE), + fInnerRadiusLow(0.), + fInnerRadiusUp(0.), + fOuterRadiusUp(0.), + fOuterRadiusLow(0.), + fInnerAngle(0.), + fInnerAngleShift(0.), + fOuterAngle(0.), + fOuterAngleShift(0.), + fInnerFrameSpace(0.), + fOuterFrameSpace(0.), + fInnerWireMount(0.), + fOuterWireMount(0.), + fNInnerSector(0), + fNOuterSector(0), + fNSector(0), + fZLength(0), + fRotAngle(), + fGeometryType(0), + fTrackingMatrix(0), + fClusterMatrix(0), + fGlobalMatrix(0), + fNInnerWiresPerPad(0), + fInnerWWPitch(0), + fInnerDummyWire(0), + fInnerOffWire(0.), + fRInnerFirstWire(0.), + fRInnerLastWire(0.), + fLastWireUp1(0.), + fNOuter1WiresPerPad(0), + fNOuter2WiresPerPad(0), + fOuterWWPitch(0.), + fOuterDummyWire(0), + fOuterOffWire(0.), + fROuterFirstWire(0.), + fROuterLastWire(0.), + fInnerPadPitchLength(0.), + fInnerPadPitchWidth(0.), + fInnerPadLength(0.), + fInnerPadWidth(0.), + fOuter1PadPitchLength(0.), + fOuter2PadPitchLength(0.), + fOuterPadPitchWidth(0.), + fOuter1PadLength(0.), + fOuter2PadLength(0.), + fOuterPadWidth(0.), + fBMWPCReadout(kFALSE), + fNCrossRows(0), + fNRowLow(0), + fNRowUp1(0), + fNRowUp2(0), + fNRowUp(0), + fNtRows(0), + fDiffT(0.), + fDiffL(0.), + fGasGain(0.), + fDriftV(0.), + fOmegaTau(0.), + fAttCoef(0.), + fOxyCont(0.), + fPadCoupling(0.), + fZeroSup(0), + fNoise(0.), + fChipGain(0.), + fChipNorm(0.), + fTSample(0.), + fZWidth(0.), + fTSigma(0.), + fMaxTBin(0), + fADCSat(0), + fADCDynRange(0.), + fTotalNormFac(0.), + fNoiseNormFac(0.), + fNResponseMax(0), + fResponseThreshold(0.), + fCurrentMax(0), + fResponseBin(0), + fResponseWeight(0), + fGateDelay(0.), + fL1Delay(0.), + fNTBinsBeforeL1(0), + fNTBinsL1(0.) { // //constructor sets the default parameters // - fResponseBin = 0; - fResponseWeight = 0; - fRotAngle = 0; SetTitle("75x40_100x60_150x60"); SetDefault(); } @@ -129,10 +143,9 @@ AliTPCParam::~AliTPCParam() if (fResponseWeight!=0) delete [] fResponseWeight; if (fRotAngle !=0) delete [] fRotAngle; -} - - + CleanGeoMatrices(); +} Int_t AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index) const { @@ -152,7 +165,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); @@ -160,17 +173,18 @@ 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 - if (xyz[2]<0) sector+=(fNInnerSector>>1); + if (xyz[2]<0) sector+=(fNInnerSector>>1); + if (sector<0 || sector>=fNSector) AliError(Form("Wrong sector %d",sector)); index[1]=sector; // calculated sector number index[0]=1; // indicates system after transformation 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]){ @@ -243,7 +257,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 @@ -279,7 +293,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 @@ -318,91 +332,92 @@ void AliTPCParam::SetDefault() // //sector default parameters // - const static Float_t kInnerRadiusLow = 82.97; - const static Float_t kInnerRadiusUp = 133.17; - const static Float_t kOuterRadiusLow = 133.58; - 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 - const static Int_t kNRowLow = 63; - const static Int_t kNRowUp1 = 64; - const static Int_t kNRowUp2 = 32; - const static Int_t kNRowUp = 96; + 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 kInnerWWPitch = 0.25; - const static Float_t kRInnerFirstWire = 84.445; - const static Float_t kRInnerLastWire = 132.445; - const static Float_t kInnerOffWire = 0.5; - const static Int_t kNOuter1WiresPerPad = 4; - const static Int_t kNOuter2WiresPerPad = 6; - const static Float_t kOuterWWPitch = 0.25; - const static Float_t kROuterFirstWire = 134.305; - const static Float_t kROuterLastWire = 247.055; - 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 kOuter1PadPitchLength = 1.0; - const static Float_t kOuterPadPitchWidth = 0.6; - const static Float_t kOuter1PadLength = 1.0; - const static Float_t kOuterPadWidth = 0.6; - const static Float_t kOuter2PadPitchLength = 1.5; - const static Float_t kOuter2PadLength = 1.5; - - 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 @@ -476,15 +491,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(static_cast(kResponseThreshold)); + //L1 data + SetGateDelay(kGateDelay); + SetL1Delay(kL1Delay); + SetNTBinsBeforeL1(kNTBinsBeforeL1); } @@ -534,6 +553,7 @@ 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; @@ -557,18 +577,146 @@ Bool_t AliTPCParam::Update() // //response data // - if (fResponseBin==0) delete [] fResponseBin; - if (fResponseWeight==0) delete [] fResponseBin; + if (fResponseBin) delete [] fResponseBin; + if (fResponseWeight) delete [] fResponseWeight; fResponseBin = new Int_t[3*fNResponseMax]; fResponseWeight = new Float_t[fNResponseMax]; - + + //L1 data + fNTBinsL1 = fL1Delay/fTSample - (Float_t)fNTBinsBeforeL1; fbStatus = kTRUE; return kTRUE; } +void AliTPCParam::CleanGeoMatrices(){ + // + // clean geo matrices + // + + 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; + } + + return; +} + +Bool_t AliTPCParam::ReadGeoMatrices(){ + // + // read geo matrixes + // + if (!gGeoManager){ + AliFatal("Geo manager not initialized\n"); + } + AliAlignObjParams o; + // + + // clean geo matrices + CleanGeoMatrices(); + + // create new geo matrices + fTrackingMatrix = new TGeoHMatrix*[fNSector]; + fClusterMatrix = new TGeoHMatrix*[fNSector]; + fGlobalMatrix = new TGeoHMatrix*[fNSector]; + for (Int_t isec=0; isecGetAlignableEntryByUID(volid); + if(!pne) + { + AliError(Form("Alignable entry for volume ID %d not in geometry. Exiting!",volid)); + return kFALSE; + } + const char *path = pne->GetTitle(); + if (!gGeoManager->cd(path)) return kFALSE; + TGeoHMatrix *m = gGeoManager->GetCurrentMatrix(); + // Since GEANT4 does not allow reflections, in this case the reflection + // component if the matrix is embedded by TGeo inside TGeoScaledShape + if (gGeoManager->GetCurrentVolume()->GetShape()->IsReflected()) + m->ReflectZ(kFALSE, kTRUE); + // + 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(isec)); + fClusterMatrix[isec]->MultiplyLeft(&trans); + fClusterMatrix[isec]->MultiplyLeft((GetGlobalMatrix(isec))); + fClusterMatrix[isec]->MultiplyLeft(&(rotMatrix.Inverse())); + } + return kTRUE; +} + +TGeoHMatrix * AliTPCParam::Tracking2LocalMatrix(const TGeoHMatrix * geoMatrix, Int_t sector) const{ + // + // make local to tracking matrix + // + Double_t sectorAngle = 20.*(sector%18)+10; + TGeoHMatrix *newMatrix = new TGeoHMatrix(); + newMatrix->RotateZ(sectorAngle); + newMatrix->MultiplyLeft(&(geoMatrix->Inverse())); + return newMatrix; +} + -Bool_t AliTPCParam::GetStatus() + +Bool_t AliTPCParam::GetStatus() const { //get information about object consistency return fbStatus; @@ -641,10 +789,53 @@ 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