3 #include <TStopwatch.h>
6 #include <TGeoManager.h>
7 #include "AliGeomManager.h"
8 #include "AliAlignmentTracks.h"
9 #include "AliTrackFitter.h"
10 #include "AliTrackFitterKalman.h"
11 #include "AliTrackFitterRieman.h"
12 #include "AliTrackResidualsFast.h"
13 #include "AliTrackResidualsChi2.h"
14 #include "AliTrackResidualsLinear.h"
17 void RealignmentITSIndependVol(TString minimizer="fast",const Int_t fit=0,const Int_t iter1=1,const Int_t iterations=5,const Int_t minNtracks=-10,const Int_t layer=0,const Int_t minTrackPoint=6,TString fileintro="AliTrackPoints.root",TString geometryfile="geometry.root"){
19 // minimizer="fast"->AliTrackResidualFast minimizer
20 // "minuit"->AliTrackResidualChi2 minimizer
21 // "minuitnorot"->AliTrackResidualChi2 minimizer without rotations degrees of freedom
22 // "linear"->AliTrackResidualLinear minimizer
23 //fit=0-> Riemann Fitter, fit=1->Kalman
24 //iter1=#iterations inside AliAlignmentTracks::AliAlignVolumes method
25 //iterations=#iterations of the entire procedure
26 //layer=0->all ITS, otherways the usual notation is considered (1=SPD1,2=SPD2,3=SDD1,4=SDD2,5=SSD1,6=SSD2)
27 //minNtracks=minimun number of tracks passing through a module in order to try to realign the module itsself
28 // if minNtracks<0, minimun number of tracks is |minNtracks|*minNumPoint[layer]/fact (see the code below): this allows a different
29 // choice of the number of tracks required on different layers and to vary these numbers once tuned the relative proportions.
30 //minTrackPoint=minimun number of "good" points required to a track (THE POINT ON THE MODULE THAT IS GOING TO BE REALIGNED
31 // IS NEVER CONSIDERED->max number can be required is 11 for cosmics tracks) for the track being considered in the minimization
32 //fileintro=file into which the Tree with the space points is stored
33 //geometryfile=file containing the geometry
36 TArrayI volIDs2(2200);
40 Int_t layerNum,modNum,iLayer,iLayerToAlign,j=0,size=0,lastVolid=0;
41 Int_t minNumPoint[6]={200,200,200,200,100,100};
43 TNtuple *ntVolumeAlign=new TNtuple("ntVolumeAlign","NTuple with volume tried to be realigned","layerNum:modNum:volumeIDnum");
46 AliAlignmentTracks *AliAlTrack=new AliAlignmentTracks();
48 AliAlTrack->SetPointsFilename(fileintro.Data());
50 AliTrackFitter *fitter;
51 if(fit==1)fitter= new AliTrackFitterKalman();
52 else fitter=new AliTrackFitterRieman();
54 fitter->SetMinNPoints(minTrackPoint);
56 AliAlTrack->SetTrackFitter(fitter);
59 AliTrackResiduals *res;
60 if(minimizer=="minuit"){
61 res = new AliTrackResidualsChi2();
63 else if(minimizer=="minuitnorot"){
64 res = new AliTrackResidualsChi2();
70 else if(minimizer=="fast"){
71 res = new AliTrackResidualsFast();
73 else if(minimizer=="linear"){
74 res = new AliTrackResidualsLinear();
78 printf("Trying to set a non existing minimizer! \n");
82 res->SetMinNPoints(1);
83 AliAlTrack->SetMinimizer(res);
85 if(!gGeoManager) TGeoManager::Import(geometryfile.Data());
88 TStopwatch *timer=new TStopwatch();
90 AliAlTrack->BuildIndex();
93 for(Int_t iter=0;iter<iterations;iter++){
94 for(iLayerToAlign=1;iLayerToAlign<=6;iLayerToAlign++){
95 if(layer!=0&&(Int_t)iLayerToAlign!=layer)continue;
98 for(Int_t k=1;k<=6;k++){
99 size+=(Int_t)AliGeomManager::LayerSize(k);
100 printf("size: %d \n",size);
104 for (Int_t iModule=0;iModule<AliGeomManager::LayerSize(iLayerToAlign);iModule++){
107 if(AliAlTrack->GetLastIndex(iLayerToAlign-1,iModule)<minNumPoint[iLayerToAlign-1]*(-1*minNtracks/fact))continue;
109 else if(AliAlTrack->GetLastIndex(iLayerToAlign-1,iModule)<minNtracks)continue;
111 UShort_t volidAl = AliGeomManager::LayerToVolUID(iLayerToAlign,iModule);
113 TArrayI volIDsFit(size-1);
114 for (iLayer=(Int_t)AliGeomManager::kSPD1;iLayer<(Int_t)AliGeomManager::kTPC1;iLayer++){
115 for (Int_t iModule2=0;iModule2<AliGeomManager::LayerSize(iLayer);iModule2++){
116 volid = AliGeomManager::LayerToVolUID(iLayer,iModule2);
117 if(volid==volidAl)continue;
118 volIDsFit.AddAt(volid,j);
122 volIDs.AddAt((Int_t)volidAl,0);
123 if(iter==iterations-1){
124 volIDs2.AddAt(volidAl,lastVolid);
127 AliAlTrack->AlignVolumes(&volIDs,&volIDsFit,AliGeomManager::kSPD1,AliGeomManager::kSSD2,iter1);
131 if((iter+1)%5==0||iter==0||iter==1||iter==2||iter==3||iter==iterations-1){
132 outname="RealignObj";
134 outname.Append(".root");
135 AliAlTrack->WriteRealignObjArray(outname.Data(),AliGeomManager::kSPD1,AliGeomManager::kSSD2);
139 if(lastVolid==0){printf("No modules could be realigned \n");return;}
140 printf("End of selecting modules cycle: %d modules selected \n",lastVolid);
141 for(Int_t k=0;k<volIDs2.GetSize();k++){
142 if(volIDs2.At(k)==0)break;
143 layerNum=AliGeomManager::VolUIDToLayer(volIDs2.At(k),modNum);
144 ntVolumeAlign->Fill(layerNum,modNum,volIDs2.At(k));
146 TFile *f=new TFile("RealignVolNt.root","RECREATE");
148 ntVolumeAlign->Write();