#include <TF1.h>
#include <TFile.h>
#include <TClonesArray.h>
#include <TGraph.h>
#include <TMath.h>
#include <TGraphErrors.h>
#include "AliITSAlignMilleModule.h"
#include "AliITSAlignMille.h"
#include "AliITSAlignMilleData.h"
#include "AliITSgeomTGeo.h"
#include "AliGeomManager.h"
#include "AliMillepede.h"
#include "AliTrackPointArray.h"
#include "AliAlignObjParams.h"
#include "AliLog.h"
#include <TSystem.h>
#include "AliTrackFitterRieman.h"
ClassImp(AliITSAlignMille)
Int_t AliITSAlignMille::fgNDetElem = ITSMILLENDETELEM;
Int_t AliITSAlignMille::fgNParCh = ITSMILLENPARCH;
AliITSAlignMille::AliITSAlignMille(const Char_t *configFilename, Bool_t initmille)
: TObject(),
fMillepede(0),
fStartFac(16.),
fResCutInitial(100.),
fResCut(100.),
fNGlobal(ITSMILLENDETELEM*ITSMILLENPARCH),
fNLocal(4),
fNStdDev(ITSMILLENSTDEV),
fIsMilleInit(kFALSE),
fParSigTranslations(0.0100),
fParSigRotations(0.1),
fTrack(NULL),
fCluster(),
fGlobalDerivatives(NULL),
fSigmaXfactor(1.0),
fSigmaZfactor(1.0),
fTempAlignObj(NULL),
fDerivativeXLoc(0),
fDerivativeZLoc(0),
fMinNPtsPerTrack(3),
fInitTrackParamsMeth(1),
fProcessedPoints(NULL),
fTotBadLocEqPoints(0),
fRieman(NULL),
fRequirePoints(kFALSE),
fTempExcludedModule(-1),
fGeometryFileName("geometry.root"),
fPreAlignmentFileName(""),
fGeoManager(0),
fCurrentModuleIndex(0),
fCurrentModuleInternalIndex(0),
fCurrentSensVolIndex(0),
fNModules(0),
fUseLocalShifts(kTRUE),
fUseSuperModules(kFALSE),
fUsePreAlignment(kFALSE),
fUseSortedTracks(kTRUE),
fBOn(kFALSE),
fBField(0.0),
fNSuperModules(0),
fCurrentModuleHMatrix(NULL),
fIsConfigured(kFALSE),
fBug(0)
{
fMillepede = new AliMillepede();
fGlobalDerivatives = new Double_t[fNGlobal];
for (Int_t i=0; i<ITSMILLENDETELEM*2; i++) {
fPreAlignQF[i]=-1;
fSensVolSigmaXfactor[i]=1.0;
fSensVolSigmaZfactor[i]=1.0;
}
for (Int_t i=0; i<6; i++) {
fNReqLayUp[i]=0;
fNReqLayDown[i]=0;
fNReqLay[i]=0;
}
for (Int_t i=0; i<3; i++) {
fNReqDetUp[i]=0;
fNReqDetDown[i]=0;
fNReqDet[i]=0;
}
Int_t lc=LoadConfig(configFilename);
if (lc) {
AliInfo(Form("Error %d loading configuration from %s",lc,configFilename));
}
else {
fIsConfigured=kTRUE;
if (initmille && fNGlobal<20000) {
AliInfo(Form("Initializing Millepede with %d gpar, %d lpar and %d stddev ...",fNGlobal, fNLocal, fNStdDev));
Init(fNGlobal, fNLocal, fNStdDev);
ResetLocalEquation();
AliInfo("Parameters initialized to zero");
}
else {
AliInfo("Millepede has not been initialized ... ");
}
}
if (fNModules) {
fProcessedPoints=new Int_t[fNModules];
for (Int_t ipp=0; ipp<fNModules; ipp++) fProcessedPoints[ipp]=0;
}
}
AliITSAlignMille::~AliITSAlignMille() {
if (fMillepede) delete fMillepede;
delete [] fGlobalDerivatives;
for (int i=0; i<fNModules; i++) delete fMilleModule[i];
for (int i=0; i<fNSuperModules; i++) delete fSuperModule[i];
if (fNModules) delete [] fProcessedPoints;
if (fRieman) delete fRieman;
}
Int_t AliITSAlignMille::LoadConfig(const Char_t *cfile) {
FILE *pfc=fopen(cfile,"r");
if (!pfc) return -1;
Char_t st[200],st2[200];
Char_t tmp[100];
Int_t idx,itx,ity,itz,ith,ips,iph;
Float_t f1,f2;
UShort_t voluid;
Int_t nmod=0;
while (fgets(st,200,pfc)) {
for (int i=0; i<int(strlen(st)); i++) {
if (st[i]=='#') st[i]=0;
}
if (strstr(st,"GEOMETRY_FILE")) {
memset(tmp,0,100*sizeof(char));
memset(st2,0,200*sizeof(char));
sscanf(st,"%99s %199s",tmp,st2);
if (gSystem->AccessPathName(st2)) {
AliInfo("*** WARNING! *** geometry file not found! ");
fclose(pfc);
return -1;
}
fGeometryFileName=st2;
InitGeometry();
}
if (strstr(st,"PREALIGNMENT_FILE")) {
memset(tmp,0,100*sizeof(char));
memset(st2,0,200*sizeof(char));
sscanf(st,"%99s %199s",tmp,st2);
if (gSystem->AccessPathName(st2)) {
AliInfo("*** WARNING! *** prealignment file not found! ");
fclose(pfc);
return -1;
}
fPreAlignmentFileName=st2;
itx=ApplyToGeometry();
if (itx) {
AliInfo(Form("*** WARNING! *** error %d reading prealignment file! ",itx));
fclose(pfc);
return -6;
}
}
if (strstr(st,"SUPERMODULE_FILE")) {
memset(tmp,0,100*sizeof(char));
memset(st2,0,200*sizeof(char));
sscanf(st,"%99s %199s",tmp,st2);
if (gSystem->AccessPathName(st2)) {
AliInfo("*** WARNING! *** supermodule file not found! ");
fclose(pfc);
return -1;
}
if (LoadSuperModuleFile(st2)) {fclose(pfc); return -1;}
}
if (strstr(st,"SET_B_FIELD")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f",tmp,&f1);
if (f1>0) {
fBField = f1;
fBOn = kTRUE;
fNLocal = 5;
fRieman = new AliTrackFitterRieman();
}
else {
fBField = 0.0;
fBOn = kFALSE;
fNLocal = 4;
}
}
if (strstr(st,"SET_PARSIG_TRA")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f",tmp,&f1);
fParSigTranslations=f1;
}
if (strstr(st,"SET_PARSIG_ROT")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f",tmp,&f1);
fParSigRotations=f1;
}
if (strstr(st,"SET_NSTDDEV")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %d",tmp,&idx);
fNStdDev=idx;
}
if (strstr(st,"SET_RESCUT_INIT")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f",tmp,&f1);
fResCutInitial=f1;
}
if (strstr(st,"SET_RESCUT_OTHER")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f",tmp,&f1);
fResCut=f1;
}
if (strstr(st,"SET_LOCALSIGMAFACTOR")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f %f",tmp,&f1,&f2);
if (f1>0 && f2>0) {
fSigmaXfactor=f1;
fSigmaZfactor=f2;
}
}
if (strstr(st,"SET_STARTFAC")) {
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %f",tmp,&f1);
fStartFac=f1;
}
if (strstr(st,"REQUIRE_POINT")) {
memset(tmp,0,100*sizeof(char));
memset(st2,0,200*sizeof(char));
sscanf(st,"%99s %199s %d %d %d",tmp,st2,&itx,&ity,&itz);
itx--;
if (strstr(st2,"LAYER")) {
if (itx<0 || itx>5) {fclose(pfc); return -7;}
if (ity>0) fNReqLayUp[itx]=itz;
else if (ity<0) fNReqLayDown[itx]=itz;
else fNReqLay[itx]=itz;
fRequirePoints=kTRUE;
}
else if (strstr(st2,"DETECTOR")) {
if (itx<0 || itx>2) {fclose(pfc); return -7;}
if (ity>0) fNReqDetUp[itx]=itz;
else if (ity<0) fNReqDetDown[itx]=itz;
else fNReqDet[itx]=itz;
fRequirePoints=kTRUE;
}
}
if (strstr(st,"SET_LOCAL_SHIFTS")) {
fUseLocalShifts = kTRUE;
}
if (strstr(st,"MODULE_INDEX")) {
f1=0; f2=0;
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %d %d %d %d %d %d %d %f %f",tmp,&idx,&itx,&ity,&itz,&iph,&ith,&ips,&f1,&f2);
if (idx<0 || idx>2197) {fclose(pfc); return 1;}
voluid=GetModuleVolumeID(idx);
if (!voluid || voluid>14300) {fclose(pfc); return 1;}
fModuleIndex[nmod]=idx;
fModuleVolumeID[nmod]=voluid;
fFreeParam[nmod][0]=itx;
fFreeParam[nmod][1]=ity;
fFreeParam[nmod][2]=itz;
fFreeParam[nmod][3]=iph;
fFreeParam[nmod][4]=ith;
fFreeParam[nmod][5]=ips;
fMilleModule[nmod] = new AliITSAlignMilleModule(voluid);
if (f1>0) fSensVolSigmaXfactor[idx]=f1;
if (f2>0) fSensVolSigmaZfactor[idx]=f2;
nmod++;
}
if (strstr(st,"MODULE_VOLUID")) {
f1=0; f2=0;
memset(tmp,0,100*sizeof(char));
sscanf(st,"%99s %d %d %d %d %d %d %d %f %f",tmp,&idx,&itx,&ity,&itz,&iph,&ith,&ips,&f1,&f2);
voluid=UShort_t(idx);
if (voluid>14335 && fUseSuperModules) {
int ism=-1;
for (int j=0; j<fNSuperModules; j++) {
if (voluid==fSuperModule[j]->GetVolumeID()) ism=j;
}
if (ism<0) {fclose(pfc); return -1;}
fModuleIndex[nmod]=fSuperModule[ism]->GetIndex();
fModuleVolumeID[nmod]=voluid;
fFreeParam[nmod][0]=itx;
fFreeParam[nmod][1]=ity;
fFreeParam[nmod][2]=itz;
fFreeParam[nmod][3]=iph;
fFreeParam[nmod][4]=ith;
fFreeParam[nmod][5]=ips;
fMilleModule[nmod] = new AliITSAlignMilleModule(*fSuperModule[ism]);
if (f1>0) {
for (int kk=0; kk<fMilleModule[nmod]->GetNSensitiveVolumes(); kk++) {
idx=AliITSAlignMilleModule::GetIndexFromVolumeID(fMilleModule[nmod]->GetSensitiveVolumeVolumeID()[kk]);
if (idx>=0) fSensVolSigmaXfactor[idx]=f1;
}
}
if (f2>0) {
for (int kk=0; kk<fMilleModule[nmod]->GetNSensitiveVolumes(); kk++) {
idx=AliITSAlignMilleModule::GetIndexFromVolumeID(fMilleModule[nmod]->GetSensitiveVolumeVolumeID()[kk]);
if (idx>=0) fSensVolSigmaZfactor[idx]=f2;
}
} nmod++;
}
else {
idx=GetModuleIndex(voluid);
if (idx<0 || idx>2197) {fclose(pfc); return 1;}
fModuleIndex[nmod]=idx;
fModuleVolumeID[nmod]=voluid;
fFreeParam[nmod][0]=itx;
fFreeParam[nmod][1]=ity;
fFreeParam[nmod][2]=itz;
fFreeParam[nmod][3]=iph;
fFreeParam[nmod][4]=ith;
fFreeParam[nmod][5]=ips;
fMilleModule[nmod] = new AliITSAlignMilleModule(voluid);
if (f1>0) fSensVolSigmaXfactor[idx]=f1;
if (f2>0) fSensVolSigmaZfactor[idx]=f2;
nmod++;
}
}
}
fNModules = nmod;
fNGlobal = fNModules*fgNParCh;
fclose(pfc);
return 0;
}
void AliITSAlignMille::SetRequiredPoint(Char_t* where, Int_t ndet, Int_t updw, Int_t nreqpts)
{
ndet--;
if (strstr(where,"LAYER")) {
if (ndet<0 || ndet>5) return;
if (updw>0) fNReqLayUp[ndet]=nreqpts;
else if (updw<0) fNReqLayDown[ndet]=nreqpts;
else fNReqLay[ndet]=nreqpts;
fRequirePoints=kTRUE;
}
else if (strstr(where,"DETECTOR")) {
if (ndet<0 || ndet>2) return;
if (updw>0) fNReqDetUp[ndet]=nreqpts;
else if (updw<0) fNReqDetDown[ndet]=nreqpts;
else fNReqDet[ndet]=nreqpts;
fRequirePoints=kTRUE;
}
}
Int_t AliITSAlignMille::GetModuleIndex(const Char_t *symname) {
if (!symname) return -1;
for (Int_t i=0; i<2198; i++) {
if (!strcmp(symname,AliITSgeomTGeo::GetSymName(i))) return i;
}
return -1;
}
Int_t AliITSAlignMille::GetModuleIndex(UShort_t voluid) {
AliGeomManager::ELayerID lay = AliGeomManager::VolUIDToLayer(voluid);
if (lay<1|| lay>6) return -1;
Int_t idx=Int_t(voluid)-2048*lay;
if (idx>=AliGeomManager::LayerSize(lay)) return -1;
for (Int_t ilay=1; ilay<lay; ilay++)
idx += AliGeomManager::LayerSize(ilay);
return idx;
}
UShort_t AliITSAlignMille::GetModuleVolumeID(const Char_t *symname) {
if (!symname) return 0;
for (UShort_t voluid=2000; voluid<13300; voluid++) {
Int_t modId;
AliGeomManager::ELayerID layerId = AliGeomManager::VolUIDToLayer(voluid,modId);
if (layerId>0 && layerId<7 && modId>=0 && modId<AliGeomManager::LayerSize(layerId)) {
if (!strcmp(symname,AliGeomManager::SymName(layerId,modId))) return voluid;
}
}
return 0;
}
UShort_t AliITSAlignMille::GetModuleVolumeID(Int_t index) {
if (index<0) return 0;
if (index<2198)
return GetModuleVolumeID(AliITSgeomTGeo::GetSymName(index));
else {
for (int i=0; i<fNSuperModules; i++) {
if (fSuperModule[i]->GetIndex()==index) return fSuperModule[i]->GetVolumeID();
}
}
return 0;
}
void AliITSAlignMille::InitGeometry() {
AliGeomManager::LoadGeometry(fGeometryFileName.Data());
fGeoManager = AliGeomManager::GetGeometry();
if (!fGeoManager) {
AliInfo("Couldn't initialize geometry");
return;
}
fTempAlignObj=new AliAlignObjParams;
}
void AliITSAlignMille::Init(Int_t nGlobal,
Int_t nLocal,
Int_t nStdDev )
{
fMillepede->InitMille(nGlobal,nLocal,nStdDev,fResCut,fResCutInitial);
fIsMilleInit = kTRUE;
for (Int_t i=0; i<fNModules; i++) {
for (Int_t j=0; j<ITSMILLENPARCH; j++) {
if (!fFreeParam[i][j]) FixParameter(i*ITSMILLENPARCH+j,0.0);
else {
Double_t parsig=0;
if (j<3) parsig=fParSigTranslations;
else parsig=fParSigRotations;
FixParameter(i*ITSMILLENPARCH+j,parsig);
}
}
}
if (fStartFac>1) fMillepede->SetIterations(fStartFac);
}
void AliITSAlignMille::AddConstraint(Double_t *par, Double_t value) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return;
}
fMillepede->SetGlobalConstraint(par, value);
AliInfo("Adding constraint");
}
void AliITSAlignMille::InitGlobalParameters(Double_t *par) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return;
}
fMillepede->SetGlobalParameters(par);
AliInfo("Init Global Parameters");
}
void AliITSAlignMille::FixParameter(Int_t iPar, Double_t value) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return;
}
fMillepede->SetParSigma(iPar, value);
if (value==0) AliInfo(Form("Parameter %i Fixed", iPar));
}
void AliITSAlignMille::ResetLocalEquation()
{
for(int i=0; i<fNLocal; i++) {
fLocalDerivatives[i] = 0.0;
}
for(int i=0; i<fNGlobal; i++) {
fGlobalDerivatives[i] = 0.0;
}
}
Int_t AliITSAlignMille::ApplyToGeometry() {
if(!AliGeomManager::GetGeometry()) return -1;
TFile *pref = new TFile(fPreAlignmentFileName.Data());
if (!pref->IsOpen()) return -2;
TClonesArray *prea=(TClonesArray*)pref->Get("ITSAlignObjs");
if (!prea) return -3;
Int_t nprea=prea->GetEntriesFast();
AliInfo(Form("Array of input misalignments with %d entries",nprea));
AliGeomManager::ApplyAlignObjsToGeom(*prea);
for (int ix=0; ix<nprea; ix++) {
AliAlignObjParams *preo=(AliAlignObjParams*) prea->UncheckedAt(ix);
Int_t index=AliITSAlignMilleModule::GetIndexFromVolumeID(preo->GetVolUID());
if (index>=0) {
fPreAlignQF[index] = (int) preo->GetUniqueID();
}
}
pref->Close();
delete pref;
fUsePreAlignment = kTRUE;
return 0;
}
Int_t AliITSAlignMille::GetPreAlignmentQualityFactor(Int_t index) const {
if (!fUsePreAlignment || index<0 || index>2197) return -1;
return fPreAlignQF[index];
}
AliTrackPointArray *AliITSAlignMille::PrepareTrack(const AliTrackPointArray *atp) {
AliTrackPointArray *atps=NULL;
Int_t idx[20];
Int_t npts=atp->GetNPoints();
Int_t ngoodpts=0;
Int_t intidx[20];
for (int j=0; j<npts; j++) {
intidx[j] = IsContained(atp->GetVolumeID()[j]);
if (intidx[j]>=0) ngoodpts++;
}
AliDebug(3,Form("Number of points in defined modules: %d",ngoodpts));
if (ngoodpts<fMinNPtsPerTrack) {
AliInfo("Track with not enough points!");
return NULL;
}
AliTrackPoint p;
if (fRequirePoints) {
Int_t nlayup[6],nlaydown[6],nlay[6];
Int_t ndetup[3],ndetdown[3],ndet[3];
for (Int_t j=0; j<6; j++) {nlayup[j]=0; nlaydown[j]=0; nlay[j]=0;}
for (Int_t j=0; j<3; j++) {ndetup[j]=0; ndetdown[j]=0; ndet[j]=0;}
for (int i=0; i<npts; i++) {
if (intidx[i]<0) continue;
Float_t xx=atp->GetX()[i];
Float_t yy=atp->GetY()[i];
Float_t r=TMath::Sqrt(xx*xx + yy*yy);
int lay=-1;
if (r<5) lay=0;
else if (r>5 && r<10) lay=1;
else if (r>10 && r<18) lay=2;
else if (r>18 && r<30) lay=3;
else if (r>30 && r<40) lay=4;
else if (r>40) lay=5;
if (lay<0) continue;
int det=lay/2;
if (yy>=0.0) {
nlayup[lay]++;
nlay[lay]++;
ndetup[det]++;
ndet[det]++;
}
else {
nlaydown[lay]++;
nlay[lay]++;
ndetdown[det]++;
ndet[det]++;
}
}
Bool_t isok=kTRUE;
for (Int_t j=0; j<6; j++) {
if (nlayup[j]<fNReqLayUp[j]) isok=kFALSE;
if (nlaydown[j]<fNReqLayDown[j]) isok=kFALSE;
if (nlay[j]<fNReqLay[j]) isok=kFALSE;
}
for (Int_t j=0; j<3; j++) {
if (ndetup[j]<fNReqDetUp[j]) isok=kFALSE;
if (ndetdown[j]<fNReqDetDown[j]) isok=kFALSE;
if (ndet[j]<fNReqDet[j]) isok=kFALSE;
}
if (!isok) {
AliDebug(2,Form("Track does not meet all location point requirements!"));
return NULL;
}
}
atps=new AliTrackPointArray(ngoodpts);
for (int i=0; i<npts; i++) idx[i]=i;
if (fUseSortedTracks) TMath::Sort(npts,atp->GetY(),idx);
Int_t npto=0;
for (int i=0; i<npts; i++) {
if (intidx[idx[i]]<0) continue;
atp->GetPoint(p,idx[i]);
TGeoHMatrix *svOrigMatrix = fMilleModule[intidx[idx[i]]]->GetSensitiveVolumeOrigGlobalMatrix(p.GetVolumeID());
Double_t pg[3],pl[3];
pg[0]=p.GetX();
pg[1]=p.GetY();
pg[2]=p.GetZ();
AliDebug(3,Form("Global coordinates of measured point : X=%f Y=%f Z=%f \n",pg[0],pg[1],pg[2]));
svOrigMatrix->MasterToLocal(pg,pl);
AliDebug(3,Form("Local coordinates of measured point : X=%f Y=%f Z=%f \n",pl[0],pl[1],pl[2]));
TGeoHMatrix hcov;
Double_t hcovel[9];
hcovel[0]=double(p.GetCov()[0]);
hcovel[1]=double(p.GetCov()[1]);
hcovel[2]=double(p.GetCov()[2]);
hcovel[3]=double(p.GetCov()[1]);
hcovel[4]=double(p.GetCov()[3]);
hcovel[5]=double(p.GetCov()[4]);
hcovel[6]=double(p.GetCov()[2]);
hcovel[7]=double(p.GetCov()[4]);
hcovel[8]=double(p.GetCov()[5]);
hcov.SetRotation(hcovel);
hcov.Multiply(svOrigMatrix);
hcov.MultiplyLeft(&svOrigMatrix->Inverse());
if (fBug==1) {
int ssdidx=AliITSAlignMilleModule::GetIndexFromVolumeID(p.GetVolumeID());
if (ssdidx>=500 && ssdidx<1248) {
int ladder=(ssdidx-500)%22;
if (ladder==18) p.SetVolumeID(AliITSAlignMilleModule::GetVolumeIDFromIndex(ssdidx+1));
if (ladder==19) p.SetVolumeID(AliITSAlignMilleModule::GetVolumeIDFromIndex(ssdidx-1));
}
}
TGeoHMatrix *svMatrix = fMilleModule[intidx[idx[i]]]->GetSensitiveVolumeMatrix(p.GetVolumeID());
svMatrix->LocalToMaster(pl,pg);
hcov.Multiply(&svMatrix->Inverse());
hcov.MultiplyLeft(svMatrix);
Float_t pcov[6];
pcov[0]=hcov.GetRotationMatrix()[0];
pcov[1]=hcov.GetRotationMatrix()[1];
pcov[2]=hcov.GetRotationMatrix()[2];
pcov[3]=hcov.GetRotationMatrix()[4];
pcov[4]=hcov.GetRotationMatrix()[5];
pcov[5]=hcov.GetRotationMatrix()[8];
p.SetXYZ(pg[0],pg[1],pg[2],pcov);
AliDebug(3,Form("New global coordinates of measured point : X=%f Y=%f Z=%f \n",pg[0],pg[1],pg[2]));
atps->AddPoint(npto,&p);
AliDebug(2,Form("Adding point[%d] = ( %f , %f , %f ) volid = %d",npto,atps->GetX()[npto],atps->GetY()[npto],atps->GetZ()[npto],atps->GetVolumeID()[npto] ));
npto++;
}
return atps;
}
AliTrackPointArray *AliITSAlignMille::SortTrack(const AliTrackPointArray *atp) {
AliTrackPointArray *atps=NULL;
Int_t idx[20];
Int_t npts=atp->GetNPoints();
AliTrackPoint p;
atps=new AliTrackPointArray(npts);
TMath::Sort(npts,atp->GetY(),idx);
for (int i=0; i<npts; i++) {
atp->GetPoint(p,idx[i]);
atps->AddPoint(i,&p);
AliDebug(2,Form("Point[%d] = ( %f , %f , %f ) volid = %d",i,atps->GetX()[i],atps->GetY()[i],atps->GetZ()[i],atps->GetVolumeID()[i] ));
}
return atps;
}
Int_t AliITSAlignMille::InitModuleParams() {
if (!fGeoManager) {
AliInfo("ITS geometry not initialized!");
return -1;
}
UShort_t voluid=fCluster.GetVolumeID();
Int_t k=fNModules-1;
while (k>=0 && !(fMilleModule[k]->IsIn(voluid)) ) k--;
if (k<0) return -3;
fCurrentModuleInternalIndex=k;
fCurrentModuleIndex=fMilleModule[k]->GetIndex();
Int_t index = GetModuleIndex(voluid);
if (index<0) return -2;
fCurrentSensVolIndex = index;
fModuleInitParam[0] = 0.0;
fModuleInitParam[1] = 0.0;
fModuleInitParam[2] = 0.0;
fModuleInitParam[3] = 0.0;
fModuleInitParam[4] = 0.0;
fModuleInitParam[5] = 0.0;
fCurrentModuleHMatrix = fMilleModule[fCurrentModuleInternalIndex]->GetMatrix();
for (int ii=0; ii<3; ii++)
fCurrentModuleTranslation[ii]=fCurrentModuleHMatrix->GetTranslation()[ii];
TGeoHMatrix *svMatrix = fMilleModule[fCurrentModuleInternalIndex]->GetSensitiveVolumeMatrix(voluid);
fMeasGlo[0] = fCluster.GetX();
fMeasGlo[1] = fCluster.GetY();
fMeasGlo[2] = fCluster.GetZ();
svMatrix->MasterToLocal(fMeasGlo,fMeasLoc);
AliDebug(2,Form("Local coordinates of measured point : X=%f Y=%f Z=%f \n",fMeasLoc[0] ,fMeasLoc[1] ,fMeasLoc[2] ));
TGeoHMatrix hcov;
Double_t hcovel[9];
hcovel[0]=double(fCluster.GetCov()[0]);
hcovel[1]=double(fCluster.GetCov()[1]);
hcovel[2]=double(fCluster.GetCov()[2]);
hcovel[3]=double(fCluster.GetCov()[1]);
hcovel[4]=double(fCluster.GetCov()[3]);
hcovel[5]=double(fCluster.GetCov()[4]);
hcovel[6]=double(fCluster.GetCov()[2]);
hcovel[7]=double(fCluster.GetCov()[4]);
hcovel[8]=double(fCluster.GetCov()[5]);
hcov.SetRotation(hcovel);
hcov.Multiply(svMatrix);
hcov.MultiplyLeft(&svMatrix->Inverse());
fSigmaLoc[0] = TMath::Sqrt(TMath::Abs(hcov.GetRotationMatrix()[0]));
fSigmaLoc[1] = TMath::Sqrt(TMath::Abs(hcov.GetRotationMatrix()[4]));
fSigmaLoc[2] = TMath::Sqrt(TMath::Abs(hcov.GetRotationMatrix()[8]));
if (fSigmaLoc[0]<0.0010) fSigmaLoc[0]=0.0010;
if (fSigmaLoc[2]<0.0010) fSigmaLoc[2]=0.0010;
fSigmaLoc[0] *= fSigmaXfactor;
fSigmaLoc[2] *= fSigmaZfactor;
fSigmaLoc[0] *= fSensVolSigmaXfactor[index];
fSigmaLoc[2] *= fSensVolSigmaZfactor[index];
AliDebug(2,Form("Setting StDev from CovMat : fSigmaLocX=%g fSigmaLocY=%g fSigmaLocZ=%g \n",fSigmaLoc[0] ,fSigmaLoc[1] ,fSigmaLoc[2] ));
return 0;
}
void AliITSAlignMille::SetCurrentModule(Int_t index) {
if (index<0 || index>2197) {
AliInfo("index does not correspond to a sensitive volume!");
return;
}
UShort_t voluid=GetModuleVolumeID(index);
Int_t k=IsContained(voluid);
if (k>=0){
fCluster.SetVolumeID(voluid);
fCluster.SetXYZ(0,0,0);
InitModuleParams();
}
else
AliInfo(Form("module %d not defined\n",index));
}
void AliITSAlignMille::SetCurrentSensitiveModule(Int_t index) {
if (index<0 || index>2197) {
AliInfo("index does not correspond to a sensitive volume!");
return;
}
UShort_t voluid=AliITSAlignMilleModule::GetVolumeIDFromIndex(index);
Int_t k=IsDefined(voluid);
if (k>=0){
fCluster.SetVolumeID(voluid);
fCluster.SetXYZ(0,0,0);
InitModuleParams();
}
else
AliInfo(Form("module %d not defined\n",index));
}
void AliITSAlignMille::Print(Option_t*) const
{
printf("*** AliMillepede for ITS ***\n");
printf(" number of defined super modules: %d\n",fNModules);
if (fGeoManager)
printf(" geometry loaded from %s\n",fGeometryFileName.Data());
else
printf(" geometry not loaded\n");
if (fUseSuperModules)
printf(" using custom supermodules ( %d defined )\n",fNSuperModules);
else
printf(" custom supermodules not used\n");
if (fUsePreAlignment)
printf(" using prealignment from %s \n",fPreAlignmentFileName.Data());
else
printf(" prealignment not used\n");
if (fBOn)
printf(" B Field set to %f T - using Riemann's helices\n",fBField);
else
printf(" B Field OFF - using straight lines \n");
if (fUseLocalShifts)
printf(" Alignment shifts will be computed in LOCAL RS\n");
else
printf(" Alignment shifts will be computed in GLOBAL RS\n");
if (fRequirePoints) printf(" Required points in tracks:\n");
for (Int_t i=0; i<6; i++) {
if (fNReqLayUp[i]>0) printf(" Layer %d : %d points with Y>0\n",i+1,fNReqLayUp[i]);
if (fNReqLayDown[i]>0) printf(" Layer %d : %d points with Y<0\n",i+1,fNReqLayDown[i]);
if (fNReqLay[i]>0) printf(" Layer %d : %d points \n",i+1,fNReqLay[i]);
}
for (Int_t i=0; i<3; i++) {
if (fNReqDetUp[i]>0) printf(" Detector %d : %d points with Y>0\n",i+1,fNReqDetUp[i]);
if (fNReqDetDown[i]>0) printf(" Detector %d : %d points with Y<0\n",i+1,fNReqDetDown[i]);
if (fNReqDet[i]>0) printf(" Detector %d : %d points \n",i+1,fNReqDet[i]);
}
printf("\n Millepede configuration parameters:\n");
printf(" init parsig for translations : %.4f\n",fParSigTranslations);
printf(" init parsig for rotations : %.4f\n",fParSigRotations);
printf(" init value for chi2 cut : %.4f\n",fStartFac);
printf(" first iteration cut value : %.4f\n",fResCutInitial);
printf(" other iterations cut value : %.4f\n",fResCut);
printf(" number of stddev for chi2 cut : %d\n",fNStdDev);
printf(" mult. fact. for local sigmas : %.4f %.4f\n",fSigmaXfactor, fSigmaZfactor);
printf("List of defined modules:\n");
printf(" intidx\tindex\tvoluid\tname\n");
for (int i=0; i<fNModules; i++)
printf(" %d\t%d\t%d\t%s\n",i,fModuleIndex[i],fModuleVolumeID[i],fMilleModule[i]->GetName());
}
AliITSAlignMilleModule *AliITSAlignMille::GetMilleModule(UShort_t voluid) const
{
Int_t i=IsDefined(voluid);
if (i<0) return NULL;
return fMilleModule[i];
}
AliITSAlignMilleModule *AliITSAlignMille::GetCurrentModule() const
{
if (fNModules) return fMilleModule[fCurrentModuleInternalIndex];
return NULL;
}
void AliITSAlignMille::PrintCurrentModuleInfo()
{
Int_t k=fCurrentModuleInternalIndex;
if (k<0 || k>=fNModules) return;
fMilleModule[k]->Print("");
}
Bool_t AliITSAlignMille::InitRiemanFit() {
if (!fBOn) return kFALSE;
Int_t npts=0;
AliTrackPoint ap;
npts = fTrack->GetNPoints();
AliDebug(3,Form("Fitting track with %d points",npts));
fRieman->Reset();
fRieman->SetTrackPointArray(fTrack);
TArrayI ai(npts);
for (Int_t ipt=0; ipt<npts; ipt++) ai[ipt]=fTrack->GetVolumeID()[ipt];
if (!fRieman->Fit(&ai,NULL,(AliGeomManager::ELayerID)1,(AliGeomManager::ELayerID)6)) {
return kFALSE;
}
for (int i=0; i<5; i++)
fLocalInitParam[i] = fRieman->GetParam()[i];
return kTRUE;
}
void AliITSAlignMille::InitTrackParams(int meth) {
Int_t npts=0;
TF1 *f1=NULL;
TGraph *g=NULL;
Float_t sigmax[20],sigmay[20],sigmaz[20];
AliTrackPoint ap;
TGraphErrors *ge=NULL;
switch (meth) {
case 1:
npts = fTrack->GetNPoints();
AliDebug(3,Form("*** initializing track with %d points ***",npts));
f1=new TF1("f1","[0]+x*[1]",-50,50);
g=new TGraph(npts,fTrack->GetY(),fTrack->GetX());
g->Fit(f1,"RNQ");
fLocalInitParam[0] = f1->GetParameter(0);
fLocalInitParam[2] = f1->GetParameter(1);
AliDebug(2,Form("X = p0gx + ugx*Y : p0gx = %f +- %f ugx = %f +- %f\n",fLocalInitParam[0],f1->GetParError(0),fLocalInitParam[2],f1->GetParError(1)));
delete g; g=NULL;
g=new TGraph(npts,fTrack->GetY(),fTrack->GetZ());
g->Fit(f1,"RNQ");
fLocalInitParam[1] = f1->GetParameter(0);
fLocalInitParam[3] = f1->GetParameter(1);
AliDebug(2,Form("Z = p0gz + ugz*Y : p0gz=%f ugz=%f\n",fLocalInitParam[1],fLocalInitParam[3]));
delete g;
delete f1;
break;
case 2:
npts = fTrack->GetNPoints();
AliDebug(3,Form("*** initializing track with %d points ***",npts));
for (Int_t isig=0; isig<npts; isig++) {
fTrack->GetPoint(ap,isig);
sigmax[isig]=ap.GetCov()[0];
if (sigmax[isig]<1.0e-07) sigmax[isig]=1.0e-07;
sigmax[isig]=TMath::Sqrt(sigmax[isig]);
sigmay[isig]=ap.GetCov()[3];
if (sigmay[isig]<1.0e-07) sigmay[isig]=1.0e-07;
sigmay[isig]=TMath::Sqrt(sigmay[isig]);
sigmaz[isig]=ap.GetCov()[5];
if (sigmaz[isig]<1.0e-07) sigmaz[isig]=1.0e-07;
sigmaz[isig]=TMath::Sqrt(sigmaz[isig]);
if (fTempExcludedModule>=0 && fTempExcludedModule==AliITSAlignMilleModule::GetIndexFromVolumeID(ap.GetVolumeID())) {
sigmax[isig] *= 1000.;
sigmay[isig] *= 1000.;
sigmaz[isig] *= 1000.;
fTempExcludedModule=-1;
}
}
f1=new TF1("f1","[0]+x*[1]",-50,50);
ge=new TGraphErrors(npts,fTrack->GetY(),fTrack->GetX(),sigmay,sigmax);
ge->Fit(f1,"RNQ");
fLocalInitParam[0] = f1->GetParameter(0);
fLocalInitParam[2] = f1->GetParameter(1);
AliDebug(2,Form("X = p0gx + ugx*Y : p0gx = %f +- %f ugx = %f +- %f\n",fLocalInitParam[0],f1->GetParError(0),fLocalInitParam[2],f1->GetParError(1)));
delete ge; ge=NULL;
ge=new TGraphErrors(npts,fTrack->GetY(),fTrack->GetZ(),sigmay,sigmaz);
ge->Fit(f1,"RNQ");
fLocalInitParam[1] = f1->GetParameter(0);
fLocalInitParam[3] = f1->GetParameter(1);
AliDebug(2,Form("Z = p0gz + ugz*Y : p0gz=%f ugz=%f\n",fLocalInitParam[1],fLocalInitParam[3]));
delete ge;
delete f1;
break;
}
}
Int_t AliITSAlignMille::IsDefined(UShort_t voluid) const
{
Int_t k=fNModules-1;
while (k>=0 && !(voluid==fModuleVolumeID[k]) ) k--;
if (k<0) return -1;
return k;
}
Int_t AliITSAlignMille::IsContained(UShort_t voluid) const
{
if (AliITSAlignMilleModule::GetIndexFromVolumeID(voluid)<0) return -1;
Int_t k=fNModules-1;
while (k>=0 && !(fMilleModule[k]->IsIn(voluid)) ) k--;
if (k<0) return -1;
return k;
}
Bool_t AliITSAlignMille::CheckVolumeID(UShort_t voluid) const
{
Int_t k=fNModules-1;
while (k>=0 && !(fMilleModule[k]->IsIn(voluid)) ) k--;
if (k>=0) return kTRUE;
return kFALSE;
}
Int_t AliITSAlignMille::CheckCurrentTrack() {
Int_t npts = fTrack->GetNPoints();
Int_t ngoodpts=0;
for (int j=0; j<npts; j++) {
UShort_t voluid = fTrack->GetVolumeID()[j];
if (CheckVolumeID(voluid)) {
ngoodpts++;
}
}
if (ngoodpts<fMinNPtsPerTrack) return 0;
return ngoodpts;
}
Int_t AliITSAlignMille::ProcessTrack(AliTrackPointArray *track) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return -1;
}
Int_t npts = track->GetNPoints();
AliDebug(2,Form("*** Input track with %d points ***",npts));
fTrack=PrepareTrack(track);
if (!fTrack) return -1;
npts = fTrack->GetNPoints();
AliDebug(2,Form("*** Processing prepared track with %d points ***",npts));
if (!fBOn) {
InitTrackParams(fInitTrackParamsMeth);
}
else {
if (!InitRiemanFit()) {
AliInfo("Riemann fit failed! skipping this track...");
delete fTrack;
fTrack=NULL;
return -5;
}
}
Int_t nloceq=0;
AliITSAlignMilleData *md = new AliITSAlignMilleData[npts];
for (Int_t ipt=0; ipt<npts; ipt++) {
fTrack->GetPoint(fCluster,ipt);
AliDebug(2,Form("\n--- processing point %d --- \n",ipt));
if (InitModuleParams()) continue;
AliDebug(2,Form(" VolID=%d Index=%d InternalIdx=%d symname=%s\n", track->GetVolumeID()[ipt], fCurrentModuleIndex ,fCurrentModuleInternalIndex, AliGeomManager::SymName(track->GetVolumeID()[ipt]) ));
AliDebug(2,Form(" Preprocessed Point = ( %f , %f , %f ) \n",fCluster.GetX(),fCluster.GetY(),fCluster.GetZ()));
if (!AddLocalEquation(md[nloceq])) {
nloceq++;
fProcessedPoints[fCurrentModuleInternalIndex]++;
}
else {
fTotBadLocEqPoints++;
}
}
delete fTrack;
fTrack=NULL;
if (nloceq<fMinNPtsPerTrack) {
delete [] md;
return -1;
}
SetLocalEquations(md,nloceq);
delete [] md;
return 0;
}
Int_t AliITSAlignMille::CalcIntersectionPoint(const Double_t *lpar, const Double_t *gpar) {
AliDebug(3,Form("lpar = %g %g %g %g %g\ngpar= %g %g %g %g %g %g\n",lpar[0],lpar[1],lpar[2],lpar[3],lpar[4],gpar[0],gpar[1],gpar[2],gpar[3],gpar[4],gpar[5]));
AliDebug(3,Form("deltalpar = %g %g %g %g %g\n",lpar[0]-fLocalInitParam[0],lpar[1]-fLocalInitParam[1],lpar[2]-fLocalInitParam[2],lpar[3]-fLocalInitParam[3],lpar[4]-fLocalInitParam[4]));
TGeoHMatrix *fTempHMat = fMilleModule[fCurrentModuleInternalIndex]->GetSensitiveVolumeModifiedMatrix(fCluster.GetVolumeID(),gpar);
if (!fTempHMat) return -1;
Double_t v0g[3];
Double_t p0g[3];
if (fBOn) {
AliTrackPoint prf;
for (int ip=0; ip<5; ip++)
fRieman->SetParam(ip,lpar[ip]);
if (!fRieman->GetPCA(fCluster,prf)) {
AliInfo(Form("error in GetPCA for point %d",fCluster.GetVolumeID()));
return -3;
}
Double_t alpha=fRieman->GetAlpha();
Double_t x1g = prf.GetX();
Double_t y1g = prf.GetY();
Double_t z1g = prf.GetZ();
Double_t x1t = x1g*TMath::Cos(alpha) + y1g*TMath::Sin(alpha);
Double_t y1t = -x1g*TMath::Sin(alpha) + y1g*TMath::Cos(alpha);
Double_t z1t = z1g;
Double_t x2t = x1t+1.0;
Double_t y2t = y1t+fRieman->GetDYat(x1t);
Double_t z2t = z1t+fRieman->GetDZat(x1t);
Double_t x2g = x2t*TMath::Cos(alpha) - y2t*TMath::Sin(alpha);
Double_t y2g = x2t*TMath::Sin(alpha) + y2t*TMath::Cos(alpha);
Double_t z2g = z2t;
AliDebug(3,Form("Riemann frame: fAlpha = %f = %f ",alpha,alpha*180./TMath::Pi()));
AliDebug(3,Form(" prf_glo=( %f , %f , %f ) prf_rf=( %f , %f , %f )\n", x1g,y1g,z1g, x1t,y1t,z1t));
AliDebug(3,Form(" mov_glo=( %f , %f , %f ) rf=( %f , %f , %f )\n",x2g,y2g,z2g, x2t,y2t,z2t));
if (TMath::Abs(y2g-y1g)<1e-15) {
AliInfo("DeltaY=0! Cannot proceed...");
return -1;
}
v0g[0] = (x2g-x1g)/(y2g-y1g);
v0g[1]=1.0;
v0g[2] = (z2g-z1g)/(y2g-y1g);
p0g[0]=x1g;
p0g[1]=y1g;
p0g[2]=z1g;
}
else {
v0g[0]=lpar[2];
v0g[1]=1.0;
v0g[2]=lpar[3];
p0g[0]=lpar[0];
p0g[1]=0.0;
p0g[2]=lpar[1];
}
AliDebug(3,Form("Line vector: ( %f , %f , %f ) point:( %f , %f , %f )\n",v0g[0],v0g[1],v0g[2],p0g[0],p0g[1],p0g[2]));
Double_t p0l[3],v0l[3];
fTempHMat->MasterToLocalVect(v0g,v0l);
fTempHMat->MasterToLocal(p0g,p0l);
if (TMath::Abs(v0l[1])<1e-15) {
AliInfo("Track Y direction in local frame is zero! Cannot proceed...");
return -1;
}
fPintLoc[0] = p0l[0] - (v0l[0]/v0l[1])*p0l[1];
fPintLoc[1] = 0;
fPintLoc[2] = p0l[2] - (v0l[2]/v0l[1])*p0l[1];
fTempHMat->LocalToMaster(fPintLoc,fPintGlo);
AliDebug(3,Form("Intesect. point: L( %f , %f , %f ) G( %f , %f , %f )\n",fPintLoc[0],fPintLoc[1],fPintLoc[2],fPintGlo[0],fPintGlo[1],fPintGlo[2]));
return 0;
}
Int_t AliITSAlignMille::CalcDerivatives(Int_t paridx, Bool_t islpar) {
Double_t lpar[ITSMILLENLOCAL];
Double_t gpar[ITSMILLENPARCH];
for (Int_t i=0; i<ITSMILLENLOCAL; i++) lpar[i]=fLocalInitParam[i];
for (Int_t i=0; i<ITSMILLENPARCH; i++) gpar[i]=fModuleInitParam[i];
Double_t dpar=0.0;
if (islpar) {
if (!fBOn) {
if (paridx<2) dpar=1.0e-4;
else dpar=1.0e-6;
}
else {
Double_t dfrac=0.01;
switch(paridx) {
case 0:
dpar = TMath::Max(1.0e-6,TMath::Abs(fLocalInitParam[paridx]*dfrac));
break;
case 1:
dpar = TMath::Max(0.002,TMath::Abs(fLocalInitParam[paridx]*dfrac));
break;
case 2:
dpar = TMath::Max(0.09,TMath::Abs(fLocalInitParam[paridx]*dfrac));
break;
case 3:
dpar = TMath::Max(0.07,TMath::Abs(fLocalInitParam[paridx]*dfrac));
break;
case 4:
dpar = TMath::Max(0.003,TMath::Abs(fLocalInitParam[paridx]*dfrac));
break;
}
}
}
else {
if (paridx<3) dpar=1.0e-4;
else dpar=1.0e-2;
}
AliDebug(3,Form("+++ using dpar=%g",dpar));
Double_t pintl1[3];
Double_t pintl2[3];
Double_t pintl3[3];
Double_t pintl4[3];
if (islpar) lpar[paridx] -= dpar;
else gpar[paridx] -= dpar;
if (CalcIntersectionPoint(lpar, gpar)) return -2;
for (Int_t i=0; i<3; i++) pintl1[i]=fPintLoc[i];
if (islpar) lpar[paridx] += dpar/2;
else gpar[paridx] += dpar/2;
if (CalcIntersectionPoint(lpar, gpar)) return -2;
for (Int_t i=0; i<3; i++) pintl2[i]=fPintLoc[i];
if (islpar) lpar[paridx] += dpar;
else gpar[paridx] += dpar;
if (CalcIntersectionPoint(lpar, gpar)) return -2;
for (Int_t i=0; i<3; i++) pintl3[i]=fPintLoc[i];
if (islpar) lpar[paridx] += dpar/2;
else gpar[paridx] += dpar/2;
if (CalcIntersectionPoint(lpar, gpar)) return -2;
for (Int_t i=0; i<3; i++) pintl4[i]=fPintLoc[i];
Double_t h2 = 1./(2.*dpar);
Double_t d0 = pintl4[0]-pintl1[0];
Double_t d2 = 2.*(pintl3[0]-pintl2[0]);
fDerivativeXLoc = h2*(4*d2 - d0)/3.;
if (TMath::Abs(fDerivativeXLoc) < 1.0e-9) fDerivativeXLoc=0.0;
d0 = pintl4[2]-pintl1[2];
d2 = 2.*(pintl3[2]-pintl2[2]);
fDerivativeZLoc = h2*(4*d2 - d0)/3.;
if (TMath::Abs(fDerivativeZLoc) < 1.0e-9) fDerivativeZLoc=0.0;
AliDebug(3,Form("\n+++ derivatives +++ \n"));
AliDebug(3,Form("+++ dXLoc/dpar = %g +++\n",fDerivativeXLoc));
AliDebug(3,Form("+++ dZLoc/dpar = %g +++\n\n",fDerivativeZLoc));
return 0;
}
Int_t AliITSAlignMille::AddLocalEquation(AliITSAlignMilleData &m) {
if (CalcIntersectionPoint(fLocalInitParam, fModuleInitParam)) return -4;
for (Int_t i=0; i<3; i++) fPintLoc0[i]=fPintLoc[i];
AliDebug(2,Form("Intesect. point: L( %f , %f , %f )",fPintLoc[0],fPintLoc[1],fPintLoc[2]));
Double_t dXdL[ITSMILLENLOCAL],dZdL[ITSMILLENLOCAL];
for (Int_t i=0; i<fNLocal; i++) {
if (CalcDerivatives(i,kTRUE)) return -1;
dXdL[i]=fDerivativeXLoc;
dZdL[i]=fDerivativeZLoc;
}
Double_t dXdG[ITSMILLENPARCH],dZdG[ITSMILLENPARCH];
for (Int_t i=0; i<ITSMILLENPARCH; i++) {
if (CalcDerivatives(i,kFALSE)) return -1;
dXdG[i]=fDerivativeXLoc;
dZdG[i]=fDerivativeZLoc;
}
AliDebug(2,Form("\n***************\n"));
for (Int_t i=0; i<fNLocal; i++)
AliDebug(2,Form("Local parameter %d - dXdpar = %g - dZdpar = %g\n",i,dXdL[i],dZdL[i]));
for (Int_t i=0; i<ITSMILLENPARCH; i++)
AliDebug(2,Form("Global parameter %d - dXdpar = %g - dZdpar = %g\n",i,dXdG[i],dZdG[i]));
AliDebug(2,Form("\n***************\n"));
Double_t nonzero=0.0;
for (Int_t i=0; i<fNLocal; i++) nonzero += TMath::Abs(dXdL[i]);
if (nonzero==0.0) {
AliInfo("Discarding local equations for this point beacuse of zero local X derivatives!");
return -2;
}
nonzero=0.0;
for (Int_t i=0; i<ITSMILLENPARCH; i++) nonzero += TMath::Abs(dXdG[i]);
if (nonzero==0.0) {
AliInfo("Discarding local equations for this point beacuse of zero global X derivatives!");
return -2;
}
nonzero=0.0;
for (Int_t i=0; i<fNLocal; i++) nonzero += TMath::Abs(dZdL[i]);
if (nonzero==0.0) {
AliInfo("Discarding local equations for this point beacuse of zero local Z derivatives!");
return -2;
}
nonzero=0.0;
for (Int_t i=0; i<ITSMILLENPARCH; i++) nonzero += TMath::Abs(dZdG[i]);
if (nonzero==0.0) {
AliInfo("Discarding local equations for this point beacuse of zero global Z derivatives!");
return -2;
}
AliDebug(2,Form("Adding local equation X with fMeas=%.6f and fSigma=%.6f",(fMeasLoc[0]-fPintLoc0[0]), fSigmaLoc[0]));
for (Int_t i=0; i<fNLocal; i++) {
m.GetIdxlocX()[i]=i;
m.GetDerlocX()[i]=dXdL[i];
}
for (Int_t i=0; i<ITSMILLENPARCH; i++) {
m.GetIdxgloX()[i]=fCurrentModuleInternalIndex*ITSMILLENPARCH+i;
m.GetDergloX()[i]=dXdG[i];
}
m.SetMeasX(fMeasLoc[0]-fPintLoc0[0]);
m.SetSigmaX(fSigmaLoc[0]);
AliDebug(2,Form("Adding local equation Z with fMeas=%.6f and fSigma=%.6f",(fMeasLoc[2]-fPintLoc0[2]), fSigmaLoc[2]));
for (Int_t i=0; i<fNLocal; i++) {
m.GetIdxlocZ()[i]=i;
m.GetDerlocZ()[i]=dZdL[i];
}
for (Int_t i=0; i<ITSMILLENPARCH; i++) {
m.GetIdxgloZ()[i]=fCurrentModuleInternalIndex*ITSMILLENPARCH+i;
m.GetDergloZ()[i]=dZdG[i];
}
m.SetMeasZ(fMeasLoc[2]-fPintLoc0[2]);
m.SetSigmaZ(fSigmaLoc[2]);
return 0;
}
void AliITSAlignMille::SetLocalEquations(const AliITSAlignMilleData *m, Int_t neq) {
for (Int_t j=0; j<neq; j++) {
AliDebug(2,Form("setting local equation X with fMeas=%.6f and fSigma=%.6f",m[j].GetMeasX(), m[j].GetSigmaX()));
for (Int_t i=0; i<fNLocal; i++)
SetLocalDerivative( m[j].GetIdxlocX()[i], m[j].GetDerlocX()[i] );
for (Int_t i=0; i<ITSMILLENPARCH; i++)
SetGlobalDerivative( m[j].GetIdxgloX()[i], m[j].GetDergloX()[i] );
fMillepede->SetLocalEquation(fGlobalDerivatives, fLocalDerivatives, m[j].GetMeasX(), m[j].GetSigmaX());
AliDebug(2,Form("setting local equation Z with fMeas=%.6f and fSigma=%.6f",m[j].GetMeasZ(), m[j].GetSigmaZ()));
for (Int_t i=0; i<fNLocal; i++)
SetLocalDerivative( m[j].GetIdxlocZ()[i], m[j].GetDerlocZ()[i] );
for (Int_t i=0; i<ITSMILLENPARCH; i++)
SetGlobalDerivative( m[j].GetIdxgloZ()[i], m[j].GetDergloZ()[i] );
fMillepede->SetLocalEquation(fGlobalDerivatives, fLocalDerivatives, m[j].GetMeasZ(), m[j].GetSigmaZ());
}
}
void AliITSAlignMille::LocalFit(Int_t iTrack, Double_t *lTrackParam, Int_t lSingleFit) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return;
}
Int_t iRes = fMillepede->LocalFit(iTrack,lTrackParam,lSingleFit);
AliDebug(2,Form("iRes = %d",iRes));
if (!lSingleFit) {
fMillepede->SetNLocalEquations(fMillepede->GetNLocalEquations()+1);
}
}
void AliITSAlignMille::GlobalFit(Double_t *parameters,Double_t *errors,Double_t *pulls) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return;
}
fMillepede->GlobalFit(parameters,errors,pulls);
AliInfo("Done fitting global parameters!");
}
Double_t AliITSAlignMille::GetParError(Int_t iPar) {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return 0;
}
Double_t lErr = fMillepede->GetParError(iPar);
return lErr;
}
void AliITSAlignMille::PrintGlobalParameters() {
if (!fIsMilleInit) {
AliInfo("Millepede has not been initialized!");
return;
}
fMillepede->PrintGlobalParameters();
}
Int_t AliITSAlignMille::LoadSuperModuleFile(const Char_t *sfile)
{
TFile *smf=TFile::Open(sfile);
if (!smf->IsOpen()) {
AliInfo(Form("Cannot open supermodule file %s",sfile));
return -1;
}
TClonesArray *sma=(TClonesArray*)smf->Get("ITSMilleSuperModules");
if (!sma) {
AliInfo(Form("Cannot find ITSMilleSuperModules array in file"));
return -2;
}
Int_t nsma=sma->GetEntriesFast();
AliInfo(Form("Array of SuperModules with %d entries\n",nsma));
Char_t st[2048];
char symname[250];
UShort_t volid;
TGeoHMatrix m;
for (Int_t i=0; i<nsma; i++) {
AliAlignObjParams *a = (AliAlignObjParams*)sma->UncheckedAt(i);
volid=a->GetVolUID();
strncpy(st,a->GetSymName(),TMath::Min(sizeof(st),strlen(a->GetSymName())+1));
a->GetMatrix(m);
memset(symname,0,250*sizeof(char));
sscanf(st,"%249s",symname);
char *stp=strstr(st,"ModuleList:");
if (!stp) return -3;
stp += 11;
int idx[2200];
char spp[200]; int jp=0;
char cl[20];
strncpy(st,stp,TMath::Min(sizeof(st),strlen(stp)+1));
int l=strlen(st);
int j=0;
int n=0;
while (j<=l) {
if (st[j]==9 || st[j]==32 || st[j]==10 || st[j]==0) {
spp[jp]=0;
jp=0;
if (strlen(spp)) {
int k=strcspn(spp,"-");
if (k<int(strlen(spp))) {
strncpy(cl,&(spp[k+1]), TMath::Min(sizeof(cl),strlen(&spp[k+1])+1));
spp[k]=0;
int ifrom=atoi(spp); int ito=atoi(cl);
for (int b=ifrom; b<=ito; b++) {
idx[n]=b;
n++;
}
}
else {
idx[n]=atoi(spp);
n++;
}
}
}
else {
spp[jp]=st[j];
jp++;
}
j++;
}
UShort_t volidsv[2198];
for (j=0;j<n;j++) {
volidsv[j]=AliITSAlignMilleModule::GetVolumeIDFromIndex(idx[j]);
if (!volidsv[j]) {
AliInfo(Form("Index %d not valid (range 0->2197)",idx[j]));
return -5;
}
}
Int_t smindex=int(2198+volid-14336);
fSuperModule[fNSuperModules]=new AliITSAlignMilleModule(smindex,volid,symname,&m,n,volidsv);
fNSuperModules++;
}
smf->Close();
fUseSuperModules=1;
return 0;
}
AliITSAlignMille.cxx:1000 AliITSAlignMille.cxx:1001 AliITSAlignMille.cxx:1002 AliITSAlignMille.cxx:1003 AliITSAlignMille.cxx:1004 AliITSAlignMille.cxx:1005 AliITSAlignMille.cxx:1006 AliITSAlignMille.cxx:1007 AliITSAlignMille.cxx:1008 AliITSAlignMille.cxx:1009 AliITSAlignMille.cxx:1010 AliITSAlignMille.cxx:1011 AliITSAlignMille.cxx:1012 AliITSAlignMille.cxx:1013 AliITSAlignMille.cxx:1014 AliITSAlignMille.cxx:1015 AliITSAlignMille.cxx:1016 AliITSAlignMille.cxx:1017 AliITSAlignMille.cxx:1018 AliITSAlignMille.cxx:1019 AliITSAlignMille.cxx:1020 AliITSAlignMille.cxx:1021 AliITSAlignMille.cxx:1022 AliITSAlignMille.cxx:1023 AliITSAlignMille.cxx:1024 AliITSAlignMille.cxx:1025 AliITSAlignMille.cxx:1026 AliITSAlignMille.cxx:1027 AliITSAlignMille.cxx:1028 AliITSAlignMille.cxx:1029 AliITSAlignMille.cxx:1030 AliITSAlignMille.cxx:1031 AliITSAlignMille.cxx:1032 AliITSAlignMille.cxx:1033 AliITSAlignMille.cxx:1034 AliITSAlignMille.cxx:1035 AliITSAlignMille.cxx:1036 AliITSAlignMille.cxx:1037 AliITSAlignMille.cxx:1038 AliITSAlignMille.cxx:1039 AliITSAlignMille.cxx:1040 AliITSAlignMille.cxx:1041 AliITSAlignMille.cxx:1042 AliITSAlignMille.cxx:1043 AliITSAlignMille.cxx:1044 AliITSAlignMille.cxx:1045 AliITSAlignMille.cxx:1046 AliITSAlignMille.cxx:1047 AliITSAlignMille.cxx:1048 AliITSAlignMille.cxx:1049 AliITSAlignMille.cxx:1050 AliITSAlignMille.cxx:1051 AliITSAlignMille.cxx:1052 AliITSAlignMille.cxx:1053 AliITSAlignMille.cxx:1054 AliITSAlignMille.cxx:1055 AliITSAlignMille.cxx:1056 AliITSAlignMille.cxx:1057 AliITSAlignMille.cxx:1058 AliITSAlignMille.cxx:1059 AliITSAlignMille.cxx:1060 AliITSAlignMille.cxx:1061 AliITSAlignMille.cxx:1062 AliITSAlignMille.cxx:1063 AliITSAlignMille.cxx:1064 AliITSAlignMille.cxx:1065 AliITSAlignMille.cxx:1066 AliITSAlignMille.cxx:1067 AliITSAlignMille.cxx:1068 AliITSAlignMille.cxx:1069 AliITSAlignMille.cxx:1070 AliITSAlignMille.cxx:1071 AliITSAlignMille.cxx:1072 AliITSAlignMille.cxx:1073 AliITSAlignMille.cxx:1074 AliITSAlignMille.cxx:1075 AliITSAlignMille.cxx:1076 AliITSAlignMille.cxx:1077 AliITSAlignMille.cxx:1078 AliITSAlignMille.cxx:1079 AliITSAlignMille.cxx:1080 AliITSAlignMille.cxx:1081 AliITSAlignMille.cxx:1082 AliITSAlignMille.cxx:1083 AliITSAlignMille.cxx:1084 AliITSAlignMille.cxx:1085 AliITSAlignMille.cxx:1086 AliITSAlignMille.cxx:1087 AliITSAlignMille.cxx:1088 AliITSAlignMille.cxx:1089 AliITSAlignMille.cxx:1090 AliITSAlignMille.cxx:1091 AliITSAlignMille.cxx:1092 AliITSAlignMille.cxx:1093 AliITSAlignMille.cxx:1094 AliITSAlignMille.cxx:1095 AliITSAlignMille.cxx:1096 AliITSAlignMille.cxx:1097 AliITSAlignMille.cxx:1098 AliITSAlignMille.cxx:1099 AliITSAlignMille.cxx:1100 AliITSAlignMille.cxx:1101 AliITSAlignMille.cxx:1102 AliITSAlignMille.cxx:1103 AliITSAlignMille.cxx:1104 AliITSAlignMille.cxx:1105 AliITSAlignMille.cxx:1106 AliITSAlignMille.cxx:1107 AliITSAlignMille.cxx:1108 AliITSAlignMille.cxx:1109 AliITSAlignMille.cxx:1110 AliITSAlignMille.cxx:1111 AliITSAlignMille.cxx:1112 AliITSAlignMille.cxx:1113 AliITSAlignMille.cxx:1114 AliITSAlignMille.cxx:1115 AliITSAlignMille.cxx:1116 AliITSAlignMille.cxx:1117 AliITSAlignMille.cxx:1118 AliITSAlignMille.cxx:1119 AliITSAlignMille.cxx:1120 AliITSAlignMille.cxx:1121 AliITSAlignMille.cxx:1122 AliITSAlignMille.cxx:1123 AliITSAlignMille.cxx:1124 AliITSAlignMille.cxx:1125 AliITSAlignMille.cxx:1126 AliITSAlignMille.cxx:1127 AliITSAlignMille.cxx:1128 AliITSAlignMille.cxx:1129 AliITSAlignMille.cxx:1130 AliITSAlignMille.cxx:1131 AliITSAlignMille.cxx:1132 AliITSAlignMille.cxx:1133 AliITSAlignMille.cxx:1134 AliITSAlignMille.cxx:1135 AliITSAlignMille.cxx:1136 AliITSAlignMille.cxx:1137 AliITSAlignMille.cxx:1138 AliITSAlignMille.cxx:1139 AliITSAlignMille.cxx:1140 AliITSAlignMille.cxx:1141 AliITSAlignMille.cxx:1142 AliITSAlignMille.cxx:1143 AliITSAlignMille.cxx:1144 AliITSAlignMille.cxx:1145 AliITSAlignMille.cxx:1146 AliITSAlignMille.cxx:1147 AliITSAlignMille.cxx:1148 AliITSAlignMille.cxx:1149 AliITSAlignMille.cxx:1150 AliITSAlignMille.cxx:1151 AliITSAlignMille.cxx:1152 AliITSAlignMille.cxx:1153 AliITSAlignMille.cxx:1154 AliITSAlignMille.cxx:1155 AliITSAlignMille.cxx:1156 AliITSAlignMille.cxx:1157 AliITSAlignMille.cxx:1158 AliITSAlignMille.cxx:1159 AliITSAlignMille.cxx:1160 AliITSAlignMille.cxx:1161 AliITSAlignMille.cxx:1162 AliITSAlignMille.cxx:1163 AliITSAlignMille.cxx:1164 AliITSAlignMille.cxx:1165 AliITSAlignMille.cxx:1166 AliITSAlignMille.cxx:1167 AliITSAlignMille.cxx:1168 AliITSAlignMille.cxx:1169 AliITSAlignMille.cxx:1170 AliITSAlignMille.cxx:1171 AliITSAlignMille.cxx:1172 AliITSAlignMille.cxx:1173 AliITSAlignMille.cxx:1174 AliITSAlignMille.cxx:1175 AliITSAlignMille.cxx:1176 AliITSAlignMille.cxx:1177 AliITSAlignMille.cxx:1178 AliITSAlignMille.cxx:1179 AliITSAlignMille.cxx:1180 AliITSAlignMille.cxx:1181 AliITSAlignMille.cxx:1182 AliITSAlignMille.cxx:1183 AliITSAlignMille.cxx:1184 AliITSAlignMille.cxx:1185 AliITSAlignMille.cxx:1186 AliITSAlignMille.cxx:1187 AliITSAlignMille.cxx:1188 AliITSAlignMille.cxx:1189 AliITSAlignMille.cxx:1190 AliITSAlignMille.cxx:1191 AliITSAlignMille.cxx:1192 AliITSAlignMille.cxx:1193 AliITSAlignMille.cxx:1194 AliITSAlignMille.cxx:1195 AliITSAlignMille.cxx:1196 AliITSAlignMille.cxx:1197 AliITSAlignMille.cxx:1198 AliITSAlignMille.cxx:1199 AliITSAlignMille.cxx:1200 AliITSAlignMille.cxx:1201 AliITSAlignMille.cxx:1202 AliITSAlignMille.cxx:1203 AliITSAlignMille.cxx:1204 AliITSAlignMille.cxx:1205 AliITSAlignMille.cxx:1206 AliITSAlignMille.cxx:1207 AliITSAlignMille.cxx:1208 AliITSAlignMille.cxx:1209 AliITSAlignMille.cxx:1210 AliITSAlignMille.cxx:1211 AliITSAlignMille.cxx:1212 AliITSAlignMille.cxx:1213 AliITSAlignMille.cxx:1214 AliITSAlignMille.cxx:1215 AliITSAlignMille.cxx:1216 AliITSAlignMille.cxx:1217 AliITSAlignMille.cxx:1218 AliITSAlignMille.cxx:1219 AliITSAlignMille.cxx:1220 AliITSAlignMille.cxx:1221 AliITSAlignMille.cxx:1222 AliITSAlignMille.cxx:1223 AliITSAlignMille.cxx:1224 AliITSAlignMille.cxx:1225 AliITSAlignMille.cxx:1226 AliITSAlignMille.cxx:1227 AliITSAlignMille.cxx:1228 AliITSAlignMille.cxx:1229 AliITSAlignMille.cxx:1230 AliITSAlignMille.cxx:1231 AliITSAlignMille.cxx:1232 AliITSAlignMille.cxx:1233 AliITSAlignMille.cxx:1234 AliITSAlignMille.cxx:1235 AliITSAlignMille.cxx:1236 AliITSAlignMille.cxx:1237 AliITSAlignMille.cxx:1238 AliITSAlignMille.cxx:1239 AliITSAlignMille.cxx:1240 AliITSAlignMille.cxx:1241 AliITSAlignMille.cxx:1242 AliITSAlignMille.cxx:1243 AliITSAlignMille.cxx:1244 AliITSAlignMille.cxx:1245 AliITSAlignMille.cxx:1246 AliITSAlignMille.cxx:1247 AliITSAlignMille.cxx:1248 AliITSAlignMille.cxx:1249 AliITSAlignMille.cxx:1250 AliITSAlignMille.cxx:1251 AliITSAlignMille.cxx:1252 AliITSAlignMille.cxx:1253 AliITSAlignMille.cxx:1254 AliITSAlignMille.cxx:1255 AliITSAlignMille.cxx:1256 AliITSAlignMille.cxx:1257 AliITSAlignMille.cxx:1258 AliITSAlignMille.cxx:1259 AliITSAlignMille.cxx:1260 AliITSAlignMille.cxx:1261 AliITSAlignMille.cxx:1262 AliITSAlignMille.cxx:1263 AliITSAlignMille.cxx:1264 AliITSAlignMille.cxx:1265 AliITSAlignMille.cxx:1266 AliITSAlignMille.cxx:1267 AliITSAlignMille.cxx:1268 AliITSAlignMille.cxx:1269 AliITSAlignMille.cxx:1270 AliITSAlignMille.cxx:1271 AliITSAlignMille.cxx:1272 AliITSAlignMille.cxx:1273 AliITSAlignMille.cxx:1274 AliITSAlignMille.cxx:1275 AliITSAlignMille.cxx:1276 AliITSAlignMille.cxx:1277 AliITSAlignMille.cxx:1278 AliITSAlignMille.cxx:1279 AliITSAlignMille.cxx:1280 AliITSAlignMille.cxx:1281 AliITSAlignMille.cxx:1282 AliITSAlignMille.cxx:1283 AliITSAlignMille.cxx:1284 AliITSAlignMille.cxx:1285 AliITSAlignMille.cxx:1286 AliITSAlignMille.cxx:1287 AliITSAlignMille.cxx:1288 AliITSAlignMille.cxx:1289 AliITSAlignMille.cxx:1290 AliITSAlignMille.cxx:1291 AliITSAlignMille.cxx:1292 AliITSAlignMille.cxx:1293 AliITSAlignMille.cxx:1294 AliITSAlignMille.cxx:1295 AliITSAlignMille.cxx:1296 AliITSAlignMille.cxx:1297 AliITSAlignMille.cxx:1298 AliITSAlignMille.cxx:1299 AliITSAlignMille.cxx:1300 AliITSAlignMille.cxx:1301 AliITSAlignMille.cxx:1302 AliITSAlignMille.cxx:1303 AliITSAlignMille.cxx:1304 AliITSAlignMille.cxx:1305 AliITSAlignMille.cxx:1306 AliITSAlignMille.cxx:1307 AliITSAlignMille.cxx:1308 AliITSAlignMille.cxx:1309 AliITSAlignMille.cxx:1310 AliITSAlignMille.cxx:1311 AliITSAlignMille.cxx:1312 AliITSAlignMille.cxx:1313 AliITSAlignMille.cxx:1314 AliITSAlignMille.cxx:1315 AliITSAlignMille.cxx:1316 AliITSAlignMille.cxx:1317 AliITSAlignMille.cxx:1318 AliITSAlignMille.cxx:1319 AliITSAlignMille.cxx:1320 AliITSAlignMille.cxx:1321 AliITSAlignMille.cxx:1322 AliITSAlignMille.cxx:1323 AliITSAlignMille.cxx:1324 AliITSAlignMille.cxx:1325 AliITSAlignMille.cxx:1326 AliITSAlignMille.cxx:1327 AliITSAlignMille.cxx:1328 AliITSAlignMille.cxx:1329 AliITSAlignMille.cxx:1330 AliITSAlignMille.cxx:1331 AliITSAlignMille.cxx:1332 AliITSAlignMille.cxx:1333 AliITSAlignMille.cxx:1334 AliITSAlignMille.cxx:1335 AliITSAlignMille.cxx:1336 AliITSAlignMille.cxx:1337 AliITSAlignMille.cxx:1338 AliITSAlignMille.cxx:1339 AliITSAlignMille.cxx:1340 AliITSAlignMille.cxx:1341 AliITSAlignMille.cxx:1342 AliITSAlignMille.cxx:1343 AliITSAlignMille.cxx:1344 AliITSAlignMille.cxx:1345 AliITSAlignMille.cxx:1346 AliITSAlignMille.cxx:1347 AliITSAlignMille.cxx:1348 AliITSAlignMille.cxx:1349 AliITSAlignMille.cxx:1350 AliITSAlignMille.cxx:1351 AliITSAlignMille.cxx:1352 AliITSAlignMille.cxx:1353 AliITSAlignMille.cxx:1354 AliITSAlignMille.cxx:1355 AliITSAlignMille.cxx:1356 AliITSAlignMille.cxx:1357 AliITSAlignMille.cxx:1358 AliITSAlignMille.cxx:1359 AliITSAlignMille.cxx:1360 AliITSAlignMille.cxx:1361 AliITSAlignMille.cxx:1362 AliITSAlignMille.cxx:1363 AliITSAlignMille.cxx:1364 AliITSAlignMille.cxx:1365 AliITSAlignMille.cxx:1366 AliITSAlignMille.cxx:1367 AliITSAlignMille.cxx:1368 AliITSAlignMille.cxx:1369 AliITSAlignMille.cxx:1370 AliITSAlignMille.cxx:1371 AliITSAlignMille.cxx:1372 AliITSAlignMille.cxx:1373 AliITSAlignMille.cxx:1374 AliITSAlignMille.cxx:1375 AliITSAlignMille.cxx:1376 AliITSAlignMille.cxx:1377 AliITSAlignMille.cxx:1378 AliITSAlignMille.cxx:1379 AliITSAlignMille.cxx:1380 AliITSAlignMille.cxx:1381 AliITSAlignMille.cxx:1382 AliITSAlignMille.cxx:1383 AliITSAlignMille.cxx:1384 AliITSAlignMille.cxx:1385 AliITSAlignMille.cxx:1386 AliITSAlignMille.cxx:1387 AliITSAlignMille.cxx:1388 AliITSAlignMille.cxx:1389 AliITSAlignMille.cxx:1390 AliITSAlignMille.cxx:1391 AliITSAlignMille.cxx:1392 AliITSAlignMille.cxx:1393 AliITSAlignMille.cxx:1394 AliITSAlignMille.cxx:1395 AliITSAlignMille.cxx:1396 AliITSAlignMille.cxx:1397 AliITSAlignMille.cxx:1398 AliITSAlignMille.cxx:1399 AliITSAlignMille.cxx:1400 AliITSAlignMille.cxx:1401 AliITSAlignMille.cxx:1402 AliITSAlignMille.cxx:1403 AliITSAlignMille.cxx:1404 AliITSAlignMille.cxx:1405 AliITSAlignMille.cxx:1406 AliITSAlignMille.cxx:1407 AliITSAlignMille.cxx:1408 AliITSAlignMille.cxx:1409 AliITSAlignMille.cxx:1410 AliITSAlignMille.cxx:1411 AliITSAlignMille.cxx:1412 AliITSAlignMille.cxx:1413 AliITSAlignMille.cxx:1414 AliITSAlignMille.cxx:1415 AliITSAlignMille.cxx:1416 AliITSAlignMille.cxx:1417 AliITSAlignMille.cxx:1418 AliITSAlignMille.cxx:1419 AliITSAlignMille.cxx:1420 AliITSAlignMille.cxx:1421 AliITSAlignMille.cxx:1422 AliITSAlignMille.cxx:1423 AliITSAlignMille.cxx:1424 AliITSAlignMille.cxx:1425 AliITSAlignMille.cxx:1426 AliITSAlignMille.cxx:1427 AliITSAlignMille.cxx:1428 AliITSAlignMille.cxx:1429 AliITSAlignMille.cxx:1430 AliITSAlignMille.cxx:1431 AliITSAlignMille.cxx:1432 AliITSAlignMille.cxx:1433 AliITSAlignMille.cxx:1434 AliITSAlignMille.cxx:1435 AliITSAlignMille.cxx:1436 AliITSAlignMille.cxx:1437 AliITSAlignMille.cxx:1438 AliITSAlignMille.cxx:1439 AliITSAlignMille.cxx:1440 AliITSAlignMille.cxx:1441 AliITSAlignMille.cxx:1442 AliITSAlignMille.cxx:1443 AliITSAlignMille.cxx:1444 AliITSAlignMille.cxx:1445 AliITSAlignMille.cxx:1446 AliITSAlignMille.cxx:1447 AliITSAlignMille.cxx:1448 AliITSAlignMille.cxx:1449 AliITSAlignMille.cxx:1450 AliITSAlignMille.cxx:1451 AliITSAlignMille.cxx:1452 AliITSAlignMille.cxx:1453 AliITSAlignMille.cxx:1454 AliITSAlignMille.cxx:1455 AliITSAlignMille.cxx:1456 AliITSAlignMille.cxx:1457 AliITSAlignMille.cxx:1458 AliITSAlignMille.cxx:1459 AliITSAlignMille.cxx:1460 AliITSAlignMille.cxx:1461 AliITSAlignMille.cxx:1462 AliITSAlignMille.cxx:1463 AliITSAlignMille.cxx:1464 AliITSAlignMille.cxx:1465 AliITSAlignMille.cxx:1466 AliITSAlignMille.cxx:1467 AliITSAlignMille.cxx:1468 AliITSAlignMille.cxx:1469 AliITSAlignMille.cxx:1470 AliITSAlignMille.cxx:1471 AliITSAlignMille.cxx:1472 AliITSAlignMille.cxx:1473 AliITSAlignMille.cxx:1474 AliITSAlignMille.cxx:1475 AliITSAlignMille.cxx:1476 AliITSAlignMille.cxx:1477 AliITSAlignMille.cxx:1478 AliITSAlignMille.cxx:1479 AliITSAlignMille.cxx:1480 AliITSAlignMille.cxx:1481 AliITSAlignMille.cxx:1482 AliITSAlignMille.cxx:1483 AliITSAlignMille.cxx:1484 AliITSAlignMille.cxx:1485 AliITSAlignMille.cxx:1486 AliITSAlignMille.cxx:1487 AliITSAlignMille.cxx:1488 AliITSAlignMille.cxx:1489 AliITSAlignMille.cxx:1490 AliITSAlignMille.cxx:1491 AliITSAlignMille.cxx:1492 AliITSAlignMille.cxx:1493 AliITSAlignMille.cxx:1494 AliITSAlignMille.cxx:1495 AliITSAlignMille.cxx:1496 AliITSAlignMille.cxx:1497 AliITSAlignMille.cxx:1498 AliITSAlignMille.cxx:1499 AliITSAlignMille.cxx:1500 AliITSAlignMille.cxx:1501 AliITSAlignMille.cxx:1502 AliITSAlignMille.cxx:1503 AliITSAlignMille.cxx:1504 AliITSAlignMille.cxx:1505 AliITSAlignMille.cxx:1506 AliITSAlignMille.cxx:1507 AliITSAlignMille.cxx:1508 AliITSAlignMille.cxx:1509 AliITSAlignMille.cxx:1510 AliITSAlignMille.cxx:1511 AliITSAlignMille.cxx:1512 AliITSAlignMille.cxx:1513 AliITSAlignMille.cxx:1514 AliITSAlignMille.cxx:1515 AliITSAlignMille.cxx:1516 AliITSAlignMille.cxx:1517 AliITSAlignMille.cxx:1518 AliITSAlignMille.cxx:1519 AliITSAlignMille.cxx:1520 AliITSAlignMille.cxx:1521 AliITSAlignMille.cxx:1522 AliITSAlignMille.cxx:1523 AliITSAlignMille.cxx:1524 AliITSAlignMille.cxx:1525 AliITSAlignMille.cxx:1526 AliITSAlignMille.cxx:1527 AliITSAlignMille.cxx:1528 AliITSAlignMille.cxx:1529 AliITSAlignMille.cxx:1530 AliITSAlignMille.cxx:1531 AliITSAlignMille.cxx:1532 AliITSAlignMille.cxx:1533 AliITSAlignMille.cxx:1534 AliITSAlignMille.cxx:1535 AliITSAlignMille.cxx:1536 AliITSAlignMille.cxx:1537 AliITSAlignMille.cxx:1538 AliITSAlignMille.cxx:1539 AliITSAlignMille.cxx:1540 AliITSAlignMille.cxx:1541 AliITSAlignMille.cxx:1542 AliITSAlignMille.cxx:1543 AliITSAlignMille.cxx:1544 AliITSAlignMille.cxx:1545 AliITSAlignMille.cxx:1546 AliITSAlignMille.cxx:1547 AliITSAlignMille.cxx:1548 AliITSAlignMille.cxx:1549 AliITSAlignMille.cxx:1550 AliITSAlignMille.cxx:1551 AliITSAlignMille.cxx:1552 AliITSAlignMille.cxx:1553 AliITSAlignMille.cxx:1554 AliITSAlignMille.cxx:1555 AliITSAlignMille.cxx:1556 AliITSAlignMille.cxx:1557 AliITSAlignMille.cxx:1558 AliITSAlignMille.cxx:1559 AliITSAlignMille.cxx:1560 AliITSAlignMille.cxx:1561 AliITSAlignMille.cxx:1562 AliITSAlignMille.cxx:1563 AliITSAlignMille.cxx:1564 AliITSAlignMille.cxx:1565 AliITSAlignMille.cxx:1566 AliITSAlignMille.cxx:1567 AliITSAlignMille.cxx:1568 AliITSAlignMille.cxx:1569 AliITSAlignMille.cxx:1570 AliITSAlignMille.cxx:1571 AliITSAlignMille.cxx:1572 AliITSAlignMille.cxx:1573 AliITSAlignMille.cxx:1574 AliITSAlignMille.cxx:1575 AliITSAlignMille.cxx:1576 AliITSAlignMille.cxx:1577 AliITSAlignMille.cxx:1578 AliITSAlignMille.cxx:1579 AliITSAlignMille.cxx:1580 AliITSAlignMille.cxx:1581 AliITSAlignMille.cxx:1582 AliITSAlignMille.cxx:1583 AliITSAlignMille.cxx:1584 AliITSAlignMille.cxx:1585 AliITSAlignMille.cxx:1586 AliITSAlignMille.cxx:1587 AliITSAlignMille.cxx:1588 AliITSAlignMille.cxx:1589 AliITSAlignMille.cxx:1590 AliITSAlignMille.cxx:1591 AliITSAlignMille.cxx:1592 AliITSAlignMille.cxx:1593 AliITSAlignMille.cxx:1594 AliITSAlignMille.cxx:1595 AliITSAlignMille.cxx:1596 AliITSAlignMille.cxx:1597 AliITSAlignMille.cxx:1598 AliITSAlignMille.cxx:1599 AliITSAlignMille.cxx:1600 AliITSAlignMille.cxx:1601 AliITSAlignMille.cxx:1602 AliITSAlignMille.cxx:1603 AliITSAlignMille.cxx:1604 AliITSAlignMille.cxx:1605 AliITSAlignMille.cxx:1606 AliITSAlignMille.cxx:1607 AliITSAlignMille.cxx:1608 AliITSAlignMille.cxx:1609 AliITSAlignMille.cxx:1610 AliITSAlignMille.cxx:1611 AliITSAlignMille.cxx:1612 AliITSAlignMille.cxx:1613 AliITSAlignMille.cxx:1614 AliITSAlignMille.cxx:1615 AliITSAlignMille.cxx:1616 AliITSAlignMille.cxx:1617 AliITSAlignMille.cxx:1618 AliITSAlignMille.cxx:1619 AliITSAlignMille.cxx:1620 AliITSAlignMille.cxx:1621 AliITSAlignMille.cxx:1622 AliITSAlignMille.cxx:1623 AliITSAlignMille.cxx:1624 AliITSAlignMille.cxx:1625 AliITSAlignMille.cxx:1626 AliITSAlignMille.cxx:1627 AliITSAlignMille.cxx:1628 AliITSAlignMille.cxx:1629 AliITSAlignMille.cxx:1630 AliITSAlignMille.cxx:1631 AliITSAlignMille.cxx:1632 AliITSAlignMille.cxx:1633 AliITSAlignMille.cxx:1634 AliITSAlignMille.cxx:1635 AliITSAlignMille.cxx:1636 AliITSAlignMille.cxx:1637 AliITSAlignMille.cxx:1638 AliITSAlignMille.cxx:1639 AliITSAlignMille.cxx:1640 AliITSAlignMille.cxx:1641 AliITSAlignMille.cxx:1642 AliITSAlignMille.cxx:1643 AliITSAlignMille.cxx:1644 AliITSAlignMille.cxx:1645 AliITSAlignMille.cxx:1646 AliITSAlignMille.cxx:1647 AliITSAlignMille.cxx:1648 AliITSAlignMille.cxx:1649 AliITSAlignMille.cxx:1650 AliITSAlignMille.cxx:1651 AliITSAlignMille.cxx:1652 AliITSAlignMille.cxx:1653 AliITSAlignMille.cxx:1654 AliITSAlignMille.cxx:1655 AliITSAlignMille.cxx:1656 AliITSAlignMille.cxx:1657 AliITSAlignMille.cxx:1658 AliITSAlignMille.cxx:1659 AliITSAlignMille.cxx:1660 AliITSAlignMille.cxx:1661 AliITSAlignMille.cxx:1662 AliITSAlignMille.cxx:1663 AliITSAlignMille.cxx:1664 AliITSAlignMille.cxx:1665 AliITSAlignMille.cxx:1666 AliITSAlignMille.cxx:1667 AliITSAlignMille.cxx:1668 AliITSAlignMille.cxx:1669 AliITSAlignMille.cxx:1670 AliITSAlignMille.cxx:1671 AliITSAlignMille.cxx:1672 AliITSAlignMille.cxx:1673 AliITSAlignMille.cxx:1674 AliITSAlignMille.cxx:1675 AliITSAlignMille.cxx:1676 AliITSAlignMille.cxx:1677 AliITSAlignMille.cxx:1678 AliITSAlignMille.cxx:1679 AliITSAlignMille.cxx:1680 AliITSAlignMille.cxx:1681 AliITSAlignMille.cxx:1682 AliITSAlignMille.cxx:1683 AliITSAlignMille.cxx:1684 AliITSAlignMille.cxx:1685 AliITSAlignMille.cxx:1686 AliITSAlignMille.cxx:1687 AliITSAlignMille.cxx:1688 AliITSAlignMille.cxx:1689 AliITSAlignMille.cxx:1690 AliITSAlignMille.cxx:1691 AliITSAlignMille.cxx:1692 AliITSAlignMille.cxx:1693 AliITSAlignMille.cxx:1694 AliITSAlignMille.cxx:1695 AliITSAlignMille.cxx:1696 AliITSAlignMille.cxx:1697 AliITSAlignMille.cxx:1698 AliITSAlignMille.cxx:1699 AliITSAlignMille.cxx:1700 AliITSAlignMille.cxx:1701 AliITSAlignMille.cxx:1702 AliITSAlignMille.cxx:1703