1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 Class for histogramming of cluster residuals
18 and fitting of the unlinearities. To be used only for data without
19 magnetic field. The laser tracks should be also rejected.
23 The track is fitted using linear and parabolic model
24 The edge clusters are removed from the fit.
25 Edge pad-row - first and last 15 padrows removed from the fit
27 Unlinearities fitting:
28 Unlinearities at the edge aproximated using two exponential decays.
31 dz = dz0(r,z) +dr(r,z)*tan(theta)
32 dy = +dr(r,z)*tan(phi)
40 #include "TLinearFitter.h"
42 #include "Riostream.h"
48 #include "THnSparse.h"
56 #include "TGraphErrors.h"
61 #include "AliTPCclusterMI.h"
62 #include "AliTPCseed.h"
63 #include "AliESDVertex.h"
64 #include "AliESDEvent.h"
65 #include "AliESDfriend.h"
66 #include "AliESDInputHandler.h"
67 #include "AliAnalysisManager.h"
68 #include "AliTracker.h"
70 #include "AliTPCCalROC.h"
75 #include "TTreeStream.h"
76 #include "AliTPCTracklet.h"
77 #include "TTimeStamp.h"
78 #include "AliTPCcalibDB.h"
79 #include "AliTPCcalibLaser.h"
80 #include "AliDCSSensorArray.h"
81 #include "AliDCSSensor.h"
82 #include "TLinearFitter.h"
83 #include "AliTPCClusterParam.h"
84 #include "TStatToolkit.h"
87 #include "AliTPCcalibUnlinearity.h"
89 AliTPCcalibUnlinearity* AliTPCcalibUnlinearity::fgInstance = 0;
91 ClassImp(AliTPCcalibUnlinearity)
93 AliTPCcalibUnlinearity::AliTPCcalibUnlinearity():
105 // Defualt constructor
109 AliTPCcalibUnlinearity::AliTPCcalibUnlinearity(const Text_t *name, const Text_t *title):
110 AliTPCcalibBase(name,title),
121 // Non default constructor
126 AliTPCcalibUnlinearity::~AliTPCcalibUnlinearity(){
130 if (fDiffHistoLine) delete fDiffHistoLine;
131 if (fDiffHistoPar) delete fDiffHistoPar;
135 AliTPCcalibUnlinearity* AliTPCcalibUnlinearity::Instance()
138 // Singleton implementation
139 // Returns an instance of this class, it is created if neccessary
141 if (fgInstance == 0){
142 fgInstance = new AliTPCcalibUnlinearity();
150 void AliTPCcalibUnlinearity::Process(AliTPCseed *seed) {
154 const Int_t kdrow=10;
155 const Int_t kMinCluster=35;
156 if (!fDiffHistoLine) MakeHisto();
158 if (TMath::Abs(fMagF)>0.01) return; // use only data without field
160 for (Int_t i=0;i<72;i++) counter[i]=0;
161 for (Int_t irow=kdrow;irow<159-kdrow;irow++) {
162 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow);
163 if (!cluster) continue;
164 if (cluster->GetType()<0) continue;
165 counter[cluster->GetDetector()]++;
168 for (Int_t is=0; is<72;is++){
169 if (counter[is]>kMinCluster) ProcessDiff(seed, is);
174 void AliTPCcalibUnlinearity::ProcessDiff(AliTPCseed *track, Int_t isec){
176 // process differnce of the cluster in respect with linear and parabolic fit
178 const Double_t kXmean=134;
179 const Int_t kdrow=10;
180 static TLinearFitter fy1(2,"pol1");
181 static TLinearFitter fy2(3,"pol2");
182 static TLinearFitter fz1(2,"pol1");
183 static TLinearFitter fz2(3,"pol2");
185 static TVectorD py1(2);
186 static TVectorD py2(3);
187 static TVectorD pz1(2);
188 static TVectorD pz2(3);
195 for (Int_t irow=kdrow;irow<159-kdrow;irow++) {
196 AliTPCclusterMI *c=track->GetClusterPointer(irow);
198 if (c->GetDetector()!=isec) continue;
199 if (c->GetType()<0) continue;
200 Double_t dx = c->GetX()-kXmean;
201 Double_t x[2]={dx, dx*dx};
202 fy1.AddPoint(x,c->GetY());
203 fy2.AddPoint(x,c->GetY());
204 fz1.AddPoint(x,c->GetZ());
205 fz2.AddPoint(x,c->GetZ());
207 fy1.Eval(); fy1.GetParameters(py1);
208 fy2.Eval(); fy2.GetParameters(py2);
209 fz1.Eval(); fz1.GetParameters(pz1);
210 fz2.Eval(); fz2.GetParameters(pz2);
213 for (Int_t irow=0;irow<159;irow++) {
214 AliTPCclusterMI *c=track->GetClusterPointer(irow);
216 if (c->GetDetector()!=isec) continue;
217 if (c->GetType()<0) continue;
218 Double_t dx = c->GetX()-kXmean;
219 Double_t y1 = py1[0]+py1[1]*dx;
220 Double_t y2 = py2[0]+py2[1]*dx+py2[2]*dx*dx;
222 Double_t z1 = pz1[0]+pz1[1]*dx;
223 Double_t z2 = pz2[0]+pz2[1]*dx+pz2[2]*dx*dx;
233 x[6]=py2[2]*150*150/4; // sagita 150 cm
237 fDiffHistoLine->Fill(x);
240 fDiffHistoPar->Fill(x);
242 if (TMath::Abs(py2[2]*150*150/4)<1 && TMath::Abs(pz2[2]*150*150/4)<1){
244 AddPoint(isec,irow,c->GetZ()-z1, c->GetY()-y1,
245 py1[1],pz1[1],1-TMath::Abs(c->GetZ()/250.),1);
249 TTreeSRedirector *cstream = GetDebugStreamer();
252 "run="<<fRun<< // run number
253 "event="<<fEvent<< // event number
254 "time="<<fTime<< // time stamp of event
255 "trigger="<<fTrigger<< // trigger
256 "mag="<<fMagF<< // magnetic field
274 void AliTPCcalibUnlinearity::MakeHisto(){
278 TString axisName[10];
279 Double_t xmin[10], xmax[10];
283 axisName[0]="sector";
284 xmin[0]=0; xmax[0]=72; nbins[0]=72;
287 xmin[1]=0; xmax[1]=159; nbins[1]=159;
290 xmin[2]=-50; xmax[2]=50; nbins[2]=10;
293 xmin[3]=-250; xmax[3]=250; nbins[3]=50;
296 xmin[4]=-0.6; xmax[4]=0.6; nbins[4]=12;
299 xmin[5]=-0.6; xmax[5]=0.6; nbins[5]=12;
302 xmin[6]=-2; xmax[6]=2; nbins[6]=20;
305 xmin[7]=-0.5; xmax[7]=0.5; nbins[7]=100;
308 xmin[8]=-0.5; xmax[8]=0.5; nbins[8]=100;
310 fDiffHistoLine = new THnSparseF("DistHistoLine","DistHistoLine",9,nbins,xmin,xmax);
311 fDiffHistoPar = new THnSparseF("DistHistoPar","DistHistoPar",9,nbins,xmin,xmax);
312 for (Int_t i=0; i<9;i++){
313 fDiffHistoLine->GetAxis(i)->SetName(axisName[i].Data());
314 fDiffHistoPar->GetAxis(i)->SetName(axisName[i].Data());
315 fDiffHistoLine->GetAxis(i)->SetTitle(axisName[i].Data());
316 fDiffHistoPar->GetAxis(i)->SetTitle(axisName[i].Data());
321 void AliTPCcalibUnlinearity::Terminate(){
323 // Terminate function
324 // call base terminate + Eval of fitters
326 Info("AliTPCcalibUnlinearities","Terminate");
329 AliTPCcalibBase::Terminate();
333 void AliTPCcalibUnlinearity::DumpTree(){
337 if (fStreamLevel==0) return;
338 TTreeSRedirector *cstream = GetDebugStreamer();
339 if (!cstream) return;
342 Double_t position[10];
344 Int_t *bins = new Int_t[10];
346 for (Int_t ihis=0; ihis<2; ihis++){
347 his = (ihis==0)? fDiffHistoLine:fDiffHistoPar;
350 Int_t ndim = his->GetNdimensions();
352 for (Long64_t i = 0; i < his->GetNbins(); ++i) {
353 value = his->GetBinContent(i, bins);
354 for (Int_t idim = 0; idim < ndim; idim++) {
355 position[idim] = his->GetAxis(idim)->GetBinCenter(bins[idim]);
357 (*cstream)<<"Resol"<<
360 for (Int_t idim=0;idim<ndim;idim++){
361 (*cstream)<<"Resol"<<Form("%s=", his->GetAxis(idim)->GetName())<<position[idim];
363 (*cstream)<<"Resol"<<
370 void AliTPCcalibUnlinearity::AddPoint(Int_t sector, Int_t row, Double_t dz, Double_t dy, Double_t p2, Double_t p3, Double_t dr, Int_t npoints){
373 // Simple distortion fit in outer sectors
375 // Model - 2 exponential decay toward the center of chamber
376 // - Decay length 10 and 5 cm
377 // - Decay amplitude - Z dependent
380 chainUnlin->SetAlias("side","(-1+((sector%36)<18)*2)");
381 chainUnlin->SetAlias("sa","sin(pi*sector*20/180)");
382 chainUnlin->SetAlias("ca","cos(pi*sector*20/180)");
383 chainUnlin->SetAlias("dzt","dz*side");
384 chainUnlin->SetAlias("dr","(1-abs(lz/250))");
385 chainUnlin->SetAlias("dout","(159-row)*1.5");
386 chainUnlin->SetAlias("din","row*0.75");
387 chainUnlin->SetAlias("eout10","exp(-(dout)/10.)");
388 chainUnlin->SetAlias("eout5","exp(-(dout)/5.)");
391 Double_t side = (-1+((sector%36)<18)*2); // A side +1 C side -1
392 Double_t dzt = dz*side;
393 Double_t dout = (159-row)*1.5; // distance to the last pad row - (valid only for long pads)
394 if (dout>30) return; // use only edge pad rows
395 dr-=0.5; // dr shifted to the middle - reduce numerical instabilities
397 Double_t eout10 = TMath::Exp(-dout/10.);
398 Double_t eout5 = TMath::Exp(-dout/5.);
400 Double_t eoutp = (eout10+eout5)*0.5;
401 Double_t eoutm = (eout10-eout5)*0.5;
404 Double_t xxxR[6], xxxZ[6], xxxRZ[6];
405 //TString fstring="";
406 xxxZ[0]=eoutp; //fstring+="eoutp++";
407 xxxZ[1]=eoutm; //fstring+="eoutm++";
408 xxxZ[2]=dr*eoutp; //fstring+="dr*eoutp++";
409 xxxZ[3]=dr*eoutm; //fstring+="dr*eoutm++";
410 xxxZ[4]=dr*dr*eoutp; //fstring+="dr*dr*eoutp++";
411 xxxZ[5]=dr*dr*eoutm; //fstring+="dr*dr*eoutm++";
413 xxxR[0]=p2*eoutp; //fstring+="eoutp++";
414 xxxR[1]=p2*eoutm; //fstring+="eoutm++";
415 xxxR[2]=p2*dr*eoutp; //fstring+="dr*eoutp++";
416 xxxR[3]=p2*dr*eoutm; //fstring+="dr*eoutm++";
417 xxxR[4]=p2*dr*dr*eoutp; //fstring+="dr*dr*eoutp++";
418 xxxR[5]=p2*dr*dr*eoutm; //fstring+="dr*dr*eoutm++";
420 xxxRZ[0]=p3*eoutp; //fstring+="eoutp++";
421 xxxRZ[1]=p3*eoutm; //fstring+="eoutm++";
422 xxxRZ[2]=p3*dr*eoutp; //fstring+="dr*eoutp++";
423 xxxRZ[3]=p3*dr*eoutm; //fstring+="dr*eoutm++";
424 xxxRZ[4]=p3*dr*dr*eoutp; //fstring+="dr*dr*eoutp++";
425 xxxRZ[5]=p3*dr*dr*eoutm; //fstring+="dr*dr*eoutm++";
427 TLinearFitter * fitter=0;
429 for (Int_t ip=0; ip<npoints; ip++){
431 fitter = (TLinearFitter*)fFittersOutR.At(sector%36);
432 fitter->AddPoint(xxxR,dy,err);
433 //fitter->AddPoint(xxxRZ,dz);
434 fitter = (TLinearFitter*)fFittersOutZ.At(sector%36);
435 fitter->AddPoint(xxxZ,dzt,err);
438 fitter = (TLinearFitter*)fFittersOutR.At(36);
439 fitter->AddPoint(xxxR,dy,err);
440 //fitter->AddPoint(xxxRZ,dz);
441 fitter = (TLinearFitter*)fFittersOutZ.At(36);
442 fitter->AddPoint(xxxZ,dzt,err);
445 fitter = (TLinearFitter*)fFittersOutR.At(37);
446 fitter->AddPoint(xxxR,dy,err);
447 //fitter->AddPoint(xxxRZ,dz);
448 fitter = (TLinearFitter*)fFittersOutZ.At(37);
449 fitter->AddPoint(xxxZ,dzt,err);
455 void AliTPCcalibUnlinearity::MakeFitters(){
459 // Make outer fitters
460 TLinearFitter * fitter = 0;
461 for (Int_t ifit=0; ifit<38; ifit++){
462 fitter = new TLinearFitter(7,"hyp6");
463 fitter->StoreData(kFALSE);
464 fFittersOutR.AddAt(fitter,ifit);
465 fitter = new TLinearFitter(7,"hyp6");
466 fitter->StoreData(kFALSE);
467 fFittersOutZ.AddAt(fitter,ifit);
471 void AliTPCcalibUnlinearity::EvalFitters(){
476 TLinearFitter * fitter = 0;
478 for (Int_t ifit=0; ifit<38; ifit++){
479 fitter=(TLinearFitter*)fFittersOutR.At(ifit);
482 fitter->GetParameters(vec);
483 fParamsOutR.AddAt(vec.Clone(),ifit);
484 fitter->GetErrors(vec);
485 fErrorsOutR.AddAt(vec.Clone(),ifit);
487 fitter=(TLinearFitter*)fFittersOutZ.At(ifit);
490 fitter->GetParameters(vec);
491 fParamsOutZ.AddAt(vec.Clone(),ifit);
492 fitter->GetErrors(vec);
493 fErrorsOutZ.AddAt(vec.Clone(),ifit);
498 Double_t AliTPCcalibUnlinearity::GetDr(Int_t sector, Double_t dout, Double_t dr){
502 TVectorD * vec = GetParamOutR(sector);
504 dr-=0.5; // dr=0 at the middle drift length
505 Double_t eout10 = TMath::Exp(-dout/10.);
506 Double_t eout5 = TMath::Exp(-dout/5.);
507 Double_t eoutp = (eout10+eout5)*0.5;
508 Double_t eoutm = (eout10-eout5)*0.5;
511 result+=(*vec)[1]*eoutp;
512 result+=(*vec)[2]*eoutm;
513 result+=(*vec)[3]*eoutp*dr;
514 result+=(*vec)[4]*eoutm*dr;
515 result+=(*vec)[5]*eoutp*dr*dr;
516 result+=(*vec)[6]*eoutm*dr*dr;
521 Double_t AliTPCcalibUnlinearity::GetGDr(Int_t stype,Float_t gx, Float_t gy,Float_t gz){
525 Double_t alpha = TMath::ATan2(gy,gx);
526 if (alpha<0) alpha+=TMath::Pi()*2;
527 Int_t lsector = Int_t(18*alpha/(TMath::Pi()*2));
528 alpha = (lsector+0.5)*TMath::Pi()/9.;
532 Double_t cs=TMath::Cos(-alpha), sn=TMath::Sin(-alpha), x=r[0];
533 r[0]=x*cs - r[1]*sn; r[1]=x*sn + r[1]*cs;
535 AliTPCROC * roc = AliTPCROC::Instance();
536 Double_t xout = roc->GetPadRowRadiiUp(roc->GetNRows(37)-1);
537 Double_t dout = xout-r[0];
538 if (dout<0) return 0;
539 Double_t dr = 1-TMath::Abs(gz/250.);
540 if (gz<0) lsector+=18;
541 if (stype==0) lsector = (gz>0) ? 36:37;
542 if (stype<0) return lsector; //
543 return GetDr(lsector,dout,dr);
547 Double_t AliTPCcalibUnlinearity::GetDz(Int_t sector, Double_t dout, Double_t dr){
551 TVectorD * vec = GetParamOutZ(sector);
553 dr-=0.5; // 0 at the middle
554 Double_t eout10 = TMath::Exp(-dout/10.);
555 Double_t eout5 = TMath::Exp(-dout/5.);
556 Double_t eoutp = (eout10+eout5)*0.5;
557 Double_t eoutm = (eout10-eout5)*0.5;
561 result+=(*vec)[1]*eoutp;
562 result+=(*vec)[2]*eoutm;
563 result+=(*vec)[3]*eoutp*dr;
564 result+=(*vec)[4]*eoutm*dr;
565 result+=(*vec)[5]*eoutp*dr*dr;
566 result+=(*vec)[6]*eoutm*dr*dr;
571 Double_t AliTPCcalibUnlinearity::SGetDr(Int_t sector, Double_t dout, Double_t dr){
575 return fgInstance->GetDr(sector,dout,dr);
577 Double_t AliTPCcalibUnlinearity::SGetGDr(Int_t stype,Float_t gx, Float_t gy,Float_t gz){
581 return fgInstance->GetGDr(stype,gx,gy,gz);
583 Double_t AliTPCcalibUnlinearity::SGetDz(Int_t sector, Double_t dout, Double_t dr){
587 return fgInstance->GetDz(sector,dout,dr);
593 void AliTPCcalibUnlinearity::ProcessTree(TTree * tree, Long64_t nmaxPoints){
597 // TTree * tree = chainUnlinP;
598 AliTPCcalibUnlinearity *calib = this;
600 AliTPCclusterMI * cl=0;
602 TVectorD *vy=0, *vz=0;
603 TVectorD *vy2=0, *vz2=0;
604 Long64_t nentries = tree->GetEntries();
605 if (nmaxPoints>0) nentries = TMath::Min(nentries,nmaxPoints);
608 for (Long64_t i=0; i<nentries; i++){
609 tree->SetBranchAddress("Cl.",&cl);
610 tree->SetBranchAddress("y1",&ty);
611 tree->SetBranchAddress("z1",&tz);
612 tree->SetBranchAddress("py1.",&vy);
613 tree->SetBranchAddress("pz1.",&vz);
614 tree->SetBranchAddress("py2.",&vy2);
615 tree->SetBranchAddress("pz2.",&vz2);
619 if (i%10000==0) printf("%d\n",(Int_t)i);
620 Int_t row= cl->GetRow();
621 if (cl->GetDetector()>36) row+=64;
622 if (cl->GetType()<0) continue;
623 Double_t dy = cl->GetY()-ty;
624 Double_t dz = cl->GetZ()-tz;
625 Double_t dr = 1-TMath::Abs(cl->GetZ()/250);
628 if (TMath::Abs(dy)>0.25) continue;
629 if (TMath::Abs(dz)>0.25) continue;
631 if (TMath::Abs((*vy2)[2]*150*150/4)>1) continue;
632 if (TMath::Abs((*vz2)[2]*150*150/4)>1) continue;
634 calib->AddPoint(cl->GetDetector(), row, dz, dy,
635 (*vy)[1],(*vz)[1], dr, 1);
641 void AliTPCcalibUnlinearity::MakeQPosNormAll(TTree * chainUnlinD, AliTPCClusterParam * param, Int_t maxPoints){
643 // Make position corrections
644 // for the moment Only using debug streamer
645 // chainUnlinD - debug tree
646 // param - parameters to be updated
647 // maxPoints - maximal number of points using for fit
648 // verbose - print info flag
650 // Current implementation - only using debug streamers
655 Int_t maxPoints=100000;
660 gSystem->Load("libANALYSIS");
661 gSystem->Load("libSTAT");
662 gSystem->Load("libTPCcalib");
665 //1. Load Parameters to be modified:
668 AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
669 AliCDBManager::Instance()->SetRun(0)
670 AliTPCClusterParam * param = AliTPCcalibDB::Instance()->GetClusterParam();
672 //2. Load the debug streamer
673 gSystem->AddIncludePath("-I$ALICE_ROOT/TPC/macros");
674 gROOT->LoadMacro("$ALICE_ROOT/TPC/macros/AliXRDPROOFtoolkit.cxx+")
675 AliXRDPROOFtoolkit tool;
676 TChain * chainUnlin = tool.MakeChain("unlin.txt","Resol",0,10200);
677 chainUnlin->Lookup();
678 TChain * chainUnlinD = tool.MakeChain("unlin.txt","Diff",0,10200);
679 chainUnlinD->Lookup();
681 //3. Do fits and store results
683 AliTPCcalibUnlinearity::MakeQPosNormAll(chainUnlinD,param,200000,0) ;
684 TFile f("paramout.root","recreate");
685 param->Write("clusterParam");
688 TFile f2("paramout.root");
689 AliTPCClusterParam *param2 = (AliTPCClusterParam*)f2.Get("clusterParam");
690 param2->SetInstance(param2);
691 chainUnlinD->Draw("fitZ0:AliTPCClusterParam::SPosCorrection(1,0,Cl.fPad,Cl.fTimeBin,Cl.fZ,Cl.fSigmaY2,Cl.fSigmaZ2,Cl.fMax)","Cl.fDetector<36","",10000); // should be line
696 TStatToolkit toolkit;
705 chainUnlinD->SetAlias("dp","(-1+(Cl.fZ>0)*2)*((Cl.fPad-int(Cl.fPad))-0.5)");
706 chainUnlinD->SetAlias("dt","(-1+(Cl.fZ>0)*2)*((Cl.fTimeBin-0.66-int(Cl.fTimeBin-0.66))-0.5)");
707 chainUnlinD->SetAlias("sp","(sin(dp*pi)-dp*pi)");
708 chainUnlinD->SetAlias("st","(sin(dt)-dt)");
709 chainUnlinD->SetAlias("dq","(-1+(Cl.fZ>0)*2)/Cl.fMax");
711 chainUnlinD->SetAlias("di","sqrt(1.-abs(Cl.fZ/250.))");
715 TCut cutE("Cl.fType>=0");
716 TCut cutDy("abs(Cl.fY-y1)<0.4");
717 TCut cutDz("abs(Cl.fZ-z1)<0.4");
718 TCut cutY2("abs(py2.fElements[2])*150^2/4<1");
719 TCut cutZ2("abs(pz2.fElements[2])*150^2/4<1");
720 TCut cutAll = cutE+cutDy+cutDz+cutY2+cutZ2;
722 TCut cutA("Cl.fZ>0");
723 TCut cutC("Cl.fZ<0");
727 fstringY+="(dp)++"; //1
728 fstringY+="(dp)*di++"; //2
729 fstringY+="(sp)++"; //3
730 fstringY+="(sp)*di++"; //4
731 fstringY+="(dq)++"; //5
733 fstringZ+="(dt)++"; //1
734 fstringZ+="(dt)*di++"; //2
735 fstringZ+="(st)++"; //3
736 fstringZ+="(st)*di++"; //4
737 fstringZ+="(dq)++"; //5
741 TString *strZ0 = toolkit.FitPlane(chainUnlinD,"(Cl.fZ-z2):1",fstringZ.Data(), "Cl.fDetector<36"+cutAll, chi2,npoints,fitParamZ0,covMatrix,-1,0,maxPoints);
742 printf("Z0 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
743 strZ0->Tokenize("++")->Print();
744 param->fPosZcor[0] = (TVectorD*) fitParamZ0.Clone();
746 TString *strZ1 = toolkit.FitPlane(chainUnlinD,"(Cl.fZ-z2):1",fstringZ.Data(), "Cl.fDetector>36"+cutAll, chi2,npoints,fitParamZ1,covMatrix,-1,0,maxPoints);
748 printf("Z1 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
749 strZ1->Tokenize("++")->Print();
750 param->fPosZcor[1] = (TVectorD*) fitParamZ1.Clone();
751 param->fPosZcor[2] = (TVectorD*) fitParamZ1.Clone();
755 TString *strY0 = toolkit.FitPlane(chainUnlinD,"(Cl.fY-y2):1",fstringY.Data(), "Cl.fDetector<36"+cutAll, chi2,npoints,fitParamY0,covMatrix,-1,0,maxPoints);
756 printf("Y0 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
757 strY0->Tokenize("++")->Print();
758 param->fPosYcor[0] = (TVectorD*) fitParamY0.Clone();
761 TString *strY1 = toolkit.FitPlane(chainUnlinD,"(Cl.fY-y2):1",fstringY.Data(), "Cl.fDetector>36"+cutAll, chi2,npoints,fitParamY1,covMatrix,-1,0,maxPoints);
763 printf("Y1 - chi2/npoints = %f\n",TMath::Sqrt(chi2/npoints));
764 strY1->Tokenize("++")->Print();
765 param->fPosYcor[1] = (TVectorD*) fitParamY1.Clone();
766 param->fPosYcor[2] = (TVectorD*) fitParamY1.Clone();
770 chainUnlinD->SetAlias("fitZ0",strZ0->Data());
771 chainUnlinD->SetAlias("fitZ1",strZ1->Data());
772 chainUnlinD->SetAlias("fitY0",strY0->Data());
773 chainUnlinD->SetAlias("fitY1",strY1->Data());