X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCParam.cxx;h=0a3c340f1c7e64c456a93ca0a6864a0c6984b886;hb=1dd7bcfefe8f6188b0328cb63467e45dad144b33;hp=5b66a57d39d827fd2e2a0c0476253e812db75098;hpb=88cb7938ca21d4a80991d4e7aa564008c29340f7;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCParam.cxx b/TPC/AliTPCParam.cxx index 5b66a57d39d..0a3c340f1c7 100644 --- a/TPC/AliTPCParam.cxx +++ b/TPC/AliTPCParam.cxx @@ -28,28 +28,107 @@ // -#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(); } @@ -64,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 { @@ -99,13 +177,14 @@ 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; } -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]){ @@ -178,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 @@ -253,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 @@ -411,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); } @@ -469,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; @@ -492,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; @@ -576,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