X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCParam.cxx;h=7835205c877c843f864c6761051c8806845b5248;hb=2073b7a5dc578bd2b808fee97ece7fb949d2ab20;hp=5646360646e1cec293dda6ff0014f1f35dead4ec;hpb=bf6adc126caa67f54b786d1339f33f44712e4e7c;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCParam.cxx b/TPC/AliTPCParam.cxx index 5646360646e..7835205c877 100644 --- a/TPC/AliTPCParam.cxx +++ b/TPC/AliTPCParam.cxx @@ -30,19 +30,105 @@ #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(); } @@ -57,6 +143,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; + } + } @@ -92,7 +196,8 @@ Int_t AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index) const 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; @@ -246,18 +351,18 @@ void AliTPCParam::SetDefault() // //sector default parameters // - static const Float_t kInnerRadiusLow = 82.97; - static const Float_t kInnerRadiusUp = 133.17; - static const Float_t kOuterRadiusLow = 133.58; - static const Float_t kOuterRadiusUp = 247.78; + 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.370825926; - static const Float_t kOuterWireMount = 1.370825926; + 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; @@ -270,14 +375,14 @@ void AliTPCParam::SetDefault() 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.445; - static const Float_t kRInnerLastWire = 132.445; + 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.305; - static const Float_t kROuterLastWire = 247.055; + 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; // @@ -320,17 +425,18 @@ void AliTPCParam::SetDefault() static const Int_t kMaxTBin =445; static const Int_t kADCSat =1024; static const Float_t kADCDynRange =2000.; - // - // - // - static const Float_t kBField =0.2; - static const Float_t kNPrimLoss =10.9; - static const Float_t kNTotalLoss =39.9; // //response constants // 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 @@ -404,15 +510,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); } @@ -462,6 +572,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; @@ -485,17 +596,119 @@ 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; } +Bool_t AliTPCParam::ReadGeoMatrices(){ + // + // read geo matrixes + // + if (!gGeoManager){ + AliFatal("Geo manager not initialized\n"); + } + AliAlignObjParams 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; 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() const { //get information about object consistency @@ -569,10 +782,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