#include <TClonesArray.h>
#include <TMath.h>
#include <TClass.h>
#include <TGeoManager.h>
#include "AliLog.h"
#include "AliAlignObjParams.h"
#include "AliITSMisAligner.h"
#include "AliITSSurveyToAlign.h"
#include "AliMathBase.h"
ClassImp(AliITSMisAligner)
const Int_t AliITSMisAligner::fgkNLadders[AliITSMisAligner::kNLayers] = {20,40,14,22,34,38};
const Int_t AliITSMisAligner::fgkNDetectors[AliITSMisAligner::kNLayers] = {4,4,6,8,22,25};
const Double_t kRadToDeg = 180./TMath::Pi();
AliITSMisAligner::AliITSMisAligner():
AliMisAligner(),
fRnd(),
fInd(0),
fAlignObjArray(NULL),
fStrSPD("ITS/SPD"),
fStrSDD("ITS/SDD"),
fStrSSD("ITS/SSD"),
fStrStave("/Stave"),
fStrHalfStave("/HalfStave"),
fStrLadder("/Ladder"),
fStrSector("/Sector"),
fStrSensor("/Sensor"),
fUnifSPDSector(kFALSE),
fUnifSPDHS(kFALSE),
fUnifSDDLadder(kFALSE),
fUnifSSDLadder(kFALSE),
fUnifSPDLadder(kFALSE),
fUnifSDDModule(kFALSE),
fUnifSSDModule(kFALSE)
{
fRnd.SetSeed(38217945);
fAlignObjArray = new TClonesArray("AliAlignObjParams",4000);
for(Int_t ii=0; ii<6; ii++)
{
fWholeITS[ii]=0.;
fSPDSector[ii]=0.;
fSPDHB[ii]=0.;
fSPDBarrel[ii]=0.;
fSPDHS[ii]=0.;
fSPDLadder[ii]=0.;
fSDDLayer[ii]=0.;
fSDDBarrel[ii]=0.;
fSDDLadder[ii]=0.;
fSDDModule[ii]=0.;
fSSDBarrel[ii]=0.;
fSSDLayer[ii]=0.;
fSSDLadder[ii]=0.;
fSSDModule[ii]=0.;
fSPDLadderShiftT[ii]=0.;
fSPDLadderShiftB[ii]=0.;
fSDDLadderShift1[ii]=0.;
fSDDLadderShift2[ii]=0.;
}
}
TClonesArray* AliITSMisAligner::MakeAlObjsArray() {
SetWholeITSMisAlignment();
SetSPDMisAlignment();
SetSDDMisAlignment();
SetSSDMisAlignment();
AliITSSurveyToAlign* s2a = new AliITSSurveyToAlign();
s2a->Run();
TClonesArray* surveyArray = dynamic_cast<TClonesArray*> (s2a->GetAlignObjsArray());
if(!surveyArray){
Printf("SSD survey array was not build! Probably you missed to connect to alien");
return 0;
}else{
Printf("survey array contains %d entries", surveyArray->GetEntriesFast());
}
char strtemp[5]="ITS";
AddAlignObj(strtemp,fWholeITS[0],fWholeITS[1],fWholeITS[2],fWholeITS[3],fWholeITS[4],fWholeITS[5],"fixed");
AddSectorAlignObj(1,5,fSPDSector[0],fSPDSector[1],fSPDSector[2],fSPDSector[3],fSPDSector[4],fSPDSector[5],
fSPDLadderShiftT[0],fSPDLadderShiftT[1],fSPDLadderShiftT[2],fSPDLadderShiftT[3],fSPDLadderShiftT[4],fSPDLadderShiftT[5],fUnifSPDSector);
AddSectorAlignObj(6,10,fSPDSector[0],fSPDSector[1],fSPDSector[2],fSPDSector[3],fSPDSector[4],fSPDSector[5],
fSPDLadderShiftB[0],fSPDLadderShiftB[1],fSPDLadderShiftB[2],fSPDLadderShiftB[3],fSPDLadderShiftB[4],fSPDLadderShiftB[5],fUnifSPDSector);
AddAlignObj(0,-1,fSPDHS[0],fSPDHS[1],fSPDHS[2],fSPDHS[3],fSPDHS[4],fSPDHS[5],
0,0,0,0,0,0,fUnifSPDHS);
AddAlignObj(1,-1,fSPDHS[0],fSPDHS[1],fSPDHS[2],fSPDHS[3],fSPDHS[4],fSPDHS[5],
0,0,0,0,0,0,fUnifSPDHS);
AddAlignObj(2,-1,fSDDLadder[0],fSDDLadder[1],fSDDLadder[2],fSDDLadder[3],
fSDDLadder[4],fSDDLadder[5],fSDDLadderShift1[0],fSDDLadderShift1[1],fSDDLadderShift1[2],fSDDLadderShift1[3],fSDDLadderShift1[4],fSDDLadderShift1[5],fUnifSDDLadder);
AddAlignObj(3,-1,fSDDLadder[0],fSDDLadder[1],fSDDLadder[2],fSDDLadder[3],
fSDDLadder[4],fSDDLadder[5],fSDDLadderShift2[0],fSDDLadderShift2[1],fSDDLadderShift2[2],fSDDLadderShift2[3],fSDDLadderShift2[4],fSDDLadderShift2[5],fUnifSDDLadder);
for(Int_t ii=0; ii<surveyArray->GetEntriesFast(); ii++)
{
AliAlignObjParams* aop = static_cast<AliAlignObjParams*> (surveyArray->UncheckedAt(ii));
TString sName(aop->GetSymName());
if(sName.Contains("SSD") && !sName.Contains("Sensor"))
{
if(!(TString(GetMisalType())=="ideal"))
{
ShiftAlignObj(*aop,fSSDBarrel[0],fSSDBarrel[1],fSSDBarrel[2],fSSDBarrel[3],fSSDBarrel[4],fSSDBarrel[5]);
if(sName.Contains("SSD4")){
SmearAlignObj(*aop,fSSDLadder[0],fSSDLadder[1],fSSDLadder[2],fSSDLadder[3]*1.13,fSSDLadder[4]*1.13,fSSDLadder[5]);
}else if(sName.Contains("SSD5")){
SmearAlignObj(*aop,fSSDLadder[0],fSSDLadder[1],fSSDLadder[2],fSSDLadder[3],fSSDLadder[4],fSSDLadder[5]);
}
}
new((*fAlignObjArray)[fInd++]) AliAlignObjParams(*aop);
aop->ApplyToGeometry();
}
}
AddAlignObj(0,fSPDLadder[0],fSPDLadder[1],fSPDLadder[2],fSPDLadder[3],fSPDLadder[4],fSPDLadder[5],fUnifSPDLadder);
AddAlignObj(1,fSPDLadder[0],fSPDLadder[1],fSPDLadder[2],fSPDLadder[3],fSPDLadder[4],fSPDLadder[5],fUnifSPDLadder);
AddAlignObj(2,fSDDModule[0],fSDDModule[1],fSDDModule[2],fSDDModule[3],fSDDModule[4],fSDDModule[5],fUnifSDDModule);
AddAlignObj(3,fSDDModule[0],fSDDModule[1],fSDDModule[2],fSDDModule[3],fSDDModule[4],fSDDModule[5],fUnifSDDModule);
for(Int_t ii=0; ii<surveyArray->GetEntriesFast(); ii++)
{
AliAlignObjParams* aop = static_cast<AliAlignObjParams*> (surveyArray->UncheckedAt(ii));
TString sName(aop->GetSymName());
if(sName.Contains("SSD") && sName.Contains("Sensor"))
{
if(!(TString(GetMisalType())=="ideal"))
SmearAlignObj(*aop,fSSDModule[0],fSSDModule[1],fSSDModule[2],fSSDModule[3],fSSDModule[4],fSSDModule[5]);
new((*fAlignObjArray)[fInd++]) AliAlignObjParams(*aop);
}
}
return fAlignObjArray;
}
void AliITSMisAligner::ShiftAlignObj(AliAlignObjParams &alObj, Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
{
Double_t shifts[3]; Double_t angles[3];
alObj.GetPars(shifts, angles);
alObj.SetPars(shifts[0]+dx, shifts[1]+dy, shifts[2]+dz, angles[0]+dpsi, angles[1]+dtheta, angles[2]+dphi);
}
void AliITSMisAligner::SmearAlignObj(AliAlignObjParams &alObj, Double_t sx, Double_t sy, Double_t sz, Double_t spsi, Double_t stheta, Double_t sphi)
{
Double_t shifts[3]; Double_t angles[3];
alObj.GetLocalPars(shifts, angles);
Double_t x = AliMathBase::TruncatedGaus(shifts[0], sx, 3.*sx);
Double_t y = AliMathBase::TruncatedGaus(shifts[1], sy, 3.*sy);
Double_t z = AliMathBase::TruncatedGaus(shifts[2], sz, 3.*sz);
Double_t psi = AliMathBase::TruncatedGaus(angles[0], spsi, 3.*spsi);
Double_t theta = AliMathBase::TruncatedGaus(angles[1], stheta, 3.*stheta);
Double_t phi = AliMathBase::TruncatedGaus(angles[2], sphi, 3.*sphi);
alObj.SetLocalPars(x, y, z, psi, theta, phi);
}
void AliITSMisAligner::SetWholeITSMisAlignment()
{
if(TString(GetMisalType())=="ideal")
{
SetWholeITSPars(-0.12, -0.07, 0.29, 0., 0.03, 0.04);
}else if(TString(GetMisalType())=="residual"){
SetWholeITSPars(-0.12, -0.07, 0.29, 0., 0.03, 0.04);
}else if(TString(GetMisalType())=="full"){
Double_t sigmatrW = 0.01;
Double_t sigmarotW = 0.006;
SetWholeITSPars(AliMathBase::TruncatedGaus(-0.12,sigmatrW,3.*sigmatrW),
AliMathBase::TruncatedGaus(-0.07,sigmatrW,3.*sigmatrW),
AliMathBase::TruncatedGaus(0.29,sigmatrW,3.*sigmatrW),
AliMathBase::TruncatedGaus(0.,sigmarotW,3.*sigmarotW),
AliMathBase::TruncatedGaus(0.03,sigmarotW,3.*sigmarotW),
AliMathBase::TruncatedGaus(0.04,sigmarotW,3.*sigmarotW));
}
}
void AliITSMisAligner::SetSPDMisAlignment()
{
if(TString(GetMisalType())=="ideal")
{
SetSPDBarrelSigmas(0., 0., 0., 0., 0., 0.);
SetSPDHBSigmas(0., 0., 0., 0., 0., 0.);
SetSPDSectorSigmas(0., 0., 0., 0., 0., 0.);
SetSPDHSSigmas(0., 0., 0., 0., 0., 0.);
SetSPDLadderSigmas(0., 0., 0., 0., 0., 0.);
}else if(TString(GetMisalType())=="residual"){
SetSPDBarrelSigmas(0., 0., 0., 0., 0., 0.);
SetSPDHBSigmas(0., 0., 0., 0., 0., 0.);
SetSPDSectorSigmas( 0.0050/5.,
0.0100/5.,
0.0100/5.,
0.0100/30.*kRadToDeg/5.,
0.0100/30.*kRadToDeg/5.,
0.0050/1.5*kRadToDeg/5.);
fUnifSPDSector=kFALSE;
SetSPDHSSigmas( 0.0100/4.,
0.0020/4.,
0.0020/4.,
0.0020/7.*kRadToDeg/4.,
0.0050/7.*kRadToDeg/4.,
0.0050/0.7*kRadToDeg/4.);
fUnifSPDHS=kFALSE;
SetSPDLadderSigmas( 0.0010/5.,
0.0050/5.,
0.0010/5.,
0.0001*kRadToDeg/5.,
0.0001*kRadToDeg/5.,
0.0001*kRadToDeg/5.);
fUnifSPDLadder=kFALSE;
}else if(TString(GetMisalType())=="full"){
SetSPDBarrelSigmas( 0.1000,
0.1000,
0.1000,
0.0500/30.*kRadToDeg,
0.0500/30.*kRadToDeg,
0.0500/7.*kRadToDeg);
SetSPDHBSigmas( 0.0200,
0.0200,
0.0200,
0.0100/30.*kRadToDeg,
0.0100/30.*kRadToDeg,
0.0100/7.*kRadToDeg);
SetSPDSectorSigmas( 0.0050,
0.0100,
0.0100,
0.0100/30.*kRadToDeg,
0.0100/30.*kRadToDeg,
0.0050/1.5*kRadToDeg);
fUnifSPDSector=kTRUE;
SetSPDHSSigmas( 0.0100,
0.0020,
0.0020,
0.0020/7.*kRadToDeg,
0.0050/7.*kRadToDeg,
0.0050/0.7*kRadToDeg);
fUnifSPDHS=kTRUE;
SetSPDLadderSigmas( 0.0010,
0.0030,
0.0010,
0.0001*kRadToDeg,
0.0001*kRadToDeg,
0.0001*kRadToDeg);
fUnifSPDLadder=kTRUE;
Double_t shBtop[6], shBbot[6];
for(Int_t ii=0; ii<6; ii++){
shBtop[ii] = AliMathBase::TruncatedGaus(0.,fSPDBarrel[ii]/3,fSPDBarrel[ii]);
shBbot[ii] = shBtop[ii];
}
for(Int_t ii=0; ii<6; ii++){
shBtop[ii] += AliMathBase::TruncatedGaus(0.,fSPDHB[ii]/3,fSPDHB[ii]);
shBbot[ii] += AliMathBase::TruncatedGaus(0.,fSPDHB[ii]/3,fSPDHB[ii]);
}
SetSPDLadderShiftT(shBtop);
SetSPDLadderShiftB(shBbot);
}
}
void AliITSMisAligner::SetSDDMisAlignment()
{
if(TString(GetMisalType())=="ideal")
{
SetSDDLayerSigmas(0., 0., 0., 0., 0., 0.);
SetSDDBarrelSigmas(0., 0., 0., 0., 0., 0.);
SetSDDLadderSigmas(0., 0., 0., 0., 0., 0.);
SetSDDModuleSigmas(0., 0., 0., 0., 0., 0.);
}else if(TString(GetMisalType())=="residual"){
SetSDDLayerSigmas(0., 0., 0., 0., 0., 0.);
SetSDDBarrelSigmas(0., 0., 0., 0., 0., 0.);
SetSDDLadderSigmas( 0.0005,
0.0005,
0.0005,
0.00,
0.00,
0.00);
fUnifSDDLadder=kFALSE;
SetSDDModuleSigmas( 0.0045/5.,
0.0045/5.,
0.0105/5.,
0.00,
0.00,
0.00);
fUnifSDDModule=kFALSE;
}else if(TString(GetMisalType())=="full"){
SetSDDBarrelSigmas( 0.0020,
0.0020,
0.0020,
0.0020/52.*kRadToDeg,
0.0020/52.*kRadToDeg,
0.0020/20.*kRadToDeg);
SetSDDLayerSigmas( 0.0010,
0.0010,
0.0010,
0.0010/52.*kRadToDeg,
0.0010/52.*kRadToDeg,
0.0010/20.*kRadToDeg);
SetSDDLadderSigmas( 0.0005,
0.0005,
0.0005,
0.00,
0.00,
0.00);
fUnifSDDLadder=kTRUE;
SetSDDModuleSigmas( 0.0045,
0.0045,
0.0105,
0.00,
0.00,
0.00);
fUnifSDDModule=kTRUE;
}
fSDDLadderShift1[0] = GetUnif(-fSDDBarrel[0],fSDDBarrel[0]);
fSDDLadderShift1[1] = GetUnif(-fSDDBarrel[1],fSDDBarrel[1]);
fSDDLadderShift1[2] = GetUnif(-fSDDBarrel[2],fSDDBarrel[2]);
fSDDLadderShift1[3] = GetUnif(-fSDDBarrel[3],fSDDBarrel[3]);
fSDDLadderShift1[4] = GetUnif(-fSDDBarrel[4],fSDDBarrel[4]);
fSDDLadderShift1[5] = GetUnif(-fSDDBarrel[5],fSDDBarrel[5]);
for(Int_t ii=0; ii<6; ii++)
fSDDLadderShift2[ii] = fSDDLadderShift1[ii];
fSDDLadderShift1[0] += GetUnif(-fSDDLayer[0],fSDDLayer[0]);
fSDDLadderShift1[1] += GetUnif(-fSDDLayer[1],fSDDLayer[1]);
fSDDLadderShift1[2] += GetUnif(-fSDDLayer[2],fSDDLayer[2]);
fSDDLadderShift1[3] += GetUnif(-fSDDLayer[3],fSDDLayer[3]);
fSDDLadderShift1[4] += GetUnif(-fSDDLayer[4],fSDDLayer[4]);
fSDDLadderShift1[5] += GetUnif(-fSDDLayer[5],fSDDLayer[5]);
fSDDLadderShift2[0] += GetUnif(-fSDDLayer[0],fSDDLayer[0]);
fSDDLadderShift2[1] += GetUnif(-fSDDLayer[1],fSDDLayer[1]);
fSDDLadderShift2[2] += GetUnif(-fSDDLayer[2],fSDDLayer[2]);
fSDDLadderShift2[3] += GetUnif(-fSDDLayer[3],fSDDLayer[3]);
fSDDLadderShift2[4] += GetUnif(-fSDDLayer[4],fSDDLayer[4]);
fSDDLadderShift2[5] += GetUnif(-fSDDLayer[5],fSDDLayer[5]);
}
void AliITSMisAligner::SetSSDMisAlignment()
{
if(TString(GetMisalType())=="ideal"){
SetSSDBarrelPars(0.,0.,0.,0.,0.,0.);
SetSSDLadderSigmas(0.,0.,0.,0.,0.,0.);
SetSSDModuleSigmas(0.,0.,0.,0.,0.,0.);
}else if(TString(GetMisalType())=="residual"){
SetSSDBarrelPars(0.,0.,0.,0.,0.,0.);
SetSSDLadderSigmas( 0.0005,
0.0033,
0.0050,
0.000067*kRadToDeg,
0.00001*kRadToDeg,
0.001*kRadToDeg);
fUnifSSDLadder=kTRUE;
SetSSDModuleSigmas( 0.00025,
0.00034,
0.0005,
0.00017*kRadToDeg,
0.000125*kRadToDeg,
0.0001*kRadToDeg);
fUnifSSDModule=kTRUE;
}else if(TString(GetMisalType())=="full"){
SetSSDBarrelPars( GetUnif(-0.0020,0.0020),
GetUnif(-0.0020,0.0020),
GetUnif(-0.0020,0.0020),
GetUnif(-0.0020/90.*kRadToDeg,0.0020),
GetUnif(-0.0020/90.*kRadToDeg,0.0020),
GetUnif(-0.0020/40.*kRadToDeg,0.0020));
SetSSDLadderSigmas( 0.0010,
0.0033,
0.0050,
0.000067*kRadToDeg,
0.00002*kRadToDeg,
0.001*kRadToDeg);
fUnifSSDLadder=kTRUE;
SetSSDModuleSigmas( 0.00025,
0.00034,
0.0005,
0.00017*kRadToDeg,
0.000125*kRadToDeg,
0.0001*kRadToDeg);
fUnifSSDModule=kTRUE;
}
}
AliCDBMetaData* AliITSMisAligner::GetCDBMetaData() const {
AliCDBMetaData* md = new AliCDBMetaData();
md->SetResponsible("A. Dainese, M. Van Leeuwen, R. Grosso");
if(TString(GetMisalType())=="ideal")
md->SetComment(
Form("Alignment objects for ITS ideal misalignment. It includes:"
"\n survey of whole ITS;"
"\n survey of SSD ladders and modules"));
if(TString(GetMisalType())=="residual")
md->SetComment(
Form("Alignment objects for ITS residual misalignment. It includes:"
"\n survey of whole ITS;"
"\n survey of SSD ladders and modules"));
if(TString(GetMisalType())=="full")
md->SetComment(
Form("Alignment objects for ITS full misalignment. It includes:"
"\n survey of whole ITS;"
"\n survey of SSD ladders and modules"));
return md;
}
Bool_t AliITSMisAligner::AddAlignObj(char* name,Double_t dx,Double_t dy,Double_t dz,
Double_t dpsi,Double_t dtheta,Double_t dphi,const char* distrib) {
Double_t vx=0.,vy=0.,vz=0.,vpsi=0.,vtheta=0.,vphi=0.;
TString sdistrib(distrib);
if(sdistrib==TString("gaussian")) {
vx = AliMathBase::TruncatedGaus(0.,dx/3.,dx);
vy = AliMathBase::TruncatedGaus(0.,dy/3.,dy);
vz = AliMathBase::TruncatedGaus(0.,dz/3.,dz);
vpsi = AliMathBase::TruncatedGaus(0.,dpsi/3., dpsi );
vtheta = AliMathBase::TruncatedGaus(0.,dtheta/3.,dtheta);
vphi = AliMathBase::TruncatedGaus(0.,dphi/3., dphi);
}else if(sdistrib==TString("uniform")){
vx = fRnd.Uniform(-dx,dx);
vy = fRnd.Uniform(-dy,dy);
vz = fRnd.Uniform(-dz,dz);
vpsi = fRnd.Uniform(-dpsi,dpsi);
vtheta = fRnd.Uniform(-dtheta,dtheta);
vphi = fRnd.Uniform(-dphi,dphi);
}else if(sdistrib==TString("fixed")){
vx=dx;
vy=dy;
vz=dz;
vpsi=dpsi;
vtheta=dtheta;
vphi=dphi;
}else{
AliFatal(Form("Invalid string \"%s\" specifying the misalignment type for the volume \"%s\"",sdistrib.Data(),name));
}
new((*fAlignObjArray)[fInd]) AliAlignObjParams(name,0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
AliAlignObjParams* itsalobj = (AliAlignObjParams*) fAlignObjArray->UncheckedAt(fInd);
itsalobj->ApplyToGeometry();
fInd++;
return kTRUE;
}
Bool_t AliITSMisAligner::AddAlignObj(Int_t lay,Double_t dx,Double_t dy,Double_t dz,
Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
lay+=1;
printf("LAYER %d MODULES %d\n",lay,AliGeomManager::LayerSize(lay));
for (Int_t iModule = 0; iModule < AliGeomManager::LayerSize(lay); iModule++) {
Double_t vx,vy,vz,vpsi,vtheta,vphi;
if(!unif) {
vx = AliMathBase::TruncatedGaus(0.,dx/3.,dx);
vy = AliMathBase::TruncatedGaus(0.,dy/3.,dy);
vz = AliMathBase::TruncatedGaus(0.,dz/3.,dz);
vpsi = AliMathBase::TruncatedGaus(0.,dpsi/3.,dpsi);
vtheta = AliMathBase::TruncatedGaus(0.,dtheta/3.,dtheta);
vphi = AliMathBase::TruncatedGaus(0.,dphi/3.,dphi);
} else {
vx = fRnd.Uniform(-dx,dx);
vy = fRnd.Uniform(-dy,dy);
vz = fRnd.Uniform(-dz,dz);
vpsi = fRnd.Uniform(-dpsi,dpsi);
vtheta = fRnd.Uniform(-dtheta,dtheta);
vphi = fRnd.Uniform(-dphi,dphi);
}
UShort_t volid = AliGeomManager::LayerToVolUID(lay,iModule);
const char *symname = AliGeomManager::SymName(volid);
new((*fAlignObjArray)[fInd]) AliAlignObjParams(symname,volid,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
fInd++;
}
return kTRUE;
}
Bool_t AliITSMisAligner::AddAlignObj(Int_t lay,Int_t ladd,Double_t dx,Double_t dy,Double_t dz,
Double_t dpsi,Double_t dtheta,Double_t dphi,
Double_t xShift,Double_t yShift,Double_t zShift,
Double_t psiShift,Double_t thetaShift,Double_t phiShift,
Bool_t unif) {
Double_t vx,vy,vz,vpsi,vtheta,vphi;
Double_t tr[3],rot[3];
Int_t laddMin = ladd;
Int_t laddMax = laddMin+1;
if (ladd<0) {
laddMin = 0;
laddMax = fgkNLadders[lay];
}
for (Int_t iLadd=laddMin; iLadd<laddMax; iLadd++) {
Int_t nHS = 1;
if (lay<2) nHS = 2;
for (Int_t iHalfStave=0; iHalfStave<nHS; iHalfStave++) {
if(!unif) {
vx = AliMathBase::TruncatedGaus(0.,dx/3.,dx);
vy = AliMathBase::TruncatedGaus(0.,dy/3.,dy);
vz = AliMathBase::TruncatedGaus(0.,dz/3.,dz);
vpsi = AliMathBase::TruncatedGaus(0.,dpsi/3.,dpsi);
vtheta = AliMathBase::TruncatedGaus(0.,dtheta/3.,dtheta);
vphi = AliMathBase::TruncatedGaus(0.,dphi/3.,dphi);
} else {
vx = fRnd.Uniform(-dx,dx);
vy = fRnd.Uniform(-dy,dy);
vz = fRnd.Uniform(-dz,dz);
vpsi = fRnd.Uniform(-dpsi,dpsi);
vtheta = fRnd.Uniform(-dtheta,dtheta);
vphi = fRnd.Uniform(-dphi,dphi);
}
TString name(GetHalfStaveLadderSymbName(lay,iLadd,iHalfStave));
AliAlignObjParams aaop(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
aaop.GetPars(tr,rot);
if(lay>1) {
tr[0] += xShift;
tr[1] += yShift;
tr[2] += zShift;
rot[0] += psiShift;
rot[1] += thetaShift;
rot[2] += phiShift;
}
new((*fAlignObjArray)[fInd]) AliAlignObjParams(name.Data(),0,tr[0],tr[1],tr[2],rot[0],rot[1],rot[2],kTRUE);
AliAlignObjParams* itsalobj = (AliAlignObjParams*) fAlignObjArray->UncheckedAt(fInd);
itsalobj->ApplyToGeometry();
fInd++;
}
}
return kTRUE;
}
Bool_t AliITSMisAligner::AddSectorAlignObj(Int_t sectMin,Int_t sectMax,
Double_t dx,Double_t dy,Double_t dz,
Double_t dpsi,Double_t dtheta,Double_t dphi,
Double_t xShift,Double_t yShift,Double_t zShift,
Double_t psiShift,Double_t thetaShift,Double_t phiShift,Bool_t unif) {
if ((sectMin<1) || (sectMax>10)) return kFALSE;
Double_t vx,vy,vz,vpsi,vtheta,vphi;
Double_t tr[3],rot[3];
for (Int_t iSect = sectMin-1; iSect<sectMax; iSect++) {
if(!unif) {
vx = AliMathBase::TruncatedGaus(0.,dx/3.,dx);
vy = AliMathBase::TruncatedGaus(0.,dy/3.,dy);
vz = AliMathBase::TruncatedGaus(0.,dz/3.,dz);
vpsi = AliMathBase::TruncatedGaus(0.,dpsi/3.,dpsi);
vtheta = AliMathBase::TruncatedGaus(0.,dtheta/3.,dtheta);
vphi = AliMathBase::TruncatedGaus(0.,dphi/3.,dphi);
} else {
vx = fRnd.Uniform(-dx,dx);
vy = fRnd.Uniform(-dy,dy);
vz = fRnd.Uniform(-dz,dz);
vpsi = fRnd.Uniform(-dpsi,dpsi);
vtheta = fRnd.Uniform(-dtheta,dtheta);
vphi = fRnd.Uniform(-dphi,dphi);
}
TString name(GetSymbName(0));
name += fStrSector;
name += iSect;
AliAlignObjParams aaop(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
aaop.GetPars(tr,rot);
tr[0] += xShift;
tr[1] += yShift;
tr[2] += zShift;
rot[0] += psiShift;
rot[1] += thetaShift;
rot[2] += phiShift;
new((*fAlignObjArray)[fInd]) AliAlignObjParams(name.Data(),0,tr[0],tr[1],tr[2],rot[0],rot[1],rot[2],kTRUE);
AliAlignObjParams* itsalobj = (AliAlignObjParams*) fAlignObjArray->UncheckedAt(fInd);
itsalobj->ApplyToGeometry();
fInd++;
}
return kTRUE;
}
const char* AliITSMisAligner::GetSymbName(Int_t layer) const {
TString name;
switch (layer) {
case 0:
case 1: name = fStrSPD; name += layer; break;
case 2:
case 3: name = fStrSDD; name += layer; break;
case 4:
case 5: name = fStrSSD; name += layer; break;
default: AliFatal("Wrong layer index");
}
return name.Data();
}
const char* AliITSMisAligner::GetSymbName(Int_t layer, Int_t ladder, Int_t det) const {
TString symname(GetHalfStaveLadderSymbName(layer,ladder,det));
if(layer<=2){
symname+="Ladder";
}else if(layer<=6){
symname+="Sensor";
}else{
AliError("Invalid layer!");
return 0;
}
symname+=det;
return symname.Data();
}
const char* AliITSMisAligner::GetSymbName(Int_t layer,Int_t ladd) const {
TString name(GetSymbName(layer));
if (layer==0) {
int sector = ladd/2;
name += fStrSector;
name += sector;
int stave = ladd-sector*2;
name += fStrStave;
name += stave;
}
else if (layer==1) {
int sector = ladd/4;
name += fStrSector;
name += sector;
int stave = ladd-sector*4;
name += fStrStave;
name += stave;
}
else if (layer>=2 && layer<=5) {
name += fStrLadder;
name += ladd;
}
else {
AliFatal("Wrong layer index");
}
return name.Data();
}
const char* AliITSMisAligner::GetHalfStaveLadderSymbName(Int_t layer,Int_t ladd,Int_t halfStave) const {
TString name(GetSymbName(layer));
if (layer==0) {
int sector = ladd/2;
name += fStrSector;
name += sector;
int stave = ladd-sector*2;
name += fStrStave;
name += stave;
name += fStrHalfStave;
name += halfStave;
}
else if (layer==1) {
int sector = ladd/4;
name += fStrSector;
name += sector;
int stave = ladd-sector*4;
name += fStrStave;
name += stave;
name += fStrHalfStave;
name += halfStave;
}
else if (layer>=2 && layer<=5) {
name += fStrLadder;
name += ladd;
}
else {
AliFatal("Wrong layer index");
}
return name.Data();
}
const char* AliITSMisAligner::GetParentSymName(const char* symname) {
TString parent(symname);
if(parent.BeginsWith('/')) parent.Remove(TString::kLeading,'/');
if(parent.EndsWith("/")) parent.Remove(TString::kTrailing,'/');
if(!parent.CountChar('/')) AliErrorClass("Not a valid symbolic name");
Int_t layer,level;
GetLayerAndLevel(symname,layer,level);
if(level==1) return "ITS";
parent.Remove(parent.Last('/'));
if((layer==0 || layer==1) && level==2){
parent.Remove(parent.Last('/'));
parent[7]='0';
}
return parent.Data();
}
Bool_t AliITSMisAligner::GetLayerAndLevel(const char* symname, Int_t &layer, Int_t &level) {
const char* basename[6] = {"ITS/SPD0/Sector","ITS/SPD1/Sector","ITS/SDD2/Ladder","ITS/SDD3/Ladder","ITS/SSD4/Ladder","ITS/SSD5/Ladder"};
TString strSym(symname);
if(strSym=="ITS"){
level=0;
layer=-1;
return kTRUE;
}
Int_t i;
for(i=0; i<6; i++){
if(strSym.BeginsWith(basename[i])) break;
}
if(i>=6){
AliErrorClass(Form("%s is not a valid symbolic name for an ITS alignable volume",strSym.Data()));
return kFALSE;
}
layer=i;
level=1;
switch(layer){
case 0:
case 1:
if(strSym.Contains("Stave")) level=2;
if(strSym.Contains("Ladder")) level=3;
break;
case 2:
case 3:
case 4:
case 5:
if(strSym.Contains("Sensor")) level=2;
}
return kTRUE;
}
Int_t AliITSMisAligner::GetNSisters(const char* symname) {
Int_t layer,level;
if(!GetLayerAndLevel(symname,layer,level)) return -1;
if(level==0) return -1;
if(level==1) return GetNLadders(layer);
if(level==2) return GetNDetectors(layer);
AliErrorClass(Form("Invalid layer and level"));
return -1;
}
Int_t AliITSMisAligner::GetNDaughters(const char* symname) {
Int_t layer,level;
if(!GetLayerAndLevel(symname,layer,level)) return -1;
if(level==0) {
Int_t nLadders = 0;
for(Int_t lay=0; lay<6; lay++) nLadders += GetNLadders(lay);
return nLadders;
}
if(level==1) return GetNDetectors(layer);
if(level==2){
AliWarningClass(Form("Volume %s is a sensitive volume and has no alignable dauthers",symname));
return -1;
}
AliErrorClass(Form("Invalid layer and level"));
return -1;
}
AliITSMisAligner.cxx:1000 AliITSMisAligner.cxx:1001 AliITSMisAligner.cxx:1002 AliITSMisAligner.cxx:1003 AliITSMisAligner.cxx:1004 AliITSMisAligner.cxx:1005