* provided "as is" without express or implied warranty. *
**************************************************************************/
-/*
-$Log$
-Revision 1.17 2002/10/23 07:17:33 alibrary
-Introducing Riostream.h
-
-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 //
//
-#include <Riostream.h>
-#include <TMath.h>
-#include <TObject.h>
-#include <TRandom.h>
#include <AliTPCParam.h>
-
-
+#include <TGeoManager.h>
+#include <TGeoPhysicalNode.h>
+#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();
}
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;
+ }
+
}
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]){
{
//
// 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
}
-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
//
//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
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<int>(kResponseThreshold));
+ //L1 data
+ SetGateDelay(kGateDelay);
+ SetL1Delay(kL1Delay);
+ SetNTBinsBeforeL1(kNTBinsBeforeL1);
}
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;
//
//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::GetStatus()
+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; isec<fNSector; isec++) {
+ fGlobalMatrix[isec] = 0;
+ fClusterMatrix[isec]= 0;
+ fTrackingMatrix[isec]=0;
+ }
+ //
+ for (Int_t isec=0; isec<fNSector; isec++) {
+ fGlobalMatrix[isec] = 0;
+ fClusterMatrix[isec]= 0;
+ fTrackingMatrix[isec]=0;
+ AliGeomManager::ELayerID iLayer;
+ Int_t iModule;
+
+ if(isec<fNInnerSector) {
+ iLayer = AliGeomManager::kTPC1;
+ iModule = isec;
+ }
+ else {
+ iLayer = AliGeomManager::kTPC2;
+ iModule = isec - fNInnerSector;
+ }
+
+ UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iModule);
+ TGeoPNEntry* pne = gGeoManager->GetAlignableEntryByUID(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();
+
+ //
+ 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
return fbStatus;
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<fNRowLow) {
+ sector=Int_t(TMath::Nint((angle-fInnerAngleShift)/fInnerAngle));
+ if (z<0) sector += (fNInnerSector>>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<fNInnerSector){
+ if (center){
+ center[0] = kROCcenterIn;
+ center[1] = 0;
+ center[2] = -5.51-0.08;
+ }
+ return kROCcenterIn;
+ }
+ else{
+ if (center){
+ center[0] = kROCcenterOut;
+ center[1] = 0;
+ center[2] = -5.61-0.08;
+ }
+ return kROCcenterOut;
+ }
+}