#include <TGeoManager.h>
#include <TGeoPhysicalNode.h>
+#include <TString.h>
#include "AliAlignObj.h"
-#include "AliAlignObjAngles.h"
+#include "AliAlignObjParams.h"
#include "AliLog.h"
ClassImp(AliTPCParam)
fADCDynRange(0.),
fTotalNormFac(0.),
fNoiseNormFac(0.),
+ fNominalVoltage(),
fNResponseMax(0),
fResponseThreshold(0.),
fCurrentMax(0),
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;
- }
+ CleanGeoMatrices();
}
-
-
-
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;
SetMaxTBin(kMaxTBin);
SetADCSat(kADCSat);
SetADCDynRange(kADCDynRange);
+ for (UInt_t i=0; i<36; i++)
+ {
+ SetNominalVoltage(1196.0, i);
+ }
+ for (UInt_t i=36; i<72; i++)
+ {
+ SetNominalVoltage(1417.0, i);
+ }
// //set magnetic field
// SetBField(kBField);
// SetNPrimLoss(kNPrimLoss);
//
//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];
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(){
//
if (!gGeoManager){
AliFatal("Geo manager not initialized\n");
}
- AliAlignObjAngles o;
+ AliAlignObjParams o;
//
- if (fTrackingMatrix) delete [] fTrackingMatrix;
+
+ // clean geo matrices
+ CleanGeoMatrices();
+
+ // create new geo matrices
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;
- AliAlignObj::ELayerID iLayer;
+ AliGeomManager::ELayerID iLayer;
Int_t iModule;
if(isec<fNInnerSector) {
- iLayer = AliAlignObj::kTPC1;
+ iLayer = AliGeomManager::kTPC1;
iModule = isec;
}
else {
- iLayer = AliAlignObj::kTPC2;
+ iLayer = AliGeomManager::kTPC2;
iModule = isec - fNInnerSector;
}
- UShort_t volid = AliAlignObj::LayerToVolUID(iLayer,iModule);
- const char *symname = AliAlignObj::SymName(volid);
- TGeoPNEntry* pne = gGeoManager->GetAlignableEntry(symname);
- const char *path = symname;
- if(pne) path=pne->GetTitle();
- if (!gGeoManager->cd(path)) return kFALSE;
+ 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();
-
+ // 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);
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
{
if (center){
center[0] = kROCcenterIn;
center[1] = 0;
- center[2] = -5.51;
+ center[2] = -5.51-0.08;
}
return kROCcenterIn;
}
if (center){
center[0] = kROCcenterOut;
center[1] = 0;
- center[2] = -5.61;
+ center[2] = -5.61-0.08;
}
return kROCcenterOut;
}
}
-
-