25 fitTofModYPos = kFALSE;
27 calcCellXOffset = kFALSE;
37 nCellsTot = nMetaModules*nCells;
57 trackSelecCutX = cutX;
58 trackSelecCutY = cutY;
59 if(trackSelecCutX > 0. && trackSelecCutY > 0.) filterFlag = kTRUE;
60 else filterFlag = kFALSE;
65 nt -> SetBranchAddress(
"s",&sec);
66 nt -> SetBranchAddress(
"x1s",&x1);
67 nt -> SetBranchAddress(
"y1s",&y1);
68 nt -> SetBranchAddress(
"z1s",&z1);
69 nt -> SetBranchAddress(
"x2s",&x2);
70 nt -> SetBranchAddress(
"y2s",&y2);
71 nt -> SetBranchAddress(
"z2s",&z2);
72 nt -> SetBranchAddress(
"metaMod",&metaModule);
73 nt -> SetBranchAddress(
"col",&metaColumn);
74 nt -> SetBranchAddress(
"cell",&metaCell);
75 nt -> SetBranchAddress(
"xMeta",&xMetaLocal);
76 nt -> SetBranchAddress(
"yMeta",&yMetaLocal);
77 nt -> SetBranchAddress(
"zMeta",&zMetaLocal);
78 nt -> SetBranchAddress(
"sigX",&xRMS);
79 nt -> SetBranchAddress(
"sigY",&yRMS);
80 nt -> SetBranchAddress(
"sigZ",&zRMS);
85 if(gMinuit != NULL)
delete gMinuit;
93 if(count%100 == 0) cout<<
"iter: "<<count<<
" function "<<fn<<
" "<<par[0]<<
" "<<par[1]<<
" "
94 <<par[2]<<
" "<<par[3]<<
" "<<par[4]<<
" "<<par[5]<< endl;
98 if(metaDetector<0 || metaDetector>2) {
99 Error(
"alignMeta",
"Meta detector type is not setted! Stop!");
109 for(Int_t im=0;im<nMetaModules;im++) {
110 transMetaModSecOld[im] = transMetaModLabOld[im];
111 transMetaModSecOld[im].
transTo(secLabTrans);
115 if(gMinuit == NULL) {
116 if(metaDetector == 0)
new TMinuit(6+8);
120 gMinuit->SetFCN(fcnMeta);
121 gMinuit->SetObjectFit(
this);
126 gMinuit->mnparm(0,
"x", 0., 1.,0,0,ierflg);
127 gMinuit->mnparm(1,
"y", 0., 1.,0,0,ierflg);
128 gMinuit->mnparm(2,
"z", 0., 1.,0,0,ierflg);
129 gMinuit->mnparm(3,
"alpha", 0., 0.1,0,0,ierflg);
130 gMinuit->mnparm(4,
"beta", 0., 0.1,0,0,ierflg);
131 gMinuit->mnparm(5,
"gamma", 0., 0.1,0,0,ierflg);
132 if(metaDetector != 1) {
133 gMinuit->FixParameter(0);
134 gMinuit->FixParameter(4);
135 if(metaDetector == 0) {
137 for(Int_t ip=0;ip<8;ip++) {
138 TString parName(
"Ymod");
140 gMinuit->mnparm(6+ip,parName.Data(),0.,1.,0,0,ierflg);
142 for(Int_t ip=0;ip<8;ip++) gMinuit->FixParameter(6+ip);
143 for(Int_t ip=0;ip<8;ip++) tofModYSh[ip] = 0.;
150 gMinuit->SetPrintLevel(1);
153 gMinuit->mnexcm(
"SET STR",arglist,1,ierflg);
157 for(Int_t i=0;i<5;i++) {
160 if(metaDetector == 1) selectTracks(i==0 ? 2. : 1.);
161 else calcXOffset(i==0 ? 2. : 1.);
164 if(i==0)
for(Int_t tr = 0; tr < nTracks; tr++) {
165 tracks[tr].xMinDistInit = tracks[tr].xMinDist;
166 tracks[tr].yMinDistInit = tracks[tr].yMinDist;
168 gMinuit->mnexcm(
"MINI",arglist,2,ierflg);
170 if(ierflg == 0)
break;
174 if(metaDetector == 0 && fitTofModYPos) {
175 printf(
" ------ Fit Yshifts --------------\n");
177 for(Int_t ip=0;ip<6;ip++) gMinuit->FixParameter(ip);
178 gMinuit->mnexcm(
"MINI",arglist,2,ierflg);
184 for(Int_t ip=0;ip<8;ip++) gMinuit->FixParameter(6+ip);
185 gMinuit->FixParameter(0);
186 gMinuit->FixParameter(4);
187 gMinuit->mnexcm(
"MINI",arglist,2,ierflg);
191 if(metaDetector != 1) {
196 for(Int_t im=0;im<nMetaModules;im++) {
197 transMetaModLabNew[im] = transMetaModSecNew[im];
198 transMetaModLabNew[im].transFrom(secLabTrans);
205 for(Int_t ip=0;ip<6;ip++) gMinuit->GetParameter(ip,out[ip],err);
206 if(metaDetector==0 && fitTofModYPos)
207 for(Int_t ip=0;ip<8;ip++) gMinuit->GetParameter(6+ip,tofModYSh[ip],err);
216 if(metaDetector == 0 && fitTofModYPos)
for(Int_t ip=0;ip<8;ip++) tofModYSh[ip] = par[6+ip];
222 for(Int_t c=0;c<nCellsTot;c++) {
226 Int_t nentries = nt->GetEntries();
229 for(Int_t i = 0; i < nentries; i++) {
231 if(sec != alignSec)
continue;
232 if(TMath::IsNaN(xMetaLocal+yMetaLocal+zMetaLocal)) {
233 printf(
"NaN!!! Entry %i: xMetaLocal=%f yMetaLocal=%f zMetaLocal=%f\n",
234 i,xMetaLocal,yMetaLocal,zMetaLocal);
241 t.
metaMod = Short_t(metaModule + 0.1);
242 t.
column = Short_t(metaColumn+0.1);
243 t.
cell = Short_t(metaCell+0.1);
247 t.
xMeta = xMetaLocal;
248 t.
yMeta = yMetaLocal;
249 t.
zMeta = zMetaLocal;
264 if(nTracks==0 || yMetaLocal<yMinMetaLocal) yMinMetaLocal = yMetaLocal;
265 if(nTracks==0 || yMetaLocal>yMaxMetaLocal) yMaxMetaLocal = yMetaLocal;
268 if(nTracks==1000000)
return;
270 if(metaDetector > 0) {
271 Double_t binSize = (yMaxMetaLocal-yMinMetaLocal)/8.;
272 for(Int_t tr = 0; tr < nTracks; tr++) {
279 for(Int_t tr = 0; tr < nTracks; tr++) {
290 for(Int_t tr = 0; tr < nTracks; tr++)
if(tracks[tr].useIt) {
291 dist += tracks[tr].minDist2*tracks[tr].wt;
298 for(Int_t im=0;im<nMetaModules;im++) {
299 transMetaModSecNew[im] = transMetaModSecOld[im];
300 transMetaModSecNew[im].transTo(trans);
301 if(metaDetector == 2 && xShitfRpc != 0.) {
305 shifterTrans.
transFrom(transMetaModSecNew[im]);
306 transMetaModSecNew[im] = shifterTrans;
308 if(metaDetector == 0 && fitTofModYPos && tofModYSh[im] != 0.) {
313 transMetaModSecNew[im] = trans;
317 for(Int_t tr = 0; tr < nTracks; tr++) {
322 point2.setZ(point2.getZ() - t.
zMeta);
323 Double_t diffZ = point2.getZ() - point1.getZ();
324 Double_t diffX = point2.getX() - point1.getX();
325 Double_t diffY = point2.getY() - point1.getY();
326 t.
xMinDist = (point1.getX()*diffZ - point1.getZ()*diffX)/diffZ - t.
xMeta;
327 t.
yMinDist = (point1.getY()*diffZ - point1.getZ()*diffY)/diffZ - t.
yMeta;
330 Double_t dYNr = t.
dYNorm();
332 if(metaDetector == 1) {
333 Double_t dXNr = t.
dXNorm();
341 for(Int_t i=0;i<8;i++) stat[i] = 0;
342 for(Int_t tr = 0; tr < nTracks; tr++) {
348 for(Int_t p=str;p<tr;p++)
if(tracks[p].useIt && t.
oneLay(tracks[p])) nTr++;
349 if(nTr == 1)
continue;
350 Double_t w = 1./Double_t(nTr);
352 for(Int_t p=str;p<tr;p++)
if(tracks[p].useIt && t.
oneLay(tracks[p])) tracks[p].wt = w;
356 Double_t statMax = 0.;
357 for(Int_t i=0;i<8;i++)
if(statMax < stat[i]) statMax = stat[i];
358 for(Int_t tr = 0; tr < nTracks; tr++) {
371 isFirstSIter = kTRUE;
372 while(selectTracksIter(nSigmasCut));
381 Bool_t doNextIter = kFALSE;
382 for(Int_t tr = 0; tr < nTracks; tr++) {
384 Double_t dXm = t.
dXNorm();
385 Double_t dYm = t.
dYNorm();
389 }
else if(TMath::Abs(dXm-meanX) <= sigmX*nSigmasCut &&
390 TMath::Abs(dYm-meanY) <= sigmY*nSigmasCut) {
391 if(!t.
useIt) doNextIter = kTRUE;
394 if(t.
useIt) doNextIter = kTRUE;
406 sigmX = TMath::Max(TMath::Sqrt(dX2M/nTr - meanX*meanX),trackSelecCutX);
407 sigmY = TMath::Max(TMath::Sqrt(dY2M/nTr - meanY*meanY),trackSelecCutY);
408 if(doNextIter) printf(
" * From %i tracks %i selected. <X>=%f sX=%f <Y>=%f sY=%f\n",
409 nTracks,nTr,meanX,sigmX,meanY,sigmY);
410 isFirstSIter = kFALSE;
416 if(metaDetector == 0) fileName +=
"Tof_S";
417 else if(metaDetector == 1) fileName +=
"Shower_S";
418 else if(metaDetector == 2) fileName +=
"Rpc_S";
419 fileName += alignSec;
422 TFile *f =
new TFile(fileName.Data(),
"recreate");
423 TNtuple *chnt =
new TNtuple(
"chnt",
"chnt",
424 "alignSec:wt:xMeta:yMeta:zMeta:dXold:dYold:dX:dY:sigX:sigY:chi2:mod:col:cell");
426 for(Int_t tr = 0; tr < nTracks; tr++) {
455 for(Short_t c=0;c<nCellsTot;c++) {
462 isFirstSIter = kTRUE;
463 if(cellStat[c] > 100) {
464 while(calcXOffset(nSigmasCut,c));
466 if(metaDetector==2 && calcCellXOffset) {
467 xShitfRpc += cellXCorr[c];
472 if(metaDetector==2 && calcCellXOffset ) {
473 if(nCellsC>0) xShitfRpc /= nCellsC;
474 printf(
"xShitf =%f nCells=%i !!!!!!!!!!!\n",xShitfRpc,nCellsC);
475 for(Short_t c=0;c<nCellsTot;c++) if(cellStat[c] > 100) cellXCorr[c] -= xShitfRpc;
484 Double_t xShift = 0.;
486 Bool_t doNextIter = kFALSE;
488 for(Int_t tr = 0; tr < nTracks; tr++) {
490 if(cellInd != t.
cellInd)
continue;
492 Double_t dXm = t.
dXNorm();
493 Double_t dYm = t.
dYNorm();
497 }
else if(TMath::Abs(dXm-meanX) <= sigmX*nSigmasCut &&
498 TMath::Abs(dYm-meanY) <= sigmY*nSigmasCut) {
499 if(!t.
useIt) doNextIter = kTRUE;
502 if(t.
useIt) doNextIter = kTRUE;
515 sigmX = TMath::Max(TMath::Sqrt(dX2M/nTr - meanX*meanX),trackSelecCutX);
516 sigmY = TMath::Max(TMath::Sqrt(dY2M/nTr - meanY*meanY),trackSelecCutY);
517 isFirstSIter = kFALSE;
519 cellXCorr[cellInd] += xShift/nTr;
520 printf(
" * %icolumn %2icell: From %i tracks %i selected. xOffset=%f\n",
521 cellInd/nCells,cellInd%nCells,nTot,nTr,cellXCorr[cellInd]);
HGeomTransform & getTransform()
HRuntimeDb * getRuntimeDb(void)
void setZ(const Double_t a)
TString fileName("be1834507002801.hld")
void setXYZ(const Double_t xx, const Double_t yy, const Double_t zz)
HParSet * getContainer(const Text_t *)
HGeomVolume * getSector(const Int_t n)
static void setTransform(Double_t *par, HGeomTransform &trans)