using namespace std;
# include <math.h>
# include <stdlib.h>
# include <iostream>
# include <iomanip>
# include <fstream>
# include <TMath.h>
# include <TROOT.h>
# include <TF1.h>
# include "hmdcaligner.h"
# include "hades.h"
# include "hdetector.h"
# include "hmdcdetector.h"
# include "hmdcmodulegeometry.h"
# include "hmdcgeomstruct.h"
# include "hevent.h"
# include "hmatrixcategory.h"
# include "hmatrixcatiter.h"
# include "hmdchit.h"
# include "hmdchitaux.h"
# include "hruntimedb.h"
# include "hspectrometer.h"
# include "mdcsdef.h"
ClassImp(HMdcAligner)
Int_t HMdcAligner::fRecCount=0;
TFile* HMdcAligner::fOutRoot=0;
Int_t A_DEBUG=0;
Double_t breitW(Double_t *x, Double_t *par)
{
Double_t fitval = par[0]*(1/(2*TMath::Pi())) *
( par[2]/((par[2]*par[2]/4)+(x[0]-par[1])*(x[0]-par[1])) );
return fitval;
}
HMdcAligner::HMdcAligner(void) : HReconstructor()
{
fLoc.setNIndex(5);
fHits = new TClonesArray("HMdcHit",4);
fLoc.set(5,0,0,1,2,3);
fNumMods = 4;
initDefaults();
}
HMdcAligner::HMdcAligner(Int_t sector, Int_t modA, Int_t modB)
: HReconstructor()
{
fLoc.setNIndex(3);
fHits = new TClonesArray("HMdcHit",2);
fLoc.set(3,sector,modA,modB);
fNumMods = 2;
initDefaults();
}
HMdcAligner::HMdcAligner(const Text_t* name,const Text_t* title, Int_t sector,
Int_t modA, Int_t modB, Int_t modC, Int_t modD)
: HReconstructor(name, title)
{
if(modC == -1) {
fHits=new TClonesArray("HMdcHit",2);
fLoc.setNIndex(3);
fLoc.set(3,sector,modA,modB);
fNumMods = 2;
}
else if(modD == -1){
fHits=new TClonesArray("HMdcHit",3);
fLoc.setNIndex(4);
fLoc.set(4,sector,modA,modB,modC);
fNumMods = 3;
}
else {
fHits=new TClonesArray("HMdcHit",4);
fLoc.setNIndex(5);
fLoc.set(5,sector,modA,modB,modC,modD);
fNumMods = 4;
}
initDefaults();
}
HMdcAligner::HMdcAligner(const Text_t* name,const Text_t* title,
Int_t sector, Int_t modA)
: HReconstructor(name, title)
{
fHits=new TClonesArray("HMdcHit",1);
fLoc.setNIndex(2);
fLoc.set(2,sector,modA);
fNumMods = 1;
fConstTukey = 10;
Char_t title1[50], tmp[50];
sprintf(title1,"%s%i%s%i","Sector_",sector,"_ModA_",modA);
sprintf(tmp,"%s%s%i%s%i","All","_Sector_",sector,"_ModA_",modA);
fAlignAll = new TTree(tmp,title1);
fAlignAll->Branch("hits",&fHits);
}
void HMdcAligner::initDefaults(void)
{
fRotMat = new HGeomRotation[fNumMods-1];
fTranslation = new HGeomVector[fNumMods-1];
fEuler = new HGeomVector[fNumMods-1];
fError = new Double_t[(fNumMods-1)*6];
fDiscart = new Int_t[fNumMods-1];
fHitsMdc = new Int_t[fNumMods];
fHitsFoundInWindow = new Int_t[fNumMods-1];
fHitsFoundAndUnique = new Int_t[fNumMods-1];
zones_X = new Float_t[9];
zones_Y = new Float_t[9];
zones_DX = new Float_t[9];
zones_DY = new Float_t[9];
resZon_X = new Float_t[9];
resZon_Y = new Float_t[9];
for(Int_t n=0;n<9;n++){
zones_X[n]=0.;
zones_Y[n]=0.;
zones_DX[n]=0.;
zones_DY[n]=0.;
resZon_X[n]=0.;
resZon_Y[n]=0.;
}
setZones();
fNEntries = 0;
fCount = 0;
fCountCut = 0;
fCloseToSolution = kFALSE;
fAuto = kFALSE;
fHistoOff = kFALSE;
fUseUnitErrors = kFALSE;
fUseModErrors = kFALSE;
fDoNotUseCov = kFALSE;
fUseSharpCut = kFALSE;
fUseCut = kTRUE;
fUseCutRot = kFALSE;
fUseCutRotZ = kFALSE;
fUseSlopeCut = kFALSE;
fUseTarget = kFALSE;
fUseZones = kTRUE;
fSetHomogeneousDistribution = kFALSE;
fMaxEntriesPerZone = 1000;
fEntriesPerZone = new Int_t[90];
for(Int_t zo=0;zo<90;zo++) fEntriesPerZone[zo] = 0;
for(Int_t num=0;num<fNumMods-1;num++){
fDiscart[num]=0;
fHitsMdc[num]=0;
fHitsFoundInWindow[num]=0;
fHitsFoundAndUnique[num]=0;
fHitsMdc[num+1]=0;
}
if(fLoc[2] == 1){
if(fLoc[1] == 0){
fSigmaX = 0.400;fSigmaY = 0.300;fSigmaS0 = 0.008;fSigmaS1 = 0.005;
fRhoxSx = -0.17;fRhoySy = -0.22;fRhoxSy = 0.00;
}
else if(fLoc[1] == 2){
fSigmaX = 0.400;fSigmaY = 0.300;fSigmaS0 = 0.008;fSigmaS1 = 0.005;
fRhoxSx = 0.23;fRhoySy = 0.23;fRhoxSy = 0.01;
}
else if(fLoc[1] == 3){
fSigmaX = 0.400;fSigmaY = 0.300;fSigmaS0 = 0.008;fSigmaS1 = 0.005;
fRhoxSx = 0.29;fRhoySy = 0.27;fRhoxSy = 0.00;
}
}
fMin = 0;
fFix = 0;
fXArea = 100;
fYArea = 100;
fSArea = 1;
fXSigmas = 1.64;
fYSigmas = 1.64;
fS0Sigmas = 1.64;
fS1Sigmas = 1.64;
fSlopeCut = 0.1;
fHistNum = 4;
fHistZonNum = 4;
fHitCat = NULL;
fOutRoot = NULL;
initMinimization();
}
HMdcAligner::~HMdcAligner(void)
{
delete[] fRotMat;
delete[] fTranslation;
delete[] fEuler;
delete[] fError;
delete[] fDiscart;
delete[] fHitsMdc;
delete[] fHitsFoundInWindow;
delete[] fHitsFoundAndUnique;
delete fHits;
}
void HMdcAligner::initMinimization(void){
fIterCriteria = 0.01;
fWeights = new Float_t[4];
fSteps = new Float_t[18];
fLimits = new Float_t[18];
fPosError = new Float_t[8];
setWeights(400,160,0.004,0.003);
setSteps(0.01,0.01,0.01,0.1,0.1,0.1,
0.01,0.01,0.01,0.1,0.1,0.1,
0.01,0.01,0.01,0.1,0.1,0.1);
setLimits(0.,0.,0.,0.,0.,0.,
0.,0.,0.,0.,0.,0.,
0.,0.,0.,0.,0.,0.);
}
Int_t HMdcAligner::getRelParams(HGeomVector*& ang,HGeomVector*& tra)
{
ang = fEuler;
tra = fTranslation;
return 0;
}
void HMdcAligner::setOutputAscii(TString name)
{
fNameAscii=name;
}
void HMdcAligner::setOutputRoot(TString name)
{
fNameRoot=name;
}
void HMdcAligner::setSigmas(Float_t XSigmas, Float_t YSigmas,
Float_t S0Sigmas, Float_t S1Sigmas)
{
fXSigmas = XSigmas;
fYSigmas = YSigmas;
fS0Sigmas = S0Sigmas;
fS1Sigmas = S1Sigmas;
}
void HMdcAligner::setTukeyConstant(Float_t cte)
{
fConstTukey = cte;
}
HGeomVector HMdcAligner::getLocalTarget(HGeomRotation rot,HGeomVector tran)
{
HGeomVector target = rot.inverse()*
(fTargetPos-tran);
return target;
}
void HMdcAligner::setZones(Float_t* X, Float_t* Y,
Float_t* DX, Float_t* DY)
{
if(X==0){
if(fLoc[1]==0){
zones_X[0]=-100; zones_X[1]=0; zones_X[2]=100;
zones_X[3]=-100; zones_X[4]=0; zones_X[5]=100;
zones_X[6]=-100; zones_X[7]=0; zones_X[8]=100;
zones_Y[0]=100; zones_Y[1]=100; zones_Y[2]=100;
zones_Y[3]=0; zones_Y[4]=0; zones_Y[5]=0 ;
zones_Y[6]=-100; zones_Y[7]=-100; zones_Y[8]=-100;
zones_DX[0]=100; zones_DX[1]=100; zones_DX[2]=100;
zones_DX[3]=75; zones_DX[4]=75; zones_DX[5]=75;
zones_DX[6]=50; zones_DX[7]=50; zones_DX[8]=50;
zones_DY[0]=100; zones_DY[1]=100; zones_DY[2]=100;
zones_DY[3]=75; zones_DY[4]=75; zones_DY[5]=75;
zones_DY[6]=50; zones_DY[7]=50; zones_DY[8]=50;
}
if(fLoc[1]==1){
zones_X[0]=-200; zones_X[1]=0; zones_X[2]=200;
zones_X[3]=-200; zones_X[4]=0; zones_X[5]=200;
zones_X[6]=-200; zones_X[7]=0; zones_X[8]=200;
zones_Y[0]=200; zones_Y[1]=200; zones_Y[2]=200;
zones_Y[3]=0; zones_Y[4]=0; zones_Y[5]=0 ;
zones_Y[6]=-200; zones_Y[7]=-200; zones_Y[8]=-200;
zones_DX[0]=100; zones_DX[1]=100; zones_DX[2]=100;
zones_DX[3]=75; zones_DX[4]=75; zones_DX[5]=75;
zones_DX[6]=40; zones_DX[7]=40; zones_DX[8]=40;
zones_DY[0]=100; zones_DY[1]=100; zones_DY[2]=100;
zones_DY[3]=75; zones_DY[4]=75; zones_DY[5]=75;
zones_DY[6]=40; zones_DY[7]=40; zones_DY[8]=40;
}
if(fLoc[1]==2){
zones_X[0]=-350; zones_X[1]=0; zones_X[2]=350;
zones_X[3]=-350; zones_X[4]=0; zones_X[5]=350;
zones_X[6]=-350; zones_X[7]=0; zones_X[8]=350;
zones_Y[0]=350; zones_Y[1]=350; zones_Y[2]=350;
zones_Y[3]=0; zones_Y[4]=0; zones_Y[5]=0 ;
zones_Y[6]=-350; zones_Y[7]=-350; zones_Y[8]=-350;
zones_DX[0]=150; zones_DX[1]=150; zones_DX[2]=150;
zones_DX[3]=100; zones_DX[4]=100; zones_DX[5]=100;
zones_DX[6]=60; zones_DX[7]=60; zones_DX[8]=60;
zones_DY[0]=150; zones_DY[1]=150; zones_DY[2]=150;
zones_DY[3]=100; zones_DY[4]=100; zones_DY[5]=100;
zones_DY[6]=60; zones_DY[7]=60; zones_DY[8]=60;
}
if(fLoc[1]==3){
zones_X[0]=-400; zones_X[1]=0; zones_X[2]=400;
zones_X[3]=-400; zones_X[4]=0; zones_X[5]=400;
zones_X[6]=-400; zones_X[7]=0; zones_X[8]=400;
zones_Y[0]=400; zones_Y[1]=400; zones_Y[2]=400;
zones_Y[3]=0; zones_Y[4]=0; zones_Y[5]=0 ;
zones_Y[6]=-400; zones_Y[7]=-400; zones_Y[8]=-400;
zones_DX[0]=200; zones_DX[1]=200; zones_DX[2]=200;
zones_DX[3]=150; zones_DX[4]=150; zones_DX[5]=150;
zones_DX[6]=100; zones_DX[7]=100; zones_DX[8]=100;
zones_DY[0]=200; zones_DY[1]=200; zones_DY[2]=200;
zones_DY[3]=150; zones_DY[4]=150; zones_DY[5]=150;
zones_DY[6]=100; zones_DY[7]=100; zones_DY[8]=100;
}
}
else {
zones_X = X;
zones_Y = Y;
zones_DX = DX;
zones_DY = DY;
}
}
void HMdcAligner::setHistograms(void)
{
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
fRecCount++;
Char_t title[50], tmp[50];
if(!fOutRoot) fOutRoot = new TFile(fNameRoot,"UPDATE");
if(fNumMods>3) {
CvsDinDCS_X = new TH1F*[fHistNum];
CvsDinDCS_Y = new TH1F*[fHistNum];
CvsDinDCS_XSlope = new TH1F*[fHistNum];
CvsDinDCS_YSlope = new TH1F*[fHistNum];
BvsDinDCS_X = new TH1F*[fHistNum];
BvsDinDCS_Y = new TH1F*[fHistNum];
BvsDinDCS_XSlope = new TH1F*[fHistNum];
BvsDinDCS_YSlope = new TH1F*[fHistNum];
AvsDinDCS_X = new TH1F*[fHistNum];
AvsDinDCS_Y = new TH1F*[fHistNum];
AvsDinDCS_XSlope = new TH1F*[fHistNum];
AvsDinDCS_YSlope = new TH1F*[fHistNum];
DvsCinCCS_X = new TH1F*[fHistNum];
DvsCinCCS_Y = new TH1F*[fHistNum];
DvsCinCCS_XSlope = new TH1F*[fHistNum];
DvsCinCCS_YSlope = new TH1F*[fHistNum];
DvsAinACS_X = new TH1F*[fHistNum];
DvsAinACS_Y = new TH1F*[fHistNum];
DvsAinACS_XSlope = new TH1F*[fHistNum];
DvsAinACS_YSlope = new TH1F*[fHistNum];
DvsBinBCS_X = new TH1F*[fHistNum];
DvsBinBCS_Y = new TH1F*[fHistNum];
DvsBinBCS_XSlope = new TH1F*[fHistNum];
DvsBinBCS_YSlope = new TH1F*[fHistNum];
SqrDistToD = new TH1F*[fHistNum];
}
if(fNumMods>2) {
BvsCinCCS_X = new TH1F*[fHistNum];
BvsCinCCS_Y = new TH1F*[fHistNum];
BvsCinCCS_XSlope = new TH1F*[fHistNum];
BvsCinCCS_YSlope = new TH1F*[fHistNum];
AvsCinCCS_X = new TH1F*[fHistNum];
AvsCinCCS_Y = new TH1F*[fHistNum];
AvsCinCCS_XSlope = new TH1F*[fHistNum];
AvsCinCCS_YSlope = new TH1F*[fHistNum];
CvsBinBCS_X = new TH1F*[fHistNum];
CvsBinBCS_Y = new TH1F*[fHistNum];
CvsBinBCS_XSlope = new TH1F*[fHistNum];
CvsBinBCS_YSlope = new TH1F*[fHistNum];
CvsAinACS_X = new TH1F*[fHistNum];
CvsAinACS_Y = new TH1F*[fHistNum];
CvsAinACS_XSlope = new TH1F*[fHistNum];
CvsAinACS_YSlope = new TH1F*[fHistNum];
XChi2Hist = new TH1F*[fHistNum];
YChi2Hist = new TH1F*[fHistNum];
TotalChi2 = new TH1F*[fHistNum];
SqrDistToA = new TH1F*[fHistNum];
SqrDistToB = new TH1F*[fHistNum];
SqrDistToC = new TH1F*[fHistNum];
SqrDist = new TH1F*[fHistNum];
DiffBCvsAinACS_XSlope = new TH1F*[fHistNum];
DiffBCvsAinACS_YSlope = new TH1F*[fHistNum];
DiffBCvsBinACS_XSlope = new TH1F*[fHistNum];
DiffBCvsBinACS_YSlope = new TH1F*[fHistNum];
DiffBCvsCinACS_XSlope = new TH1F*[fHistNum];
DiffBCvsCinACS_YSlope = new TH1F*[fHistNum];
DiffACvsAinACS_XSlope = new TH1F*[fHistNum];
DiffACvsAinACS_YSlope = new TH1F*[fHistNum];
DiffACvsBinACS_XSlope = new TH1F*[fHistNum];
DiffACvsBinACS_YSlope = new TH1F*[fHistNum];
DiffACvsCinACS_XSlope = new TH1F*[fHistNum];
DiffACvsCinACS_YSlope = new TH1F*[fHistNum];
DiffBCvsAinACS_XSlopeLow = new TH1F*[fHistNum];
DiffBCvsAinACS_YSlopeLow = new TH1F*[fHistNum];
DiffBCvsBinACS_XSlopeLow = new TH1F*[fHistNum];
DiffBCvsBinACS_YSlopeLow = new TH1F*[fHistNum];
DiffBCvsCinACS_XSlopeLow = new TH1F*[fHistNum];
DiffBCvsCinACS_YSlopeLow = new TH1F*[fHistNum];
DiffACvsAinACS_XSlopeLow = new TH1F*[fHistNum];
DiffACvsAinACS_YSlopeLow = new TH1F*[fHistNum];
DiffACvsBinACS_XSlopeLow = new TH1F*[fHistNum];
DiffACvsBinACS_YSlopeLow = new TH1F*[fHistNum];
DiffACvsCinACS_XSlopeLow = new TH1F*[fHistNum];
DiffACvsCinACS_YSlopeLow = new TH1F*[fHistNum];
DiffBCvsAinACS_XSlopeUp = new TH1F*[fHistNum];
DiffBCvsAinACS_YSlopeUp = new TH1F*[fHistNum];
DiffBCvsBinACS_XSlopeUp = new TH1F*[fHistNum];
DiffBCvsBinACS_YSlopeUp = new TH1F*[fHistNum];
DiffBCvsCinACS_XSlopeUp = new TH1F*[fHistNum];
DiffBCvsCinACS_YSlopeUp = new TH1F*[fHistNum];
DiffACvsAinACS_XSlopeUp = new TH1F*[fHistNum];
DiffACvsAinACS_YSlopeUp = new TH1F*[fHistNum];
DiffACvsBinACS_XSlopeUp = new TH1F*[fHistNum];
DiffACvsBinACS_YSlopeUp = new TH1F*[fHistNum];
DiffACvsCinACS_XSlopeUp = new TH1F*[fHistNum];
DiffACvsCinACS_YSlopeUp = new TH1F*[fHistNum];
}
AvsBinBCS_X = new TH1F*[fHistNum];
AvsBinBCS_Y = new TH1F*[fHistNum];
AvsBinBCS_XSlope = new TH1F*[fHistNum];
AvsBinBCS_YSlope = new TH1F*[fHistNum];
BvsAinACS_X = new TH1F*[fHistNum];
BvsAinACS_Y = new TH1F*[fHistNum];
BvsAinACS_XSlope = new TH1F*[fHistNum];
BvsAinACS_YSlope = new TH1F*[fHistNum];
BCvsAinACS_X = new TH1F*[fHistNum];
BCvsAinACS_Y = new TH1F*[fHistNum];
BCvsACinACS_XSlope = new TH1F*[fHistNum];
BCvsACinACS_YSlope = new TH1F*[fHistNum];
ABvsCinCCS_X = new TH1F*[fHistNum];
ABvsCinCCS_Y = new TH1F*[fHistNum];
ABvsCinCCS_XSlope = new TH1F*[fHistNum];
ABvsCinCCS_YSlope = new TH1F*[fHistNum];
ACvsBinBCS_X = new TH1F*[fHistNum];
ACvsBinBCS_Y = new TH1F*[fHistNum];
ACvsBinBCS_XSlope = new TH1F*[fHistNum];
ACvsBinBCS_YSlope = new TH1F*[fHistNum];
BvsAinACS_Zon = new TH2F*[fHistZonNum];
BvsAinACS_X_Zone = new TH1F*[fHistZonNum*9];
BvsAinACS_Y_Zone = new TH1F*[fHistZonNum*9];
if (fNumMods>3){
Int_t modC = fLoc[3];
Int_t modD = fLoc[4];
sprintf(title,"%s%i%s%i%s%i%s%i%s%i","Sector_",sector,"_ModA_",modA,
"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i%s%i","All","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
fAlignAll = new TTree(tmp,title);
fAlignAll->Branch("hits",&fHits,64000);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i%s%i","AllCut","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
fAlignAllCut = new TTree(tmp,title);
fAlignAllCut->Branch("hits",&fHits,64000);
static Char_t newDirName[255];
sprintf(newDirName,"%s%s%i%s%i%s%i%s%i%s%i","Aligner_","S_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
fOutRoot->mkdir(newDirName,newDirName);
fOutRoot->cd(newDirName);
Int_t bin=200, binS=200, binChi=200, binDist=200;
Int_t min=-100,max=100,minS=-1,maxS=1;
Int_t minChi=0, maxChi=20, minDist=0,maxDist=50;
for(Int_t index=0;index<fHistNum;index++){
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsDinDCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsDinDCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsDinDCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsDinDCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsDinDCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsDinDCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsDinDCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsDinDCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsDinDCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsDinDCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsDinDCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsDinDCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsDinDCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsDinDCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsDinDCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsDinDCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsDinDCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsDinDCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsDinDCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsDinDCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsDinDCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsDinDCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsDinDCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsDinDCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsCinCCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsCinCCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsCinCCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsCinCCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsCinCCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsCinCCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsCinCCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsCinCCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsCinCCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsCinCCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsCinCCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsCinCCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsCinCCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsCinCCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsCinCCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsCinCCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsBinBCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsBinBCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsBinBCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsBinBCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsBinBCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsBinBCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsBinBCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsBinBCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsBinBCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsBinBCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsBinBCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsBinBCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsBinBCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
AvsBinBCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsAinACS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsAinACS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsAinACS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsAinACS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsAinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsAinACS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","DvsAinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
DvsAinACS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsAinACS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsAinACS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsAinACS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsAinACS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsAinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsAinACS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","CvsAinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
CvsAinACS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsAinACS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsAinACS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsAinACS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsAinACS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsAinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsAinACS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","BvsAinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
BvsAinACS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","XChi2Hist_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
XChi2Hist[index] = new TH1F(tmp,title,binChi,minChi,maxChi);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","YChi2Hist_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
YChi2Hist[index] = new TH1F(tmp,title,binChi,minChi,maxChi);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","TotalChi2_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
TotalChi2[index] = new TH1F(tmp,title,binChi,minChi,maxChi);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","SqrDistToA_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
SqrDistToA[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","SqrDistToB_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
SqrDistToB[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","SqrDistToC_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
SqrDistToC[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","SqrDistToD_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
SqrDistToD[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i%s%i","SqrDist_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
SqrDist[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
}
}
else if(fNumMods>2){
Int_t modC = fLoc[3];
sprintf(title,"%s%i%s%i%s%i%s%i","Sector_",sector,"_ModA_",modA,
"_ModB_",modB,"_ModC_",modC);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","All","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
fAlignAll = new TTree(tmp,title);
fAlignAll->Branch("hits",&fHits,64000);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","AllCut","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
fAlignAllCut = new TTree(tmp,title);
fAlignAllCut->Branch("hits",&fHits,64000);
static Char_t newDirName[255];
sprintf(newDirName,"%s%s%i%s%i%s%i%s%i","Aligner_","S_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
fOutRoot->mkdir(newDirName,newDirName);
fOutRoot->cd(newDirName);
Int_t bin=200, binS=200, binChi=200, binDist=200;
Int_t min=-100,max=100,minS=-1,maxS=1;
Int_t minChi=0, maxChi=10, minDist=0,maxDist=100;
for(Int_t index=0;index<fHistNum;index++){
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
if(index==2){
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Polar_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Polar = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Polar_Stripe1",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Polar_Stripe1 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Polar_Stripe2",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Polar_Stripe2 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Polar_Stripe3",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Polar_Stripe3 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Polar_Stripe4",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Polar_Stripe4 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsCinCCS_Polar_Stripe5",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsCinCCS_Polar_Stripe5 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlope_Stripe1",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlope_Stripe1 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlope_Stripe2",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlope_Stripe2 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlope_Stripe3",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlope_Stripe3 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlope_Stripe4",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlope_Stripe4 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlope_Stripe5",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlope_Stripe5 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlope_Stripe1",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlope_Stripe1 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlope_Stripe2",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlope_Stripe2 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlope_Stripe3",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlope_Stripe3 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlope_Stripe4",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlope_Stripe4 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlope_Stripe5",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlope_Stripe5 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlope_Stripe1",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlope_Stripe1 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlope_Stripe2",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlope_Stripe2 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlope_Stripe3",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlope_Stripe3 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlope_Stripe4",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlope_Stripe4 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlope_Stripe5",
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlope_Stripe5 = new TH1F(tmp,title,200,-0.1,0.1);
}
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
if(index==2){
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Polar_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Polar = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Polar_Stripe1",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Polar_Stripe1 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Polar_Stripe2",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Polar_Stripe2 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Polar_Stripe3",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Polar_Stripe3 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Polar_Stripe4",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Polar_Stripe4 = new TH1F(tmp,title,200,-0.1,0.1);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsCinCCS_Polar_Stripe5",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsCinCCS_Polar_Stripe5 = new TH1F(tmp,title,200,-0.1,0.1);
}
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsBinBCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsBinBCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsBinBCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsBinBCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsBinBCS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsBinBCS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsBinBCS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","AvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
AvsBinBCS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsAinACS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsAinACS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsAinACS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsAinACS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsAinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsAinACS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","CvsAinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
CvsAinACS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsAinACS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsAinACS_X[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsAinACS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsAinACS_Y[index] = new TH1F(tmp,title,bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsAinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsAinACS_XSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BvsAinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BvsAinACS_YSlope[index] = new TH1F(tmp,title,binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BCvsAinACS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BCvsAinACS_X[index] = new TH1F(tmp,title,10*bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BCvsAinACS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BCvsAinACS_Y[index] = new TH1F(tmp,title,10*bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BCvsACinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BCvsACinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","BCvsACinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
BCvsACinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ABvsCinCCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ABvsCinCCS_X[index] = new TH1F(tmp,title,10*bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ABvsCinCCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ABvsCinCCS_Y[index] = new TH1F(tmp,title,10*bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ABvsCinCCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ABvsCinCCS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ABvsCinCCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ABvsCinCCS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ACvsBinBCS_X_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ACvsBinBCS_X[index] = new TH1F(tmp,title,10*bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ACvsBinBCS_Y_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ACvsBinBCS_Y[index] = new TH1F(tmp,title,10*bin,min,max);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ACvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ACvsBinBCS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","ACvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
ACvsBinBCS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsAinACS_XSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsAinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsAinACS_YSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsAinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsBinACS_XSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsBinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsBinACS_YSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsBinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsCinACS_XSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsCinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsCinACS_YSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsCinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsAinACS_XSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsBinACS_XSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsCinACS_XSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_XSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlope_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlope[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsAinACS_XSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsAinACS_XSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsAinACS_YSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsAinACS_YSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsBinACS_XSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsBinACS_XSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsBinACS_YSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsBinACS_YSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsCinACS_XSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsCinACS_XSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsCinACS_YSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsCinACS_YSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsAinACS_XSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_XSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsBinACS_XSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_XSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsCinACS_XSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_XSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlopeLow_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlopeLow[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsAinACS_XSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsAinACS_XSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsAinACS_YSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsAinACS_YSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsBinACS_XSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsBinACS_XSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsBinACS_YSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsBinACS_YSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsCinACS_XSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsCinACS_XSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffBCvsCinACS_YSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffBCvsCinACS_YSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsAinACS_XSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_XSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsAinACS_YSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsAinACS_YSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsBinACS_XSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_XSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsBinACS_YSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsBinACS_YSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsCinACS_XSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_XSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","DiffACvsCinACS_YSlopeUp_",index,
"_Sector_",sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
DiffACvsCinACS_YSlopeUp[index] = new TH1F(tmp,title,10*binS,minS,maxS);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","XChi2Hist_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
XChi2Hist[index] = new TH1F(tmp,title,binChi,minChi,maxChi);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","YChi2Hist_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
YChi2Hist[index] = new TH1F(tmp,title,binChi,minChi,maxChi);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","TotalChi2_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
TotalChi2[index] = new TH1F(tmp,title,binChi,minChi,maxChi);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","SqrDistToA_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
SqrDistToA[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","SqrDistToB_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
SqrDistToB[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","SqrDistToC_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
SqrDistToC[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
sprintf(tmp,"%s%i%s%i%s%i%s%i%s%i","SqrDist_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
SqrDist[index] = new TH1F(tmp,title,binDist,minDist,maxDist);
}
}
else{
sprintf(title,"%s%i%s%i%s%i","Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
sprintf(tmp,"%s%s%i%s%i%s%i","All","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fAlignAll = new TTree(tmp,title);
fAlignAll->Branch("hits",&fHits);
sprintf(tmp,"%s%s%i%s%i%s%i","AllCut","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fAlignAllCut = new TTree(tmp,title);
fAlignAllCut->Branch("hits",&fHits);
static Char_t newDirName[255];
sprintf(newDirName,"%s%s%i%s%i%s%i","Aligner_","S_",sector,
"_ModA_",modA,"_ModB_",modB);
fOutRoot->mkdir(newDirName,newDirName);
fOutRoot->cd(newDirName);
Int_t bin=150;
Int_t binS=150;
for(Int_t index=0;index<fHistNum;index++){
sprintf(tmp,"%s%i%s%i%s%i%s%i","AvsBinBCS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
AvsBinBCS_X[index] = new TH1F(tmp,title,bin,-fXArea,fXArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","AvsBinBCS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
AvsBinBCS_Y[index] = new TH1F(tmp,title,bin,-fYArea,fYArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","AvsBinBCS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB);
AvsBinBCS_XSlope[index] = new TH1F(tmp,title,binS,-fSArea,fSArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","AvsBinBCS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB);
AvsBinBCS_YSlope[index] = new TH1F(tmp,title,binS,-fSArea,fSArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","BvsAinACS_X_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
BvsAinACS_X[index] = new TH1F(tmp,title,bin,-fXArea,fXArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","BvsAinACS_Y_",index,"_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
BvsAinACS_Y[index] = new TH1F(tmp,title,bin,-fYArea,fYArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","BvsAinACS_XSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB);
BvsAinACS_XSlope[index] = new TH1F(tmp,title,binS,-fSArea,fSArea);
sprintf(tmp,"%s%i%s%i%s%i%s%i","BvsAinACS_YSlope_",index,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB);
BvsAinACS_YSlope[index] = new TH1F(tmp,title,binS,-fSArea,fSArea);
}
}
for(Int_t plot=0;plot<fHistZonNum;plot++){
sprintf(tmp,"%s%i%s%i%s%i%s%i","BvsAinACS_Zon_P",plot,"_Sector_",
sector,"_ModA_",modA,"_ModB_",modB);
BvsAinACS_Zon[plot] = new TH2F(tmp,title,800,-80,80,800,-90,70);
}
Int_t binZ=200,minZ=-100,maxZ=100;
for(Int_t plot=0;plot<fHistZonNum;plot++){
for(Int_t index=0;index<9;index++){
sprintf(title,"%s%i","zone_",index);
sprintf(tmp,"%s%i%s%i","res_X_zone_",index,"_R",plot);
BvsAinACS_X_Zone[index+9*plot] = new TH1F(tmp,title,binZ,minZ,maxZ);
sprintf(tmp,"%s%i%s%i","res_Y_zone_",index,"_R",plot);
BvsAinACS_Y_Zone[index+9*plot] = new TH1F(tmp,title,binZ,minZ,maxZ);
}
}
sprintf(tmp,"%s%i%s%i%s%i","rotZ_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotZ = new TH1F(tmp,title,1000,-0.25,0.25);
sprintf(tmp,"%s%i%s%i%s%i","rotZ_Zon_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotZZon = new TH1F(tmp,title,500,-0.25,0.25);
sprintf(tmp,"%s%i%s%i%s%i","rotY_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotY = new TH1F(tmp,title,1000,-0.5,0.5);
sprintf(tmp,"%s%i%s%i%s%i","rotY_Zon_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotYZon = new TH1F(tmp,title,1000,-0.5,0.5);
sprintf(tmp,"%s%i%s%i%s%i","rotYPos_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotYPos = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotYNeg_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotYNeg = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotY_ZonPos_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotYZonPos = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotY_ZonNeg_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotYZonNeg = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotX_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotX = new TH1F(tmp,title,1000,-0.5,0.5);
sprintf(tmp,"%s%i%s%i%s%i","rotX_Zon_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotXZon = new TH1F(tmp,title,1000,-0.5,0.5);
sprintf(tmp,"%s%i%s%i%s%i","rotXPos_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotXPos = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotXNeg_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotXNeg = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotX_ZonPos_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotXZonPos = new TH1F(tmp,title,1000,-1,1);
sprintf(tmp,"%s%i%s%i%s%i","rotX_ZonNeg_Sector",sector,
"_ModA_",modA,"_ModB_",modB);
hisrotXZonNeg = new TH1F(tmp,title,1000,-1,1);
graphXchi2 = new TGraph(40);
graphXchi2->SetName("graphXchi2");
graphXchi2->SetTitle("graphXchi2");
graphXchi2X = new TGraph(40);
graphXchi2X->SetName("graphXchi2X");
graphXchi2X->SetTitle("graphXchi2X");
graphXchi2Y = new TGraph(40);
graphXchi2Y->SetName("graphXchi2Y");
graphXchi2Y->SetTitle("graphXchi2Y");
graphYchi2 = new TGraph(40);
graphYchi2->SetName("graphYchi2");
graphYchi2->SetTitle("graphYchi2");
graphYchi2X = new TGraph(40);
graphYchi2X->SetName("graphYchi2X");
graphYchi2X->SetTitle("graphYchi2X");
graphYchi2Y = new TGraph(40);
graphYchi2Y->SetName("graphYchi2Y");
graphYchi2Y->SetTitle("graphYchi2Y");
graphCont = new TGraph(40);
graphCont->SetName("graphCont");
graphCont->SetTitle("graphCont");
sprintf(tmp,"%s%s%i%s%i%s%i","fResX","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fResX = new TH1F(tmp,title,2000,-1000,1000);
sprintf(tmp,"%s%s%i%s%i%s%i","fResY","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fResY = new TH1F(tmp,title,2000,-1000,1000);
sprintf(tmp,"%s%s%i%s%i%s%i","fResS0","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fResS0 = new TH1F(tmp,title,2000,-1,1);
sprintf(tmp,"%s%s%i%s%i%s%i","fResS1","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fResS1 = new TH1F(tmp,title,2000,-1,1);
sprintf(tmp,"%s%s%i%s%i%s%i","fAccResX","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
fOutRoot->cd();
}
void HMdcAligner::fitHistograms(Int_t index)
{
if(fNumMods==2 || fNumMods==3){
Float_t XNewAreaA, XNewAreaB, YNewAreaA, YNewAreaB;
Float_t S0NewAreaA, S0NewAreaB, S1NewAreaA, S1NewAreaB;
Float_t XNewMeanA, XNewMeanB, YNewMeanA, YNewMeanB;
Float_t S0NewMeanA, S0NewMeanB, S1NewMeanA, S1NewMeanB;
TF1 *f1X = new TF1("f1X","gaus",-fXArea,fXArea);
TF1 *f1Y = new TF1("f1Y","gaus",-fYArea,fYArea);
TF1 *f1S = new TF1("f1S","gaus",-fSArea,fSArea);
TF1 *totalX = new TF1("totalX","gaus(0)+pol2(3)",-fXArea,fXArea);
TF1 *totalY = new TF1("totalY","gaus(0)+pol2(3)",-fYArea,fYArea);
TF1 *totalS = new TF1("totalS","gaus(0)+pol2(3)",-fSArea,fSArea);
TF1 *total2X = new TF1("total2X","gaus(0)+gaus(3)",-fXArea,fXArea);
TF1 *total2Y = new TF1("total2Y","gaus(0)+gaus(3)",-fYArea,fYArea);
TF1 *total2S = new TF1("total2S","gaus(0)+gaus(3)",-fSArea,fSArea);
TF1 *total3X = new TF1("total3X",breitW,-fXArea,fXArea,3);
TF1 *total3Y = new TF1("total3Y",breitW,-fYArea,fYArea,3);
TF1 *total3S = new TF1("total3S",breitW,-fSArea,fSArea,3);
Double_t par[6];
if(A_DEBUG>1) cout << endl
<<"**** fitHistograms() results ****" << endl;
if(A_DEBUG>1) cout << endl
<<"**** Gauss fit: mean, sigma ****" << endl
<<"**** Gauss+pol: mean, sigma ****"
<< endl;
if(fNumMods==3) ABvsCinCCS_X[index]->Fit("f1X","RQNW");
else AvsBinBCS_X[index]->Fit("f1X","RQNW");
Float_t fitPar0 = f1X->GetParameter(0);
Float_t fitPar1 = f1X->GetParameter(1);
Float_t fitPar2 = f1X->GetParameter(2);
if(A_DEBUG>1)
cout << " AvsBinBCS_X[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1X->GetParameters(&par[0]);
par[3] = par[4] = par[5] = 0.;
totalX->SetParameters(par);
if(fNumMods==3) ABvsCinCCS_X[index]->Fit("totalX","RQN");
else AvsBinBCS_X[index]->Fit("totalX","RQN");
fitPar0 = totalX->GetParameter(0);
fitPar1 = totalX->GetParameter(1);
fitPar2 = totalX->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
XNewAreaA = fXSigmas * fitPar2;
XNewMeanA = fitPar1;
if(fNumMods==3) ABvsCinCCS_Y[index]->Fit("f1Y","RQNW");
else AvsBinBCS_Y[index]->Fit("f1Y","RQNW");
fitPar0 = f1Y->GetParameter(0);
fitPar1 = f1Y->GetParameter(1);
fitPar2 = f1Y->GetParameter(2);
if(A_DEBUG>1) cout << " AvsBinBCS_Y[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1Y->GetParameters(&par[0]);
totalY->SetParameters(par);
if(fNumMods==3) ABvsCinCCS_Y[index]->Fit("totalY","RQN");
else AvsBinBCS_Y[index]->Fit("totalY","RQN");
fitPar1 = totalY->GetParameter(1);
fitPar2 = totalY->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
YNewAreaA = fYSigmas * fitPar2;
YNewMeanA = fitPar1;
if(fNumMods==3) ABvsCinCCS_XSlope[index]->Fit("f1S","RQNW");
else AvsBinBCS_XSlope[index]->Fit("f1S","RQNW");
fitPar0 = f1S->GetParameter(0);
fitPar1 = f1S->GetParameter(1);
fitPar2 = f1S->GetParameter(2);
if(A_DEBUG>1) cout << " AvsBinBCS_XSlope[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1S->GetParameters(&par[0]);
totalS->SetParameters(par);
if(fNumMods==3) ABvsCinCCS_XSlope[index]->Fit("totalS","RQN");
else AvsBinBCS_XSlope[index]->Fit("totalS","RQN");
fitPar1 = totalS->GetParameter(1);
fitPar2 = totalS->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
S0NewAreaA = fS0Sigmas * fitPar2;
S0NewMeanA = fitPar1;
if(fNumMods==3) ABvsCinCCS_YSlope[index]->Fit("f1S","RQNW");
else AvsBinBCS_YSlope[index]->Fit("f1S","RQNW");
fitPar0 = f1S->GetParameter(0);
fitPar1 = f1S->GetParameter(1);
fitPar2 = f1S->GetParameter(2);
if(A_DEBUG>1) cout << " AvsBinBCS_YSlope[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1S->GetParameters(&par[0]);
totalS->SetParameters(par);
if(fNumMods==3) ABvsCinCCS_YSlope[index]->Fit("totalS","RQN");
else AvsBinBCS_YSlope[index]->Fit("totalS","RQN");
fitPar1 = totalS->GetParameter(1);
fitPar2 = totalS->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
S1NewAreaA = fS1Sigmas * fitPar2;
S1NewMeanA = fitPar1;
if(fNumMods==3) BCvsAinACS_X[index]->Fit("f1X","RQN");
else BvsAinACS_X[index]->Fit("f1X","RQN");
fitPar0 = f1X->GetParameter(0);
fitPar1 = f1X->GetParameter(1);
fitPar2 = f1X->GetParameter(2);
if(A_DEBUG>1) cout << " BvsAinACS_X[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1X->GetParameters(&par[0]);
totalX->SetParameters(par);
if(fNumMods==3) BCvsAinACS_X[index]->Fit("totalX","RQN");
else BvsAinACS_X[index]->Fit("totalX","RQN");
fitPar1 = totalX->GetParameter(1);
fitPar2 = totalX->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
XNewAreaB = fXSigmas * fitPar2;
XNewMeanB = fitPar1;
f1X->GetParameters(&par[0]);
par[3]=par[0]/10;par[4]=par[1];par[5]=par[2]*4;
total2X->SetParameters(par);
if(fNumMods==3) BCvsAinACS_X[index]->Fit("total2X","RQN");
else BvsAinACS_X[index]->Fit("total2X","RQN");
fitPar1 = total2X->GetParameter(1);
fitPar2 = total2X->GetParameter(2);
if(total2X->GetChisquare()!=0.)
if( (total2X->GetChisquare()/total2X->GetNDF()) <
(totalX->GetChisquare()/totalX->GetNDF()) ){
if(total2X->GetParameter(5)<total2X->GetParameter(2)){
XNewAreaB = fXSigmas * total2X->GetParameter(5);
XNewMeanB = total2X->GetParameter(4);
}
else {
XNewAreaB = fXSigmas * fitPar2;
XNewMeanB = fitPar1;
}
}
total2X->GetParameters(&par[0]);
par[0]=par[0]*10*par[2];par[2]=par[2]*2;
total3X->SetParameters(par);
if(fNumMods==3) BCvsAinACS_X[index]->Fit(total3X,"RQN");
else BvsAinACS_X[index]->Fit(total3X,"RQN");
fitPar1 = total3X->GetParameter(1);
fitPar2 = total3X->GetParameter(2);
if(total3X->GetChisquare()!=0.)
if( (total3X->GetChisquare()/total3X->GetNDF()) <
(total2X->GetChisquare()/total2X->GetNDF()) &&
(total3X->GetChisquare()/total3X->GetNDF()) <
(totalX->GetChisquare()/totalX->GetNDF()) ){
XNewAreaB = fXSigmas * (fitPar2/2.355);
XNewMeanB = fitPar1;
}
ofstream *fout=NULL;
if (fNameAscii) fout = new ofstream(fNameAscii.Data(), ios::app);
if (*fout){
*fout << endl;
*fout << "Fitting X hist:" << " chi square " <<
" chi square/NDF" << endl;
*fout << "gaus: " << f1X->GetChisquare() << " " <<
f1X->GetChisquare()/f1X->GetNDF() << endl;
*fout << "gaus + pol2: " << totalX->GetChisquare() << " " <<
totalX->GetChisquare()/totalX->GetNDF() << endl;
*fout << "double gauss: " << total2X->GetChisquare() << " " <<
total2X->GetChisquare()/total2X->GetNDF() << endl;
*fout << "Breit Wigner: " << total3X->GetChisquare() << " " <<
total3X->GetChisquare()/total3X->GetNDF() << endl;
}
if(fNumMods==3) BCvsAinACS_Y[index]->Fit("f1Y","RQN");
else BvsAinACS_Y[index]->Fit("f1Y","RQN");
fitPar0 = f1Y->GetParameter(0);
fitPar1 = f1Y->GetParameter(1);
fitPar2 = f1Y->GetParameter(2);
if(A_DEBUG>1)
cout << " BvsAinACS_Y[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1Y->GetParameters(&par[0]);
totalY->SetParameters(par);
if(fNumMods==3) BCvsAinACS_Y[index]->Fit("totalY","RQN");
else BvsAinACS_Y[index]->Fit("totalY","RQN");
fitPar1 = totalY->GetParameter(1);
fitPar2 = totalY->GetParameter(2);
if(A_DEBUG>1)
cout << fitPar1 << ", " << fitPar2 << endl;
YNewAreaB = fYSigmas * fitPar2;
YNewMeanB = fitPar1;
f1Y->GetParameters(&par[0]);
par[3]=par[0]/10;par[4]=par[1];par[5]=par[2]*4;
total2Y->SetParameters(par);
if(fNumMods==3) BCvsAinACS_Y[index]->Fit("total2Y","RQN");
else BvsAinACS_Y[index]->Fit("total2Y","RQN");
fitPar1 = total2Y->GetParameter(1);
fitPar2 = total2Y->GetParameter(2);
if(total2Y->GetChisquare()!=0.)
if( (total2Y->GetChisquare()/total2Y->GetNDF()) <
(totalY->GetChisquare()/totalY->GetNDF()) ){
if(total2Y->GetParameter(5)<total2Y->GetParameter(2)){
YNewAreaB = fYSigmas * total2Y->GetParameter(5);
YNewMeanB = total2Y->GetParameter(4);
}
else {
YNewAreaB = fYSigmas * fitPar2;
YNewMeanB = fitPar1;
}
}
total2Y->GetParameters(&par[0]);
par[0]=par[0]*10*par[2];par[2]=par[2]*2;
total3Y->SetParameters(par);
if(fNumMods==3) BCvsAinACS_Y[index]->Fit(total3Y,"RQN");
else BvsAinACS_Y[index]->Fit(total3Y,"RQN");
fitPar1 = total3Y->GetParameter(1);
fitPar2 = total3Y->GetParameter(2);
if(total3Y->GetChisquare()!=0.)
if( (total3Y->GetChisquare()/total3Y->GetNDF()) <
(total2Y->GetChisquare()/total2Y->GetNDF()) &&
(total3Y->GetChisquare()/total3Y->GetNDF()) <
(totalY->GetChisquare()/totalY->GetNDF()) ){
YNewAreaB = fYSigmas * (fitPar2/2.355);
YNewMeanB = fitPar1;
}
if (*fout){
*fout << endl;
*fout << "Fitting Y hist:" << " chi square " <<
" chi square/NDF" << endl;
*fout << "gaus: " << f1Y->GetChisquare() << " " <<
f1Y->GetChisquare()/f1Y->GetNDF() << endl;
*fout << "gaus + pol2: " << totalY->GetChisquare() << " " <<
totalY->GetChisquare()/totalY->GetNDF() << endl;
*fout << "double gauss: " << total2Y->GetChisquare() << " " <<
total2Y->GetChisquare()/total2Y->GetNDF() << endl;
*fout << "Breit Wigner: " << total3Y->GetChisquare() << " " <<
total3Y->GetChisquare()/total3Y->GetNDF() << endl;
}
if(fNumMods==3) BCvsACinACS_XSlope[index]->Fit("f1S","RQN");
else BvsAinACS_XSlope[index]->Fit("f1S","RQN");
fitPar0 = f1S->GetParameter(0);
fitPar1 = f1S->GetParameter(1);
fitPar2 = f1S->GetParameter(2);
if(A_DEBUG>1) cout << " BvsAinACS_XSlope[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1S->GetParameters(&par[0]);
totalS->SetParameters(par);
if(fNumMods==3) BCvsACinACS_XSlope[index]->Fit("totalS","RQN");
else BvsAinACS_XSlope[index]->Fit("totalS","RQN");
fitPar1 = totalS->GetParameter(1);
fitPar2 = totalS->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
S0NewAreaB = fS0Sigmas * fitPar2;
S0NewMeanB = fitPar1;
f1S->GetParameters(&par[0]);
par[3]=par[0]/10;par[4]=par[1];par[5]=par[2]*4;
total2S->SetParameters(par);
if(fNumMods==3) BCvsACinACS_XSlope[index]->Fit("total2S","RQN");
else BvsAinACS_XSlope[index]->Fit("total2S","RQN");
fitPar1 = total2S->GetParameter(1);
fitPar2 = total2S->GetParameter(2);
if(total2S->GetChisquare()!=0.)
if( (total2S->GetChisquare()/total2S->GetNDF()) <
(totalS->GetChisquare()/totalS->GetNDF()) ){
if(total2S->GetParameter(5)<total2S->GetParameter(2)){
S0NewAreaB = fS0Sigmas * total2S->GetParameter(5);
S0NewMeanB = total2S->GetParameter(4);
}
else {
S0NewAreaB = fS0Sigmas * fitPar2;
S0NewMeanB = fitPar1;
}
}
total2S->GetParameters(&par[0]);
par[0]=par[0]*10*par[2];par[2]=par[2]*2;
total3S->SetParameters(par);
if(fNumMods==3) BCvsACinACS_XSlope[index]->Fit(total3S,"RQN");
else BvsAinACS_XSlope[index]->Fit(total3S,"RQN");
fitPar1 = total3S->GetParameter(1);
fitPar2 = total3S->GetParameter(2);
if(total3S->GetChisquare()!=0.)
if( (total3S->GetChisquare()/total3S->GetNDF()) <
(total2S->GetChisquare()/total2S->GetNDF()) &&
(total3S->GetChisquare()/total3S->GetNDF()) <
(totalS->GetChisquare()/totalS->GetNDF()) ){
S0NewAreaB = fS0Sigmas * (fitPar2/2.355);
S0NewMeanB = fitPar1;
}
if (*fout){
*fout << endl;
*fout << "Fitting S0 hist:" << " chi square " <<
" chi square/NDF" << endl;
*fout << "gaus: " << f1S->GetChisquare() << " " <<
f1S->GetChisquare()/f1S->GetNDF() << endl;
*fout << "gaus + pol2: " << totalS->GetChisquare() << " " <<
totalS->GetChisquare()/totalS->GetNDF() << endl;
*fout << "double gauss: " << total2S->GetChisquare() << " " <<
total2S->GetChisquare()/total2S->GetNDF() << endl;
*fout << "Breit Wigner: " << total3S->GetChisquare() << " " <<
total3S->GetChisquare()/total3S->GetNDF() << endl;
}
if(fNumMods==3) BCvsACinACS_YSlope[index]->Fit("f1S","RQN");
else BvsAinACS_YSlope[index]->Fit("f1S","RQN");
fitPar0 = f1S->GetParameter(0);
fitPar1 = f1S->GetParameter(1);
fitPar2 = f1S->GetParameter(2);
if(A_DEBUG>1) cout << " BvsAinACS_YSlope[" << index << "]: "
<< fitPar1 << ", " << fitPar2<< ", " ;
f1S->GetParameters(&par[0]);
totalS->SetParameters(par);
if(fNumMods==3) BCvsACinACS_YSlope[index]->Fit("totalS","RQN");
else BvsAinACS_YSlope[index]->Fit("totalS","RQN");
fitPar1 = totalS->GetParameter(1);
fitPar2 = totalS->GetParameter(2);
if(A_DEBUG>1) cout << fitPar1 << ", " << fitPar2 << endl;
S1NewAreaB = fS1Sigmas * fitPar2;
S1NewMeanB = fitPar1;
f1S->GetParameters(&par[0]);
par[3]=par[0]/10;par[4]=par[1];par[5]=par[2]*4;
total2S->SetParameters(par);
if(fNumMods==3) BCvsACinACS_YSlope[index]->Fit("total2S","RQN");
else BvsAinACS_YSlope[index]->Fit("total2S","RQN");
fitPar1 = total2S->GetParameter(1);
fitPar2 = total2S->GetParameter(2);
if(total2S->GetChisquare()!=0.)
if( (total2S->GetChisquare()/total2S->GetNDF()) <
(totalS->GetChisquare()/totalS->GetNDF()) ){
if(total2S->GetParameter(5)<total2S->GetParameter(2)){
S1NewAreaB = fS1Sigmas * total2S->GetParameter(5);
S1NewMeanB = total2S->GetParameter(4);
}
else {
S1NewAreaB = fS1Sigmas * fitPar2;
S1NewMeanB = fitPar1;
}
}
total2S->GetParameters(&par[0]);
par[0]=par[0]*10*par[2];par[2]=par[2]*2;
total3S->SetParameters(par);
if(fNumMods==3) BCvsACinACS_YSlope[index]->Fit(total3S,"RQN");
else BvsAinACS_YSlope[index]->Fit(total3S,"RQN");
fitPar1 = total3S->GetParameter(1);
fitPar2 = total3S->GetParameter(2);
if(total3S->GetChisquare()!=0.)
if( (total3S->GetChisquare()/total3S->GetNDF()) <
(total2S->GetChisquare()/total2S->GetNDF()) &&
(total3S->GetChisquare()/total3S->GetNDF()) <
(totalS->GetChisquare()/totalS->GetNDF()) ){
S1NewAreaB = fS1Sigmas * (fitPar2/2.355);
S1NewMeanB = fitPar1;
}
if (*fout){
*fout << endl;
*fout << "Fitting S1 hist:" << " chi square " <<
" chi square/NDF" << endl;
*fout << "gaus: " << f1S->GetChisquare() << " " <<
f1S->GetChisquare()/f1S->GetNDF() << endl;
*fout << "gaus + pol2: " << totalS->GetChisquare() << " " <<
totalS->GetChisquare()/totalS->GetNDF() << endl;
*fout << "double gauss: " << total2S->GetChisquare() << " " <<
total2S->GetChisquare()/total2S->GetNDF() << endl;
*fout << "Breit Wigner: " << total3S->GetChisquare() << " " <<
total3S->GetChisquare()/total3S->GetNDF() << endl;
*fout << " Fit sigmas: " << XNewAreaB/fXSigmas << " "
<< YNewAreaB/fYSigmas << " " << S0NewAreaB/fS0Sigmas
<< " " << S1NewAreaB/fS1Sigmas << endl;
}
Stat_t entries = fAlignAll->GetEntries();
HMdcHit* hitA;
HMdcHit* hitB;
HMdcHit* hitC=NULL;
HMdcHit* hitBC=new HMdcHit;
HMdcHit* hitAB=new HMdcHit;
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
Float_t* origSlopes = new Float_t[2];
HGeomRotation rotaux;
HGeomVector transaux;
HGeomRotation rotaux2;
HGeomVector transaux2;
TH2F* xSxcov;
TH2F* ySycov;
TH2F* xycov;
TH2F* xSycov;
TH2F* ySxcov;
TH2F* SxSycov;
xSxcov = new TH2F("xSxcov","xSxcov",100,XNewMeanB-(2*(XNewAreaB/fXSigmas)),
XNewMeanB+(2*(XNewAreaB/fXSigmas)),
100,S0NewMeanB-(2*(S0NewAreaB/fS0Sigmas)),
S0NewMeanB+(2*(S0NewAreaB/fS0Sigmas)));
ySycov = new TH2F("ySycov","ySycov",100,YNewMeanB-(2*(YNewAreaB/fYSigmas)),
YNewMeanB+(2*(YNewAreaB/fYSigmas)),
100,S1NewMeanB-(2*(S1NewAreaB/fS1Sigmas)),
S1NewMeanB+(2*(S1NewAreaB/fS1Sigmas)));
xycov = new TH2F("xycov","xycov",100,XNewMeanB-(2*(XNewAreaB/fXSigmas)),
XNewMeanB+(2*(XNewAreaB/fXSigmas)),
100,YNewMeanB-(2*(YNewAreaB/fYSigmas)),
YNewMeanB+(2*(YNewAreaB/fYSigmas)));
xSycov = new TH2F("xSycov","xSycov",100,XNewMeanB-(2*(XNewAreaB/fXSigmas)),
XNewMeanB+(2*(XNewAreaB/fXSigmas)),
100,S1NewMeanB-(2*(S1NewAreaB/fS1Sigmas)),
S1NewMeanB+(2*(S1NewAreaB/fS1Sigmas)));
ySxcov = new TH2F("ySxcov","ySxcov",100,YNewMeanB-(2*(YNewAreaB/fYSigmas)),
YNewMeanB+(2*(YNewAreaB/fYSigmas)),
100,S0NewMeanB-(2*(S0NewAreaB/fS0Sigmas)),
S0NewMeanB+(2*(S0NewAreaB/fS0Sigmas)));
SxSycov = new TH2F("SxSycov","SxSycov",100,S0NewMeanB-
(2*(S0NewAreaB/fS0Sigmas)),
S0NewMeanB+(2*(S0NewAreaB/fS0Sigmas)),
100,S1NewMeanB-(2*(S1NewAreaB/fS1Sigmas)),
S1NewMeanB+(2*(S1NewAreaB/fS1Sigmas)));
if(fNumMods==3){
rotaux = fRotMat[1].inverse();
transaux = -(rotaux * fTranslation[1]);
rotaux2 = fRotMat[0].inverse() * fRotMat[1];
transaux2 = fRotMat[0].inverse()*fTranslation[1]-
fRotMat[0].inverse()*fTranslation[0];
}
else{
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
}
for (Int_t i=0;i<entries;i++) {
fHits->Clear();
fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
if(fNumMods>2) hitC = (HMdcHit*) fHits->At(2);
if(fNumMods==3){
mergeHits(hitC,hitB,fRotMat[0],fTranslation[0],hitBC);
projPoint = findProjPoint(hitBC,rotaux,transaux,projSlopes);
transformToSlopes(hitA,origSlopes);
xSxcov->Fill(hitA->getX()-projPoint.getX(),
origSlopes[0]-projSlopes[0]);
ySycov->Fill(hitA->getY()-projPoint.getY(),
origSlopes[1]-projSlopes[1]);
xycov->Fill(hitA->getX()-projPoint.getX(),
hitA->getY()-projPoint.getY());
xSycov->Fill(hitA->getX()-projPoint.getX(),
origSlopes[1]-projSlopes[1]);
ySxcov->Fill(hitA->getY()-projPoint.getY(),
origSlopes[0]-projSlopes[0]);
SxSycov->Fill(origSlopes[0]-projSlopes[0],
origSlopes[1]-projSlopes[1]);
}
else{
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
transformToSlopes(hitA,origSlopes);
xSxcov->Fill(hitA->getX()-projPoint.getX(),
origSlopes[0]-projSlopes[0]);
ySycov->Fill(hitA->getY()-projPoint.getY(),
origSlopes[1]-projSlopes[1]);
xycov->Fill(hitA->getX()-projPoint.getX(),
hitA->getY()-projPoint.getY());
xSycov->Fill(hitA->getX()-projPoint.getX(),
origSlopes[1]-projSlopes[1]);
ySxcov->Fill(hitA->getY()-projPoint.getY(),
origSlopes[0]-projSlopes[0]);
SxSycov->Fill(origSlopes[0]-projSlopes[0],
origSlopes[1]-projSlopes[1]);
}
}
Bool_t cutPassed=kFALSE;
Int_t modC = fLoc[3];
Float_t rhoxSx, rhoxSy, rhoySy, rhoxy, rho;
Float_t exponent;
rhoxSx=xSxcov->GetCorrelationFactor();
rhoySy=ySycov->GetCorrelationFactor();
rhoxSy=xSycov->GetCorrelationFactor();
rhoxy = xycov->GetCorrelationFactor();
if(fout)
*fout << endl << "Correlation factors (xy,SxSy,xSx,ySy,xSy,ySx): "
<< endl << xycov->GetCorrelationFactor() << " "
<< SxSycov->GetCorrelationFactor() << " "
<< rhoxSx << " " << rhoySy << " " << rhoxSy << " "
<< ySxcov->GetCorrelationFactor() << endl << endl;
fout->close();
delete fout;
delete xSxcov;
delete ySycov;
delete xycov;
delete xSycov;
delete ySxcov;
delete SxSycov;
fSigmaX = XNewAreaB/fXSigmas;
fSigmaY = YNewAreaB/fYSigmas;
fSigmaS0 = S0NewAreaB/fS1Sigmas;
fSigmaS1 = S1NewAreaB/fS0Sigmas;
fRhoxSx = rhoxSx;
fRhoySy = rhoySy;
fRhoxSy = rhoxSy;
fAlignAllCut->Reset();
fCountCut=0;
Float_t offsetY = 575;
Float_t sizeBin = 100;
if(modC==2){
offsetY = 910;
sizeBin = 191;
}
for(Int_t zo=0;zo<90;zo++) fEntriesPerZone[zo] = 0;
for (Int_t i=0;i<entries;i++) {
fHits->Clear();
fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
if(fNumMods>2) hitC = (HMdcHit*) fHits->At(2);
Float_t resInAvsBinBCS_X, resInAvsBinBCS_Y;
Float_t resInAvsBinBCS_XSlope, resInAvsBinBCS_YSlope;
Float_t resInBvsAinACS_X, resInBvsAinACS_Y;
Float_t resInBvsAinACS_XSlope, resInBvsAinACS_YSlope;
if(fNumMods==3){
mergeHits(hitB,hitA,rotaux2,transaux2,hitAB);
projPoint = findProjPoint(hitAB,fRotMat[0],fTranslation[0],projSlopes);
transformToSlopes(hitC,origSlopes);
resInAvsBinBCS_X = hitC->getX() - projPoint.getX();
resInAvsBinBCS_Y = hitC->getY() - projPoint.getY();
resInAvsBinBCS_XSlope = origSlopes[0] - projSlopes[0];
resInAvsBinBCS_YSlope = origSlopes[1] - projSlopes[1];
mergeHits(hitC,hitB,fRotMat[0],fTranslation[0],hitBC);
projPoint = findProjPoint(hitBC,rotaux,transaux,projSlopes);
resInBvsAinACS_X = hitA->getX() - projPoint.getX();
resInBvsAinACS_Y = hitA->getY() - projPoint.getY();
transformToSlopes(hitA,origSlopes);
resInBvsAinACS_XSlope = origSlopes[0] - projSlopes[0];
resInBvsAinACS_YSlope = origSlopes[1] - projSlopes[1];
}
else {
projPoint = findProjPoint(hitA,fRotMat[0],fTranslation[0],projSlopes);
resInAvsBinBCS_X = hitB->getX() - projPoint.getX();
resInAvsBinBCS_Y = hitB->getY() - projPoint.getY();
transformToSlopes(hitB,origSlopes);
resInAvsBinBCS_XSlope = origSlopes[0] - projSlopes[0];
resInAvsBinBCS_YSlope = origSlopes[1] - projSlopes[1];
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
resInBvsAinACS_X = hitA->getX() - projPoint.getX();
resInBvsAinACS_Y = hitA->getY() - projPoint.getY();
transformToSlopes(hitA,origSlopes);
resInBvsAinACS_XSlope = origSlopes[0] - projSlopes[0];
resInBvsAinACS_YSlope = origSlopes[1] - projSlopes[1];
}
if(A_DEBUG>3){
cout << endl <<"Cuts in fitHistograms(): " << endl;
cout << fabs(resInAvsBinBCS_X - XNewMeanA) << " vs "
<< XNewAreaA << endl;
cout << fabs(resInAvsBinBCS_Y - YNewMeanA) << " vs "
<< YNewAreaA << endl;
cout << fabs(resInAvsBinBCS_XSlope - S0NewMeanA) << " vs "
<< S0NewAreaA << endl;
cout << fabs(resInAvsBinBCS_YSlope - S1NewMeanA) << " vs "
<< S1NewAreaA << endl;
cout << fabs(resInBvsAinACS_X - XNewMeanB) << " vs "
<< XNewAreaB << endl;
cout << fabs(resInBvsAinACS_Y - YNewMeanB) << " vs "
<< YNewAreaB << endl;
cout << fabs(resInBvsAinACS_XSlope - S0NewMeanB) << " vs "
<< S0NewAreaB << endl;
cout << fabs(resInBvsAinACS_YSlope - S1NewMeanB) << " vs "
<< S1NewAreaB << endl;
}
cutPassed=kFALSE;
if(fUseSharpCut){
if(fabs(resInAvsBinBCS_X - XNewMeanA) < XNewAreaA &&
fabs(resInAvsBinBCS_Y - YNewMeanA) < YNewAreaA &&
fabs(resInAvsBinBCS_XSlope - S0NewMeanA) < S0NewAreaA &&
fabs(resInAvsBinBCS_YSlope - S1NewMeanA) < S1NewAreaA &&
fabs(resInBvsAinACS_X - XNewMeanB) < XNewAreaB &&
fabs(resInBvsAinACS_Y - YNewMeanB) < YNewAreaB &&
fabs(resInBvsAinACS_XSlope - S0NewMeanB) < S0NewAreaB &&
fabs(resInBvsAinACS_YSlope - S1NewMeanB) < S1NewAreaB ) {
cutPassed=kTRUE;
}
}
else{
if(fNumMods==3){
exponent = (1/(1-rhoxy*rhoxy)) *
( ((resInBvsAinACS_X-XNewMeanB)*(resInBvsAinACS_X-XNewMeanB))/
((XNewAreaB/fXSigmas)*(XNewAreaB/fXSigmas)) -
((2*rhoxy)*
((resInBvsAinACS_X-XNewMeanB)*(resInBvsAinACS_Y-YNewMeanB)))/
((XNewAreaB/fXSigmas)*(YNewAreaB/fYSigmas)) +
((resInBvsAinACS_Y-YNewMeanB)*(resInBvsAinACS_Y-YNewMeanB))/
((YNewAreaB/fYSigmas)*(YNewAreaB/fYSigmas)) );
if(exponent<pow(fXSigmas,2)) cutPassed=kTRUE;
}
else {
rho = 1 - rhoxSy*rhoxSy - rhoxSx*rhoxSx
- rhoySy*rhoySy - rhoxSx*rhoxSx*rhoySy*rhoySy;
exponent = (1/rho) *
( ( (-2 * rhoxSy*rhoxSy * (resInBvsAinACS_X-XNewMeanB) *
(resInBvsAinACS_YSlope-S1NewMeanB)) /
((XNewAreaB/fXSigmas)*(S1NewAreaB/fS1Sigmas)) ) +
(1 - rhoySy*rhoySy) *
( (((resInBvsAinACS_X-XNewMeanB)*(resInBvsAinACS_X-XNewMeanB))/
((XNewAreaB/fXSigmas)*(XNewAreaB/fXSigmas))) -
((2 * rhoxSx * (resInBvsAinACS_X-XNewMeanB) *
(resInBvsAinACS_XSlope-S0NewMeanB)) /
((XNewAreaB/fXSigmas)*(S0NewAreaB/fS0Sigmas))) ) +
(1 - rhoxSy*rhoxSy - rhoySy*rhoySy) *
(((resInBvsAinACS_XSlope-S0NewMeanB)*
(resInBvsAinACS_XSlope-S0NewMeanB))/
((S0NewAreaB/fS0Sigmas)*(S0NewAreaB/fS0Sigmas))) +
(1 - rhoxSx*rhoxSx) *
( (((resInBvsAinACS_Y-YNewMeanB)*(resInBvsAinACS_Y-YNewMeanB))/
((YNewAreaB/fYSigmas)*(YNewAreaB/fYSigmas))) -
((2 * rhoySy * (resInBvsAinACS_Y-YNewMeanB) *
(resInBvsAinACS_YSlope-S1NewMeanB)) /
((YNewAreaB/fYSigmas)*(S1NewAreaB/fS1Sigmas))) ) +
(1 - rhoxSy*rhoxSy - rhoxSx*rhoxSx) *
(((resInBvsAinACS_Y-YNewMeanB)*(resInBvsAinACS_Y-YNewMeanB))/
((YNewAreaB/fYSigmas)*(YNewAreaB/fYSigmas))) );
if(exponent<pow(fXSigmas,4)) cutPassed=kTRUE;
}
}
if(fSetHomogeneousDistribution==kTRUE){
if(cutPassed==kTRUE){
Int_t binZone = (int)floor((hitC->getY()+offsetY)/sizeBin);
binZone += 10 * (int)floor(fabs((hitC->getX()+(sizeBin/2))/sizeBin));
if((hitC->getX()+(sizeBin/2))<0) binZone += 50;
if(binZone>-1 && binZone<90){
fEntriesPerZone[binZone]++;
if(binZone == 22 || binZone == 35 || binZone == 48 ||
binZone == 62 || binZone == 75 || binZone == 88){
if(fEntriesPerZone[binZone]>(fMaxEntriesPerZone/4))
cutPassed=kFALSE;
}
if(binZone == 89 || binZone == 76 || binZone == 63 ||
binZone == 50 || binZone == 10 || binZone == 23 ||
binZone == 36 || binZone == 49 ){
if(fEntriesPerZone[binZone]>(fMaxEntriesPerZone/2))
cutPassed=kFALSE;
}
if(binZone == 11 || binZone == 24 || binZone == 37 ||
binZone == 77 || binZone == 64 || binZone == 51){
if(fEntriesPerZone[binZone]>((3*fMaxEntriesPerZone)/4))
cutPassed=kFALSE;
}
else {
if(fEntriesPerZone[binZone]>fMaxEntriesPerZone)
cutPassed=kFALSE;
}
}
}
}
if(cutPassed==kTRUE){
if(fUseSlopeCut){
if(fNumMods==2){
if(fSlopeCut>0){
if(( fabs(hitB->getXDir()) < fSlopeCut) &&
( fabs(hitB->getYDir()) < fSlopeCut)){
if(A_DEBUG>3) cout << " -- CUT PASSED (fSlopeCut="
<< fSlopeCut << " ) --" << endl;
fAlignAllCut->Fill();
fHits->Clear();
fCountCut++;
}
}
else{
if(( fabs(hitB->getXDir()) > -fSlopeCut) &&
( fabs(hitB->getYDir()) > -fSlopeCut)){
if(A_DEBUG>3) cout << " -- CUT PASSED (fSlopeCut="
<< fSlopeCut << " ) --" << endl;
fAlignAllCut->Fill();
fHits->Clear();
fCountCut++;
}
}
}
else if(fNumMods==3){
if(fSlopeCut>0){
if(( fabs(hitA->getXDir()+hitB->getXDir()+hitC->getXDir()/3)
< fSlopeCut) &&
( fabs(hitA->getYDir()+hitB->getYDir()+hitC->getYDir()/3)
< fSlopeCut)){
if(A_DEBUG>3) cout << " -- CUT PASSED (fSlopeCut="
<< fSlopeCut << " ) --" << endl;
fAlignAllCut->Fill();
fHits->Clear();
fCountCut++;
}
}
else{
if(( fabs(hitA->getXDir()+hitB->getXDir()+hitC->getXDir()/3)
> -fSlopeCut) &&
( fabs(hitA->getYDir()+hitB->getYDir()+hitC->getYDir()/3)
> -fSlopeCut)){
if(A_DEBUG>3) cout << " -- CUT PASSED (fSlopeCut="
<< fSlopeCut << " ) --" << endl;
fAlignAllCut->Fill();
fHits->Clear();
fCountCut++;
}
}
}
}
else{
if(A_DEBUG>3) cout << " --------- CUT PASSED ------------" << endl;
fAlignAllCut->Fill();
fHits->Clear();
fCountCut++;
}
}
}
delete f1X;
delete f1Y;
delete f1S;
delete totalX;
delete totalY;
delete totalS;
delete[] projSlopes;
delete[] origSlopes;
}
}
void HMdcAligner::setTree(void)
{
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
fRecCount++;
Char_t title[50], tmp[50], tmp2[50];
if(!fOutRoot) fOutRoot = new TFile(fNameRoot,"UPDATE");
if (fNumMods>3){
Int_t modC = fLoc[3];
Int_t modD = fLoc[4];
sprintf(title,"%s%i%s%i%s%i%s%i%s%i","Sector_",sector,"_ModA_",modA,
"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i%s%i","All","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
sprintf(tmp2,"%s%s%i%s%i%s%i%s%i%s%i","AllCut","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
}
else if(fNumMods>2){
Int_t modC = fLoc[3];
sprintf(title,"%s%i%s%i%s%i%s%i","Sector_",sector,"_ModA_",modA,
"_ModB_",modB,"_ModC_",modC);
sprintf(tmp,"%s%s%i%s%i%s%i%s%i","All","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
sprintf(tmp2,"%s%s%i%s%i%s%i%s%i","AllCut","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB,"_ModC_",modC);
}
else{
sprintf(title,"%s%i%s%i%s%i","Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
sprintf(tmp,"%s%s%i%s%i%s%i","All","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
sprintf(tmp2,"%s%s%i%s%i%s%i","AllCut","_Sector_",sector,
"_ModA_",modA,"_ModB_",modB);
}
fAlignAll = new TTree(tmp,title);
fAlignAll->Branch("hits",&fHits);
fAlignAllCut = new TTree(tmp2,title);
fAlignAllCut->Branch("hits",&fHits);
}
Bool_t HMdcAligner::init(void)
{
fHitCat=gHades->getCurrentEvent()->getCategory(catMdcHit);
if (!fHitCat) {
fHitCat=gHades->getSetup()->getDetector("Mdc")->buildCategory(catMdcHit);
if (!fHitCat) return kFALSE;
else gHades->getCurrentEvent()->addCategory(catMdcHit,fHitCat,"Mdc");
}
fIter1 = (HIterator *)fHitCat->MakeIterator();
fIter2 = (HIterator *)fHitCat->MakeIterator();
fIter3 = (HIterator *)fHitCat->MakeIterator();
fIter4 = (HIterator *)fHitCat->MakeIterator();
setParContainers();
if(fNumMods == 1) return kTRUE;
if(fHistoOff!=kTRUE) setHistograms();
else setTree();
return kTRUE;
}
Bool_t HMdcAligner::reinit(void)
{
if(fNumMods == 1) return kTRUE;
if(fAuto == kFALSE) setGeomAuxPar();
else if(fAuto == kTRUE) ;
return kTRUE;
}
void HMdcAligner::setCloseToSolution(void)
{
fCloseToSolution =kTRUE;
}
void HMdcAligner::setGeomParAutoOn(void)
{
fAuto =kTRUE;
cout << "WARNING in HMdcAligner::setGeomParAutoOn(): "
<< "introducing manually Geometrical" << endl;
cout << "Parameters without containers. "
<< "Parameters should be in the macro" << endl;
}
void HMdcAligner::setControlHistoOff(void)
{
fHistoOff = kTRUE;
}
void HMdcAligner::setMinimization(Int_t select)
{
fMin = select;
}
void HMdcAligner::setUnitErrors(void)
{
fUseUnitErrors = kTRUE;
}
void HMdcAligner::setOffCov(void)
{
fDoNotUseCov = kTRUE;
}
void HMdcAligner::setSharpCut(void)
{
fUseSharpCut = kTRUE;
}
void HMdcAligner::setTargetOn(HGeomVector target)
{
fUseTarget = kTRUE;
fTargetPos = target;
}
void HMdcAligner::setHomogeneousDistribution(Int_t maxEntries)
{
fSetHomogeneousDistribution = kTRUE;
fMaxEntriesPerZone = maxEntries;
}
void HMdcAligner::setFix(Int_t fix)
{
fFix = fix;
}
void HMdcAligner::setNoCut(void)
{
fUseCut = kFALSE;
}
void HMdcAligner::setCutRot(void)
{
fUseCutRot = kTRUE;
}
void HMdcAligner::setCutRotZ(void)
{
fUseCutRotZ = kTRUE;
}
void HMdcAligner::setNoZones(void)
{
fUseZones = kFALSE;
}
void HMdcAligner::setSlopeCut(Float_t SlopeCut)
{
fUseSlopeCut = kTRUE;
fSlopeCut = SlopeCut;
}
void HMdcAligner::setParContainers(void)
{
fMdcGeomPar=(HMdcGeomPar*)gHades->getRuntimeDb()->getContainer("MdcGeomPar");
}
void HMdcAligner::setGeomAuxPar(void)
{
Int_t sector = fLoc[0];
Int_t moduleA = fLoc[1];
Int_t moduleB = fLoc[2];
HGeomVector euler;
HGeomTransform transformA;
transformA = fMdcGeomPar->getModule(sector,moduleA)->getLabTransform();
HGeomTransform transformB;
transformB = fMdcGeomPar->getModule(sector,moduleB)->getLabTransform();
HGeomRotation rotA;
rotA = transformA.getRotMatrix();
HGeomVector vectorA;
vectorA = transformA.getTransVector();
HGeomRotation rotB;
rotB = transformB.getRotMatrix();
HGeomVector vectorB;
vectorB = transformB.getTransVector();
if(fNumMods>3){
Int_t moduleC = fLoc[3];
Int_t moduleD = fLoc[4];
HGeomTransform transformC;
transformC = fMdcGeomPar->getModule(sector,moduleC)->getLabTransform();
HGeomTransform transformD;
transformD = fMdcGeomPar->getModule(sector,moduleD)->getLabTransform();
HGeomRotation rotC;
rotC = transformC.getRotMatrix();
HGeomVector vectorC;
vectorC = transformC.getTransVector();
HGeomRotation rotD;
rotD = transformD.getRotMatrix();
HGeomVector vectorD;
vectorD = transformD.getTransVector();
if(A_DEBUG>0){
cout << endl <<"Debugging output in HMdcAligner::setGeomAuxPar" << endl;
cout << "Original transformation from container" << endl;
cout << " ------ SECTOR " << sector << " ------ " << endl;
cout << "MDC A (Module " << moduleA << ")" << endl;
transformA.print();
cout << "MDC B (Module " << moduleB << ")" << endl;
transformB.print();
cout << "MDC C (Module " << moduleC << ")" << endl;
transformC.print();
cout << "MDC D (Module " << moduleD << ")" << endl;
transformD.print();
}
HGeomRotation rotDinv = rotD.inverse();
HGeomRotation relrot = rotDinv * rotC;
HGeomVector relvector = rotDinv * (vectorC - vectorD);
if(A_DEBUG>0){
cout << endl <<"Relative transformation: (MDCC -> MDCD)" << endl;
relrot.print();
relvector.print();
}
euler = findEulerAngles(relrot);
fillRotMatrix(0,euler.getX(),euler.getY(),euler.getZ());
fillTranslation(0,relvector.getX(),relvector.getY(),relvector.getZ());
setEulerAngles(0,euler.getX(),euler.getY(),euler.getZ());
relrot = rotDinv * rotB;
relvector = rotDinv * (vectorB - vectorD);
if(A_DEBUG>0){
cout << endl <<"Relative transformation: (MDCB -> MDCD)" << endl;
relrot.print();
relvector.print();
}
euler = findEulerAngles(relrot);
fillRotMatrix(1,euler(0),euler(1),euler(2));
fillTranslation(1,relvector.getX(),relvector.getY(),relvector.getZ());
setEulerAngles(1,euler(0),euler(1),euler(2));
relrot = rotDinv * rotA;
relvector = rotDinv * (vectorA - vectorD);
if(A_DEBUG>0){
cout << endl <<"Relative transformation: (MDCA -> MDCD)" << endl;
relrot.print();
relvector.print();
}
euler = findEulerAngles(relrot);
fillRotMatrix(2,euler(0),euler(1),euler(2));
fillTranslation(2,relvector.getX(),relvector.getY(),relvector.getZ());
setEulerAngles(2,euler(0),euler(1),euler(2));
cout << "**************************************************" << endl;
cout << "* HMdcAligner::setGeomAuxPar: from geom params: *" << endl;
cout << "* Sector: "<< sector << " ModA: " << moduleA
<< " ModB: " << moduleB << " ModC: " << moduleC
<< " ModD: " << moduleD << endl;
for(Int_t c=0;c<3;c++){
cout << "* Rotation(" << c << "): " << fEuler[c].getX() << ", "
<< fEuler[c].getY() << ", " << fEuler[c].getZ() << endl;
cout << "* Translation(" << c << "): " << fTranslation[c].getX()
<< ", " << fTranslation[c].getY()
<< ", " << fTranslation[c].getZ() << endl;
}
cout << "**************************************************" << endl;
}
else if(fNumMods>2){
Int_t moduleC = fLoc[3];
HGeomTransform transformC;
transformC = fMdcGeomPar->getModule(sector,moduleC)->getLabTransform();
HGeomRotation rotC;
rotC = transformC.getRotMatrix();
HGeomVector vectorC;
vectorC = transformC.getTransVector();
if(A_DEBUG>0){
cout << endl <<"Debugging output in HMdcAligner::setGeomAuxPar" << endl;
cout << "Original transformation from container" << endl;
cout << " ------ SECTOR " << sector << " ------ " << endl;
cout << "MDC A (Module " << moduleA << ")" << endl;
transformA.print();
cout << "MDC B (Module " << moduleB << ")" << endl;
transformB.print();
cout << "MDC C (Module " << moduleC << ")" << endl;
transformC.print();
}
HGeomRotation rotCinv = rotC.inverse();
HGeomRotation relrot = rotCinv * rotB;
HGeomVector relvector = rotCinv * (vectorB - vectorC);
if(A_DEBUG>0){
cout << endl <<"Relative transformation: (MDCB -> MDCC)" << endl;
relrot.print();
relvector.print();
}
euler = findEulerAngles(relrot);
fillRotMatrix(0,euler(0),euler(1),euler(2));
fillTranslation(0,relvector.getX(),relvector.getY(),relvector.getZ());
setEulerAngles(0,euler(0),euler(1),euler(2));
relrot = rotCinv * rotA;
relvector = rotCinv * (vectorA - vectorC);
if(A_DEBUG>0){
cout << endl <<"Relative transformation: (MDCA -> MDCC)" << endl;
relrot.print();
relvector.print();
}
euler = findEulerAngles(relrot);
fillRotMatrix(1,euler(0),euler(1),euler(2));
fillTranslation(1,relvector.getX(),relvector.getY(),relvector.getZ());
setEulerAngles(1,euler(0),euler(1),euler(2));
cout << "**************************************************" << endl;
cout << "* HMdcAligner::setGeomAuxPar: from geom params: *" << endl;
cout << "* Sector: "<< sector << " ModA: " << moduleA
<< " ModB: " << moduleB << " ModC: " << moduleC << endl;
for(Int_t c=0;c<2;c++){
cout << "* Rotation(" << c << "): " << fEuler[c].getX() << ", "
<< fEuler[c].getY() << ", " << fEuler[c].getZ() << endl;
cout << "* Translation(" << c << "): " << fTranslation[c].getX()
<< ", " << fTranslation[c].getY()
<< ", " << fTranslation[c].getZ() << endl;
}
cout << "**************************************************" << endl;
}
else{
if(A_DEBUG>0){
cout << endl <<"Debugging output in HMdcAligner::setGeomAuxPar" << endl;
cout << "Original transformation from container" << endl;
cout << " ------ SECTOR " << sector << " ------ " << endl;
cout << "MDC A (Module " << moduleA << ")" << endl;
transformA.print();
cout << "MDC B (Module " << moduleB << ")" << endl;
transformB.print();
}
HGeomRotation rotBinv = rotB.inverse();
HGeomRotation relrot = rotBinv * rotA;
HGeomVector relvector = rotBinv * (vectorA - vectorB);
if(A_DEBUG>0){
cout << endl <<"Relative transformation: " << endl;
relrot.print();
relvector.print();
}
euler = findEulerAngles(relrot);
fillRotMatrix(0,euler(0),euler(1),euler(2));
fillTranslation(0,relvector.getX(),relvector.getY(),relvector.getZ());
setEulerAngles(0,euler(0),euler(1),euler(2));
cout << "**************************************************" << endl;
cout << "* HMdcAligner::setGeomAuxPar: from geom params: *" << endl;
cout << "* Sector: "<< sector << " ModA: " << moduleA
<< " ModB: " << moduleB << endl;
cout << "* Rotation(0): " << fEuler[0].getX() << ", "
<< fEuler[0].getY() << ", " << fEuler[0].getZ() << endl;
cout << "* Translation: " << relvector.getX() << ", "
<< relvector.getY() << " , " << relvector.getZ() << endl;
cout << "**************************************************" << endl;
}
}
HGeomVector HMdcAligner::findEulerAngles(HGeomRotation rot){
Double_t euler[3];
HGeomVector eul;
if(rot(8)< 0.99999 && rot(8)>-0.99999) euler[1] = acos(rot(8));
else euler[1]=0;
Double_t sinaux;
if(euler[1] == 0.){
euler[0]= (TMath::Pi()/2)+acos(rot(0));
euler[2]=-(TMath::Pi()/2);
}
else{
sinaux = sin(euler[1]);
euler[0] = atan2(rot(5)/sinaux,rot(2)/sinaux);
euler[2] = atan2(rot(7)/sinaux,-rot(6)/sinaux);
}
if(A_DEBUG>0){
cout << endl <<"Euler angles: " << euler[0] << ", "
<< euler[1] << ", " << euler[2] << endl;
}
HGeomRotation test;
test.setEulerAngles(euler[0]*180./TMath::Pi(),
euler[1]*180./TMath::Pi(),
euler[2]*180./TMath::Pi());
if(A_DEBUG>0){
cout << endl <<"Rotation from Euler angles (first attemp): " << endl;
test.print();
}
Double_t eps = 0.0001;
if( (fabs(test(0)-rot(0))>eps) || (fabs(test(1)-rot(1))>eps) ||
(fabs(test(3)-rot(3))>eps) || (fabs(test(4)-rot(4))>eps) ) {
if(A_DEBUG>0) cout << endl << "Bad election in first euler angle! "
<< "Trying again. "<< endl;
euler[1] = - euler[1];
sinaux = sin(euler[1]);
euler[0] = atan2(rot(5)/sinaux,rot(2)/sinaux);
euler[2] = atan2(rot(7)/sinaux,-rot(6)/sinaux);
test.setEulerAngles(euler[0]*180./TMath::Pi(),
euler[1]*180./TMath::Pi(),
euler[2]*180./TMath::Pi());
if(A_DEBUG>0){
cout << "Rotation from Euler angles (second attemp): " << endl;
test.print();
}
if( (fabs(test(0)-rot(0))>eps) || (fabs(test(1)-rot(1))>eps) ||
(fabs(test(3)-rot(3))>eps) || (fabs(test(4)-rot(4))>eps) ){
cout << endl << "FATAL ERROR: Bad election in euler angles! "<< endl;
cout << "Original rot matrix: "<< endl;
rot.print();
cout << "From obtained euler angles: " << endl;
test.print();
}
}
eul.setX(euler[0]);
eul.setY(euler[1]);
eul.setZ(euler[2]);
return eul;
}
void HMdcAligner::setGeomAuxParSim(Int_t ind, Float_t eu1, Float_t eu2,
Float_t eu3, Float_t tr1,
Float_t tr2, Float_t tr3)
{
cout << "WARNING: Introducing automatically Geometrical" << endl;
cout << "Parameters without containers" << endl;
fillRotMatrix(ind,eu1,eu2,eu3);
fillTranslation(ind,tr1,tr2,tr3);
setEulerAngles(ind,eu1,eu2,eu3);
if(A_DEBUG>0){
cout << "Transformation[" << ind << "]:" << endl;
cout <<" Euler angles: " << eu1 << ", "
<< eu2 << ", " << eu3 << endl;
cout << " Translation: " << tr1 << ", "
<< tr2 << ", " << tr3 << endl;
}
}
Int_t HMdcAligner::execute(void)
{
if(fNumMods==1) execute1();
if(fNumMods==2) execute2();
if(fNumMods==3) execute3();
if(fNumMods==4) execute4();
return 0;
}
void HMdcAligner::execute4(void)
{
HMdcHit* pHitA;
HMdcHit* pHitB;
HMdcHit* pHitC;
HMdcHit* pHitD;
HMdcHit* pHitCD = new HMdcHit;
HMdcHit* pHitBCD = new HMdcHit;
HMdcHit* pHitABCD = new HMdcHit;
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
Int_t modC = fLoc[3];
Int_t modD = fLoc[4];
HLocation local;
local.setNIndex(2);
local.set(2,sector,modD);
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
Bool_t usedA = kFALSE;
Bool_t usedB = kFALSE;
Bool_t usedC = kFALSE;
Bool_t invalidA = kFALSE;
Bool_t invalidB = kFALSE;
Bool_t invalidC = kFALSE;
fNEntries++;
fIter1->Reset();
fIter1->gotoLocation(local);
while ((pHitD =(HMdcHit*)fIter1->Next()) != 0){
if(pHitD->getChi2()>0)
{
fHitsMdc[0]++;
usedA = kFALSE;
usedB = kFALSE;
usedC = kFALSE;
invalidA = kFALSE;
invalidB = kFALSE;
invalidC = kFALSE;
if(A_DEBUG>3) {
cout << " ----- SECTOR " << sector << " -----"<< endl;
cout << "Module " << modD << ", fHitsMdc " << fHitsMdc[0]
<< endl;
}
HGeomRotation rotInv = fRotMat[0].inverse();
HGeomVector trasInv = -(rotInv * fTranslation[0]);
projPoint = findProjPoint(pHitD,rotInv,trasInv,projSlopes);
local.set(2,sector,modC);
fIter2->Reset();
fIter2->gotoLocation(local);
while ((pHitC =(HMdcHit*)fIter2->Next()) != 0){
if(pHitC->getChi2()>0)
{
fHitsMdc[1]++;
if(A_DEBUG>3)
cout << "Module " << modC << ", fHitsMdc " << fHitsMdc[1] << endl;
if(isInsideWindow(1,pHitC,projPoint,projSlopes)&&
(invalidB!=kTRUE)&&(invalidA!=kTRUE)){
if(usedC == kFALSE){
usedC = kTRUE;
fHitsFoundInWindow[0]++;
fHitsFoundAndUnique[0]++;
mergeHits(pHitD,pHitC,fRotMat[0],fTranslation[0],pHitCD);
rotInv = fRotMat[1].inverse();
trasInv = -(rotInv * fTranslation[1]);
projPoint = findProjPoint(pHitCD,rotInv,trasInv,projSlopes);
local.set(2,sector,modB);
fIter3->Reset();
fIter3->gotoLocation(local);
while ((pHitB =(HMdcHit*)fIter3->Next()) != 0){
if(pHitB->getChi2()>0)
{
fHitsMdc[2]++;
if(A_DEBUG>3)
cout << "Module " << modB << ", fHitsMdc "
<< fHitsMdc[2] << endl;
if(isInsideWindow(0,pHitB,projPoint,projSlopes)&&(invalidA!=kTRUE)){
if(usedB == kFALSE){
usedB = kTRUE;
fHitsFoundInWindow[1]++;
fHitsFoundAndUnique[1]++;
mergeHits(pHitCD,pHitB,fRotMat[1],fTranslation[1],pHitBCD);
rotInv = fRotMat[2].inverse();
trasInv = -(rotInv * fTranslation[2]);
projPoint = findProjPoint(pHitBCD,rotInv,trasInv,projSlopes);
local.set(2,sector,modA);
fIter4->Reset();
fIter4->gotoLocation(local);
while ((pHitA =(HMdcHit*)fIter4->Next()) != 0){
if(pHitA->getChi2()>0)
{
fHitsMdc[3]++;
if(A_DEBUG>3)
cout << "Module " << modA << ", fHitsMdc "
<< fHitsMdc[3] << endl;
if(isInsideWindow(0,pHitA,projPoint,projSlopes)){
if(usedA == kFALSE){
usedA = kTRUE;
fHitsFoundInWindow[2]++;
fHitsFoundAndUnique[2]++;
fCount++;
mergeHits(pHitBCD,pHitA,fRotMat[2],
fTranslation[2],pHitABCD);
fHits->Clear();
new((*fHits)[0])HMdcHit(*pHitA);
new((*fHits)[1])HMdcHit(*pHitB);
new((*fHits)[2])HMdcHit(*pHitC);
new((*fHits)[3])HMdcHit(*pHitD);
}
else{
if(invalidA == kFALSE){
fCount--;
invalidA = kTRUE;
fDiscart[2]++;
fHitsFoundAndUnique[2]--;
}
}
}
}
}
}
else{
if(invalidB == kFALSE){
invalidB = kTRUE;
fDiscart[1]++;
fHitsFoundAndUnique[1]--;
}
}
}
}
}
}
else{
if(invalidC == kFALSE){
invalidC = kTRUE;
fDiscart[0]++;
fHitsFoundAndUnique[0]--;
}
}
}
}
}
if(usedC == kTRUE && invalidC != kTRUE &&
usedB == kTRUE && invalidB != kTRUE &&
usedA == kTRUE && invalidA != kTRUE){
fAlignAll->Fill();
fHits->Clear();
if(fCount%100 ==0) cout << "."<< flush;
}
}
}
if(pHitCD!=0) delete pHitCD;
if(pHitBCD!=0) delete pHitBCD;
if(pHitABCD!=0) delete pHitABCD;
if(projSlopes!=0) delete[] projSlopes;
}
void HMdcAligner::execute3(void)
{
HMdcHit* pHitA;
HMdcHit* pHitB;
HMdcHit* pHitC;
HMdcHit* pHitBC = new HMdcHit;
HMdcHit* pHitABC = new HMdcHit;
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
Int_t modC = fLoc[3];
HLocation local;
local.setNIndex(2);
local.set(2,sector,modC);
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
Bool_t usedA = kFALSE;
Bool_t usedB = kFALSE;
Bool_t invalidA = kFALSE;
Bool_t invalidB = kFALSE;
fNEntries++;
fIter1->Reset();
fIter1->gotoLocation(local);
while ((pHitC =(HMdcHit*)fIter1->Next()) != 0){
if(pHitC->getChi2()>0)
{
fHitsMdc[0]++;
usedA = kFALSE;
usedB = kFALSE;
invalidA = kFALSE;
invalidB = kFALSE;
if(A_DEBUG>3) {
cout << " ----- SECTOR " << sector << " -----"<< endl;
cout << "Module " << modC << ", fHitsMdc " << fHitsMdc[0]
<< endl;
}
HGeomRotation rotInv = fRotMat[0].inverse();
HGeomVector trasInv = -(rotInv * fTranslation[0]);
projPoint = findProjPoint(pHitC,rotInv,trasInv,projSlopes);
local.set(2,sector,modB);
fIter2->Reset();
fIter2->gotoLocation(local);
while ((pHitB =(HMdcHit*)fIter2->Next()) != 0 ){
if(pHitB->getChi2()>0)
{
fHitsMdc[1]++;
if(A_DEBUG>3)
cout << "Module " << modB << ", fHitsMdc " << fHitsMdc[1] << endl;
if(isInsideWindow(1,pHitB,projPoint,projSlopes)&&(invalidA!=kTRUE)){
if(usedB == kFALSE){
usedB = kTRUE;
fHitsFoundInWindow[0]++;
fHitsFoundAndUnique[0]++;
mergeHits(pHitC,pHitB,fRotMat[0],fTranslation[0],pHitBC);
rotInv = fRotMat[1].inverse();
trasInv = -(rotInv * fTranslation[1]);
projPoint = findProjPoint(pHitBC,rotInv,trasInv,projSlopes);
local.set(2,sector,modA);
fIter3->Reset();
fIter3->gotoLocation(local);
while ((pHitA =(HMdcHit*)fIter3->Next()) != 0){
if(pHitA->getChi2()>0)
{
fHitsMdc[2]++;
if(A_DEBUG>3)
cout << "Module " << modB << ", fHitsMdc "
<< fHitsMdc[1] << endl;
if(isInsideWindow(0,pHitA,projPoint,projSlopes)){
if(usedA == kFALSE){
usedA = kTRUE;
fHitsFoundInWindow[1]++;
fHitsFoundAndUnique[1]++;
fCount++;
mergeHits(pHitBC,pHitA,fRotMat[1],
fTranslation[1],pHitABC );
fHits->Clear();
new((*fHits)[0])HMdcHit(*pHitA);
new((*fHits)[1])HMdcHit(*pHitB);
new((*fHits)[2])HMdcHit(*pHitC);
}
else{
if(invalidA == kFALSE){
fCount--;
invalidA = kTRUE;
fDiscart[1]++;
fHitsFoundAndUnique[1]--;
}
}
}
}
}
}
else{
if(invalidB == kFALSE){
invalidB = kTRUE;
fDiscart[0]++;
fHitsFoundAndUnique[0]--;
}
}
}
}
}
if(usedB == kTRUE && invalidB != kTRUE &&
usedA == kTRUE && invalidA != kTRUE){
fAlignAll->Fill();
fHits->Clear();
if(fCount%100 ==0) cout << "."<< flush;
}
}
}
if(pHitBC!=0) delete pHitBC;
if(pHitABC!=0) delete pHitABC;
if(projSlopes!=0) delete[] projSlopes;
}
void HMdcAligner::execute2(void)
{
HMdcHit* pHitA;
HMdcHit* pHitB;
HMdcHit* pHitAB = new HMdcHit;
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
HLocation local;
local.setNIndex(2);
local.set(2,sector,modB);
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
Bool_t usedA = kFALSE;
Bool_t invalidA = kFALSE;
fNEntries++;
fIter1->Reset();
fIter1->gotoLocation(local);
while ((pHitB =(HMdcHit*)fIter1->Next()) != 0){
if(pHitB->getChi2()>0)
{
fHitsMdc[0]++;
usedA = kFALSE;
invalidA = kFALSE;
if(A_DEBUG>3) {
cout << " ----- SECTOR " << sector << " -----"<< endl;
cout << "Module " << modB << ", fHitsMdc " << fHitsMdc[0]
<< endl;
}
HGeomRotation rotInv = fRotMat[0].inverse();
HGeomVector trasInv = -(rotInv * fTranslation[0]);
projPoint = findProjPoint(pHitB,rotInv,trasInv,projSlopes);
local.set(2,sector,modA);
fIter2->Reset();
fIter2->gotoLocation(local);
while ((pHitA =(HMdcHit*)fIter2->Next()) != 0){
if(pHitA->getChi2()>0)
{
fHitsMdc[1]++;
if(A_DEBUG>3)
cout << "Module " << modA << ", fHitsMdc "
<< fHitsMdc[1] << endl;
if(isInsideWindow(1,pHitA,projPoint,projSlopes)){
if(usedA == kFALSE){
usedA = kTRUE;
fHitsFoundInWindow[0]++;
fHitsFoundAndUnique[0]++;
fCount++;
mergeHits(pHitB,pHitA,fRotMat[0],
fTranslation[0],pHitAB);
fHits->Clear();
new((*fHits)[0])HMdcHit(*pHitA);
new((*fHits)[1])HMdcHit(*pHitB);
}
else{
if(invalidA == kFALSE){
fCount--;
invalidA = kTRUE;
fDiscart[0]++;
fHitsFoundAndUnique[0]--;
}
}
}
}
}
if(usedA == kTRUE && invalidA != kTRUE){
fAlignAll->Fill();
fHits->Clear();
if(fCount%100 ==0) cout << "."<< flush;
}
}
}
if(pHitAB!=0) delete pHitAB;
if(projSlopes!=0) delete[] projSlopes;
}
void HMdcAligner::execute1(void)
{
HMdcHit* pHitA;
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
HLocation local;
local.setNIndex(2);
local.set(2,sector,modA);
fIter1->Reset();
fIter1->gotoLocation(local);
while ((pHitA =(HMdcHit*)fIter1->Next()) != 0){
if(pHitA->getChi2()>0)
{
new((*fHits)[0])HMdcHit(*pHitA);
fAlignAll->Fill();
fHits->Clear();
}
}
}
void HMdcAligner::transfEuler(HGeomRotation eulrot,HGeomVector eulvec,
HGeomVector oldV, HGeomVector newV){
newV = eulrot * oldV + eulvec;
}
void HMdcAligner::transfEulerInv(HGeomRotation eulrot,HGeomVector eulvec,
HGeomVector oldV, HGeomVector newV){
newV = eulrot * (oldV - eulvec);
}
HGeomVector HMdcAligner::findProjPoint(HMdcHit* pHit, HGeomRotation rot,
HGeomVector tra, Float_t* slopes)
{
HGeomVector newvec;
Float_t x, y, s0=0, s1=0;
Float_t xDir, yDir, aux, den;
Float_t zsearch, xsearch, ysearch;
x = pHit->getX();
y = pHit->getY();
if(fUseTarget) {
if(pHit->getModule() != fLoc[2]){
HGeomVector targetInOtherMdc,transaux;
HGeomRotation rotaux;
rotaux = rot.inverse();
transaux = -(rotaux * tra);
targetInOtherMdc = rotaux * fTargetPos + transaux;
s0 = (x-targetInOtherMdc.getX())/(-targetInOtherMdc.getZ());
s1 = (y-targetInOtherMdc.getY())/(-targetInOtherMdc.getZ());
}
else{
s0 = (x-fTargetPos.getX())/(-fTargetPos.getZ());
s1 = (y-fTargetPos.getY())/(-fTargetPos.getZ());
}
}
else{
xDir = pHit->getXDir();
yDir = pHit->getYDir();
aux = sqrt(1 - xDir * xDir - yDir * yDir);
if(aux == 0.){ s0=1; s1=1;}
else{
s0 = xDir/aux;
s1 = yDir/aux;
}
}
if(A_DEBUG>3){
cout << "VALID MDC HIT: " << x << " " << y
<< " " << s0 << " " << s1 << endl;
}
zsearch = -(x*rot(6) + y*rot(7) + tra(2)) /
(rot(8) + s0*rot(6) + s1*rot(7));
xsearch = x*rot(0) + y*rot(1) + tra(0) +
zsearch*(s0*rot(0) + s1*rot(1) + rot(2));
ysearch = x*rot(3) + y*rot(4) + tra(1) +
zsearch*(s0*rot(3) + s1*rot(4) + rot(5));
den = s0*rot(6) + s1*rot(7) + rot(8);
if (den == 0) {
cout << "ERROR in HMdcAligner::findProjPoint()" << endl;
return newvec;
}
slopes[0] = (s0*rot(0) + s1*rot(1) + rot(2)) / den;
slopes[1] = (s0*rot(3) + s1*rot(4) + rot(5)) / den;
if(A_DEBUG>3){
cout << "Projected MDC HIT: " << xsearch << " " << ysearch
<< " " << slopes[0] << " " << slopes[1] << endl;
}
newvec.setX(xsearch);
newvec.setY(ysearch);
newvec.setZ(zsearch);
return newvec;
}
Bool_t HMdcAligner::isInsideWindow(Int_t plot, HMdcHit* pHit, HGeomVector point,
Float_t* slope){
Float_t xlolimit,xuplimit,ylolimit,yuplimit;
xlolimit = point.getX() - fXArea;
xuplimit = point.getX() + fXArea;
ylolimit = point.getY() - fYArea;
yuplimit = point.getY() + fYArea;
if(plot && (fHistoOff==kFALSE)){
Float_t x, y, s0, s1;
Float_t xDir, yDir, aux;
x = pHit->getX();
y = pHit->getY();
xDir = pHit->getXDir();
yDir = pHit->getYDir();
aux = sqrt(1 - xDir * xDir - yDir * yDir);
if(aux == 0.){ s0=1; s1=1;}
else{
s0 = xDir/aux;
s1 = yDir/aux;
}
fResX->Fill(x - point.getX());
fResY->Fill(y - point.getY());
fResS0->Fill(s0 - slope[0]);
fResS1->Fill(s1 - slope[1]);
}
if(A_DEBUG>3) cout << "MDC HIT: "
<< pHit->getX() << " " << pHit->getY();
if( (pHit->getX()>xlolimit) && (pHit->getX()<xuplimit) &&
(pHit->getY()>ylolimit) && (pHit->getY()<yuplimit)) {
if(A_DEBUG>3) cout << " inside window" << endl;
return kTRUE;
}
else {
if(A_DEBUG>3) cout << " outside window" << endl;
return kFALSE;
}
}
void HMdcAligner::mergeHits(HMdcHit* hitB, HMdcHit* hitA,
HGeomRotation rot,HGeomVector tra,
HMdcHit* mergeHit){
*mergeHit = *hitB;
HGeomVector pointA(hitA->getX(),hitA->getY(),0);
HGeomVector pointB(hitB->getX(),hitB->getY(),0);
HGeomVector pointAinB = rot * pointA +tra;
Float_t slopeX = (pointAinB.getX() - pointB.getX())/pointAinB.getZ();
Float_t slopeY = (pointAinB.getY() - pointB.getY())/pointAinB.getZ();
Float_t aux = sqrt(slopeX*slopeX + slopeY*slopeY+1);
mergeHit->setXYDir(slopeX/aux,0.1,slopeY/aux,0.1);
}
void HMdcAligner::transformToSlopes(HMdcHit* pHit, Float_t* slopes){
Float_t xDir,yDir;
Float_t aux;
xDir = pHit->getXDir();
yDir = pHit->getYDir();
aux = sqrt(1 - xDir * xDir - yDir * yDir);
if(aux == 0.){ slopes[0]=1; slopes[1]=1;}
else{
slopes[0] = xDir/aux;
slopes[1] = yDir/aux;
}
}
void HMdcAligner::findAbsolutePosition(HGeomRotation* rot, HGeomVector* vect){
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
Int_t modC=-1;
Int_t modD=-1;
if(fNumMods>2) modC = fLoc[3];
if(fNumMods>3) modD = fLoc[4];
HGeomTransform transformA,transformB,transformC,transformD;
transformA = fMdcGeomPar->getModule(sector,modA)->getLabTransform();
HGeomRotation rotOrigA,rotOrigB,rotOrigC,rotOrigD;
rotOrigA = transformA.getRotMatrix();
HGeomVector vectorOrigA,vectorOrigB,vectorOrigC,vectorOrigD;
vectorOrigA = transformA.getTransVector();
transformB = fMdcGeomPar->getModule(sector,modB)->getLabTransform();
rotOrigB = transformB.getRotMatrix();
vectorOrigB = transformB.getTransVector();
if(fNumMods>2){
transformC = fMdcGeomPar->getModule(sector,modC)
->getLabTransform();
rotOrigC = transformC.getRotMatrix();
vectorOrigC = transformC.getTransVector();
}
if(fNumMods>3){
transformD = fMdcGeomPar->getModule(sector,modD)
->getLabTransform();
rotOrigD = transformD.getRotMatrix();
vectorOrigD = transformD.getTransVector();
}
if(fNumMods>3) {
rot[0] = rotOrigD * fRotMat[0];
vect[0] = rotOrigD * fTranslation[0] + vectorOrigD;
rot[1] = rotOrigD * fRotMat[1];
vect[1] = rotOrigD * fTranslation[1] + vectorOrigD;
rot[2] = rotOrigD * fRotMat[2];
vect[2] = rotOrigD * fTranslation[2] + vectorOrigD;
if(A_DEBUG >2){
rot[0].print();
vect[0].print();
rot[1].print();
vect[1].print();
rot[2].print();
vect[2].print();
}
}
else if(fNumMods>2){
rot[0] = rotOrigC * fRotMat[0];
vect[0] = rotOrigC * fTranslation[0] + vectorOrigC;
rot[1] = rotOrigC * fRotMat[1];
vect[1] = rotOrigC * fTranslation[1] + vectorOrigC;
if(A_DEBUG >2){
rot[0].print();
vect[0].print();
rot[1].print();
vect[1].print();
}
}
else{
rot[0] = rotOrigB * fRotMat[0];
vect[0] = rotOrigB * fTranslation[0] + vectorOrigB;
if(A_DEBUG >2){
rot[0].print();
vect[0].print();
}
}
}
Bool_t HMdcAligner::finalize(void)
{
if(fNumMods==1) {
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
HGeomVector aPoint;
HGeomVector aVector;
HGeomVector theTarget;
HGeomVector oldTarget;
Float_t third;
Float_t part1, part2, part3, numera,denomi, distRel, disTarget;
Float_t weigth = 1;
Float_t t;
Float_t angularError = 0.05 ;
HMdcHit* pHitA;
Stat_t entries;
Int_t cont=0;
HGeomVertexFit* targetFinder= new HGeomVertexFit();
targetFinder->reset();
entries = fAlignAll->GetEntries();
for (Int_t i=0;i<entries;i++) {
fAlignAll->GetEntry(i);
pHitA = (HMdcHit*) fHits->At(0);
aPoint.setX(pHitA->getX());
aPoint.setY(pHitA->getY());
aPoint.setZ(0.);
third = sqrt(1-pHitA->getXDir()*pHitA->getXDir()
-pHitA->getYDir()*pHitA->getYDir());
aVector.setX(pHitA->getXDir());
aVector.setY(pHitA->getYDir());
aVector.setZ(third);
cont++;
targetFinder->addLine(aPoint,aVector,1);
}
targetFinder->getVertex(theTarget);
cout << "###### TARGET FINDER RESULT #######" << endl;
cout << "Init Value (no weigth)" << endl;
cout << " Sector: " << sector
<< " Module: " << modA << endl;
theTarget.print();
cout << "Entries with weigth: " << cont;
while(fConstTukey>0.4){
targetFinder->reset();
cout << endl << "fConstTukey = " << fConstTukey << endl;
do{
targetFinder->reset();
oldTarget = theTarget;
cont =0;
for (Int_t i=0;i<entries;i++) {
fAlignAll->GetEntry(i);
pHitA = (HMdcHit*) fHits->At(0);
aPoint.setX(pHitA->getX());
aPoint.setY(pHitA->getY());
aPoint.setZ(0.);
third = sqrt(1-pHitA->getXDir()*pHitA->getXDir()
-pHitA->getYDir()*pHitA->getYDir());
aVector.setX(pHitA->getXDir());
aVector.setY(pHitA->getYDir());
aVector.setZ(third);
part1 = ((theTarget.getX()-aPoint.getX())*(aVector.getY()))
- ((theTarget.getY()-aPoint.getY())*(aVector.getX()));
part2 = ((theTarget.getY()-aPoint.getY())*(aVector.getZ()))
- ((theTarget.getZ()-aPoint.getZ())*(aVector.getY()));
part3 = ((theTarget.getZ()-aPoint.getZ())*(aVector.getX()))
- ((theTarget.getX()-aPoint.getX())*(aVector.getZ()));
numera = (part1*part1)+(part2*part2)+(part3*part3);
denomi = aVector.getX()*aVector.getX()
+ aVector.getY()*aVector.getY()
+ aVector.getZ()*aVector.getZ();
disTarget = sqrt(numera/denomi);
t = disTarget/(angularError*theTarget.getZ());
if(fabs(t)<fConstTukey){
weigth = (1-t*t/(fConstTukey*fConstTukey))
* (1-t*t/(fConstTukey*fConstTukey));
cont++;
}
else weigth = 0;
targetFinder->addLine(aPoint,aVector,weigth);
}
targetFinder->getVertex(theTarget);
theTarget.print();
cout << "Entries with weigth: " << cont;
distRel = sqrt( (theTarget.getX()-oldTarget.getX())*
(theTarget.getX()-oldTarget.getX()) +
(theTarget.getY()-oldTarget.getY())*
(theTarget.getY()-oldTarget.getY()) +
(theTarget.getZ()-oldTarget.getZ())*
(theTarget.getZ()-oldTarget.getZ()) );
}while(distRel>0.001);
if(fConstTukey>1)fConstTukey = fConstTukey-1.;
else fConstTukey = fConstTukey -0.5;
}
return kTRUE;
}
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
Int_t modC=-1;
Int_t modD=-1;
if(fNumMods>2) modC = fLoc[3];
if(fNumMods>3) modD = fLoc[4];
ofstream *fout=NULL;
if (fNameAscii) fout = new ofstream(fNameAscii.Data(), ios::app);
if (*fout){
*fout << endl << "Sector: " << sector << endl;
*fout << "Module A: " << modA << " Module B: " << modB ;
if(fNumMods>2) *fout << " Module C: " << modC;
if(fNumMods>3) *fout << " Module D: " << modD;
*fout << endl << endl;
*fout << "Number of events: " << fNEntries << endl;
*fout << "Window (mm): " << fXArea <<"," << fYArea << endl;
*fout << "Interpret smaller MDC index as last in the previous list"
<< endl << endl;
for(Int_t i=0;i<fNumMods;i++){
*fout << "Passing Hits in MDC[" << i << "]: " << fHitsMdc[i] << endl;
}
for(Int_t i=0;i<fNumMods-1;i++){
*fout << "Hits found in MDC[" << i << "] window: "
<< fHitsFoundInWindow[i] << endl;
*fout << "Hits found in MDC[" << i << "] window and unique: "
<< fHitsFoundAndUnique[i] << endl;
*fout << "Hits discarted in MDC[" << i << "] window: "
<< fDiscart[i] << endl;
}
*fout << "Valid hits for alignment: " << fCount << endl;
}
if(A_DEBUG>0){
cout << endl << "Sector: " << sector << endl;
cout << "Module A: " << modA << " Module B: " << modB ;
if(fNumMods>2) cout << " Module C: " << modC;
if(fNumMods>3) cout << " Module D: " << modD;
cout << endl << endl;
cout << "Number of events: " << fNEntries << endl;
cout << "Window (mm): " << fXArea <<"," << fYArea << endl;
cout << "Interpret smaller MDC index as last in the previous list"
<< endl << endl;
for(Int_t i=0;i<fNumMods;i++){
cout << "Passing Hits in MDC[" << i << "]: " << fHitsMdc[i] << endl;
}
for(Int_t i=0;i<fNumMods-1;i++){
cout << "Hits found in MDC[" << i << "] window: "
<< fHitsFoundInWindow[i] << endl;
cout << "Hits found in MDC[" << i << "] window and unique: "
<< fHitsFoundAndUnique[i] << endl;
cout << "Hits discarted in MDC[" << i << "] window: "
<< fDiscart[i] << endl;
}
cout << "Valid hits for alignment: " << fCount << endl;
}
HGeomRotation absRot[fNumMods-1];
HGeomVector absVect[fNumMods-1];
findAbsolutePosition(absRot,absVect);
if(*fout){
*fout << endl << "Individual transformations before "
<< "minimization (init values): " << endl;
*fout << "Interpret smaller MDC index as last in the previous list"
<< endl << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << "Module" << i << endl;
for(Int_t j=0;j<9;j++) *fout << absRot[i](j) << " " ;
*fout << endl;
for(Int_t j=0;j<3;j++) *fout << absVect[i](j) << " " ;
*fout << endl << endl;
}
}
if(A_DEBUG>0){
cout << endl << "Individual transformations before "
<< "minimization (init values): " << endl;
cout << "Interpret smaller MDC index as last in the previous list"
<< endl << endl;
for(Int_t i=0;i<fNumMods-1;i++){
cout << "Module" << i << endl;
absRot[i].print();
absVect[i].print();
}
}
if(fHistoOff!=kTRUE) {
fillHistograms(0);
fitHistograms(0);
fillHistograms(1,1);
}
if (*fout){
*fout << "Valid hits for alignment after cuts: "
<< fCountCut << endl << endl;
if(fSetHomogeneousDistribution){
*fout << "Homogeneous distribution; entries per zone: " << endl;
for (Int_t co=0;co<10;co++)
*fout<<fEntriesPerZone[89-co]<<" "<<fEntriesPerZone[79-co]<<" "
<<fEntriesPerZone[69-co]<<" "<<fEntriesPerZone[59-co]<<" "
<<fEntriesPerZone[9-co]<<" "<<fEntriesPerZone[19-co]<<" "
<<fEntriesPerZone[29-co]<<" "<<fEntriesPerZone[39-co]<<" "
<<fEntriesPerZone[49-co]<<endl;
}
*fout << endl << endl;
}
if(A_DEBUG>0) cout << "Valid hits for alignment after cuts: "
<< fCountCut << endl << endl;
if (*fout){
*fout << "Transformation before minimization (init values): " << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << fEuler[i].getX() << ", " << fEuler[i].getY() << ", "
<< fEuler[i].getZ() << ", " << fTranslation[i].getX() << ", "
<< fTranslation[i].getY() << ", " << fTranslation[i].getZ()
<< endl;
}
}
if(!fMin){
if (*fout) *fout << "Minimization strategy = 0: No minimization" << endl;
storeInFile();
fout->close();
delete fout;
return kTRUE;
}
if(fMin==1 || fMin==3 || fMin==4 || fMin==5 ||
fMin==100 || fMin==101 || fMin==105 || fMin==777){
if (*fout) *fout << "Multiple iteration on different accepted Hits distribution: "
<< fMin <<" with MINUIT" << endl;
Int_t IterCounter2 =0;
Float_t IterCri2;
HGeomVector OldEuler2[(fNumMods-1)];
HGeomVector OldTranslation2[(fNumMods-1)];
do{
IterCri2 = 0;
for(Int_t i=0;i<fNumMods-1;i++){
OldEuler2[i] = fEuler[i];
OldTranslation2[i] = fTranslation[i];
}
if (*fout) *fout << "Minimization strategy: "
<< fMin <<" with MINUIT" << endl;
HGeomVector OldEuler[(fNumMods-1)];
HGeomVector OldTranslation[(fNumMods-1)];
Int_t IterCounter =0;
Float_t IterCri;
do{
IterCri = 0;
for(Int_t i=0;i<fNumMods-1;i++){
OldEuler[i] = fEuler[i];
OldTranslation[i] = fTranslation[i];
}
minfit(fFix,fEuler,fTranslation);
if (*fout){
*fout << "Parameters after minimization " << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << fEuler[i].getX() << "+-" << fError[i*6] << ", "
<< fEuler[i].getY() << "+-" << fError[i*6+1] << ", "
<< fEuler[i].getZ() << "+-" << fError[i*6+2] << ", "
<< fTranslation[i].getX() << "+-" << fError[i*6+3] << ", "
<< fTranslation[i].getY() << "+-" << fError[i*6+4] << ", "
<< fTranslation[i].getZ() << "+-" << fError[i*6+5] << endl;
}
*fout << "Function value: " << fFunctionMin
<< " from ";
if(fUseCut) *fout << fCountCut << " combinations." << endl;
else *fout << fCount << " combinations." << endl;
*fout << endl;
}
if(fMin==777) break;
for(Int_t i=0;i<fNumMods-1;i++){
fillRotMatrix(i,fEuler[i].getX(),fEuler[i].getY(),fEuler[i].getZ());
}
for(Int_t i=0;i<fNumMods-1;i++){
if(fEuler[i].getX()!=0)
IterCri += fabs((fEuler[i].getX()-OldEuler[i].getX())/
fEuler[i].getX());
if(fEuler[i].getY()!=0)
IterCri += fabs((fEuler[i].getY()-OldEuler[i].getY())/
fEuler[i].getY());
if(fEuler[i].getZ()!=0)
IterCri += fabs((fEuler[i].getZ()-OldEuler[i].getZ())/
fEuler[i].getZ());
if(fTranslation[i].getX()!=0)
IterCri += fabs((fTranslation[i].getX()-OldTranslation[i].getX())/
fTranslation[i].getX());
if(fTranslation[i].getY()!=0)
IterCri += fabs((fTranslation[i].getY()-OldTranslation[i].getY())/
fTranslation[i].getY());
if(fTranslation[i].getZ()!=0)
IterCri += fabs((fTranslation[i].getZ()-OldTranslation[i].getZ())/
fTranslation[i].getZ());
if(A_DEBUG==0){
cout << i << "IterCri: " << IterCri << endl;
}
}
IterCounter++;
if(IterCounter>10) {
cout << "WARNING in HMdcAligner :: finalize" << endl;
cout << "Sector: " << sector << " ModuleA: "
<< modA << " ModuleB: " << modB << endl;
cout << "More than 10 iterations without results!" <<endl;
break;
}
}while(IterCri>fIterCriteria);
if(fMin==777) break;
for(Int_t i=0;i<fNumMods-1;i++){
if(fEuler[i].getX()!=0)
IterCri2 += fabs((fEuler[i].getX()-OldEuler2[i].getX())/
fEuler[i].getX());
if(fEuler[i].getY()!=0)
IterCri2 += fabs((fEuler[i].getY()-OldEuler2[i].getY())/
fEuler[i].getY());
if(fEuler[i].getZ()!=0)
IterCri2 += fabs((fEuler[i].getZ()-OldEuler2[i].getZ())/
fEuler[i].getZ());
if(fTranslation[i].getX()!=0)
IterCri2 += fabs((fTranslation[i].getX()-OldTranslation2[i].getX())/
fTranslation[i].getX());
if(fTranslation[i].getY()!=0)
IterCri2 += fabs((fTranslation[i].getY()-OldTranslation2[i].getY())/
fTranslation[i].getY());
if(fTranslation[i].getZ()!=0)
IterCri2 += fabs((fTranslation[i].getZ()-OldTranslation2[i].getZ())/
fTranslation[i].getZ());
if(A_DEBUG==0){
cout << i << "IterCri2: " << IterCri2 << endl;
}
}
IterCounter2++;
if(IterCounter2>100) {
cout << "WARNING in HMdcAligner :: finalize" << endl;
cout << "Sector: " << sector << " ModuleA: "
<< modA << " ModuleB: " << modB << endl;
cout << "More than 100 Double_t iterations without results!" <<endl;
break;
}
if(IterCri2>fIterCriteria){
fillHistograms(2);
fitHistograms(2);
if (*fout) {
*fout << "Valid hits for alignment after cuts: "
<< fCountCut << endl << endl;
if(fSetHomogeneousDistribution){
*fout << "Homogeneous distribution; entries per zone: " << endl;
for (Int_t co=0;co<10;co++)
*fout<<fEntriesPerZone[89-co]<<" "<<fEntriesPerZone[79-co]<<" "
<<fEntriesPerZone[69-co]<<" "<<fEntriesPerZone[59-co]<<" "
<<fEntriesPerZone[9-co]<<" "<<fEntriesPerZone[19-co]<<" "
<<fEntriesPerZone[29-co]<<" "<<fEntriesPerZone[39-co]<<" "
<<fEntriesPerZone[49-co]<<endl;
*fout << endl;
}
*fout << endl << endl;
}
if(A_DEBUG>0) cout << "Valid hits for alignment after cuts: "
<< fCountCut << endl << endl;
}
}while(IterCri2>fIterCriteria);
}
HGeomVector result;
if(fMin==2 || fMin==3){
result = translationFinder();
}
if(fMin==10 ||fMin==11 ||fMin==12){
if(fMin==11||fMin==12) result = translationFinder();
findRotZGeometrically();
if(fMin==11) result = translationFinder();
findRotXGeometrically();
if(fMin==11) result = translationFinder();
findRotYGeometrically();
if(fMin==11||fMin==12) result = translationFinder();
divideInZones(3,fRotMat[0],fTranslation[0]);
if (*fout){
*fout << endl <<"Parameters after GEOMETRIC rotation determination "
<< endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << fEuler[i].getX() << ", " << fEuler[i].getY() << ", "
<< fEuler[i].getZ() << ", " << fTranslation[i].getX() << ", "
<< fTranslation[i].getY() << ", " << fTranslation[i].getZ()
<< endl;
}
*fout << endl;
}
}
if(fMin==14 || fMin==15 || fMin==16){
if(fMin==15||fMin==16) result = translationFinder();
findRotZGeometrically();
if(fMin==15) result = translationFinder();
findRotXYBySampling(1);
if(fMin==15) result = translationFinder();
findRotXYBySampling(2);
if(fMin==15||fMin==16) result = translationFinder();
}
HGeomVector OldEuler[(fNumMods-1)];
HGeomVector OldTranslation[(fNumMods-1)];
Int_t IterCounter =0;
Float_t IterCri;
do{
IterCri = 0;
for(Int_t i=0;i<fNumMods-1;i++){
OldEuler[i] = fEuler[i];
OldTranslation[i] = fTranslation[i];
}
*fout << "Iterative procedure; iteration number " << IterCounter << endl;
if(fMin==510||fMin==511||fMin==512){
if(fMin==511||fMin==512) result = translationFinder();
findRotZGeometrically(IterCounter);
if(fMin==511) result = translationFinder();
findRotXGeometrically(IterCounter);
if(fMin==511) result = translationFinder();
findRotYGeometrically(IterCounter);
if(fMin==511||fMin==512) result = translationFinder();
divideInZones(3,fRotMat[0],fTranslation[0]);
if (*fout){
*fout << endl <<"Parameters after GEOMETRIC rotation determination "
<< endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << fEuler[i].getX() << ", " << fEuler[i].getY() << ", "
<< fEuler[i].getZ() << ", " << fTranslation[i].getX() << ", "
<< fTranslation[i].getY() << ", " << fTranslation[i].getZ()
<< endl;
}
*fout << endl;
}
}
if(fMin==514||fMin==515||fMin==516){
if(fMin==515||fMin==516) result = translationFinder();
findRotZGeometrically(IterCounter);
if(fMin==515) result = translationFinder();
findRotXYBySampling(1,IterCounter);
if(fMin==515) result = translationFinder();
findRotXYBySampling(2,IterCounter);
if(fMin==515||fMin==516) result = translationFinder();
}
for(Int_t i=0;i<fNumMods-1;i++){
if(fEuler[i].getX()!=0)
IterCri += fabs((fEuler[i].getX()-OldEuler[i].getX())/
fEuler[i].getX());
if(fEuler[i].getY()!=0)
IterCri += fabs((fEuler[i].getY()-OldEuler[i].getY())/
fEuler[i].getY());
if(fEuler[i].getZ()!=0)
IterCri += fabs((fEuler[i].getZ()-OldEuler[i].getZ())/
fEuler[i].getZ());
if(fTranslation[i].getX()!=0)
IterCri += fabs((fTranslation[i].getX()-OldTranslation[i].getX())/
fTranslation[i].getX());
if(fTranslation[i].getY()!=0)
IterCri += fabs((fTranslation[i].getY()-OldTranslation[i].getY())/
fTranslation[i].getY());
if(fTranslation[i].getZ()!=0)
IterCri += fabs((fTranslation[i].getZ()-OldTranslation[i].getZ())/
fTranslation[i].getZ());
}
IterCounter++;
if(IterCounter>25) {
cout << endl << "More than 25 iterations without convergence!" <<endl;
*fout << endl << "More than 25 iterations without convergence!" <<endl;
break;
}
}while(IterCri>fIterCriteria);
if(fMin == 200){
result = translationFinder();
if (*fout) *fout << "Minimization strategy: "
<< fMin <<" with MINUIT" << endl;
HGeomVector OldEuler[(fNumMods-1)];
HGeomVector OldTranslation[(fNumMods-1)];
Int_t IterCounter =0;
Float_t IterCri;
do{
divideInZones(IterCounter,fRotMat[0],fTranslation[0]);
IterCri = 0;
for(Int_t i=0;i<fNumMods-1;i++){
OldEuler[i] = fEuler[i];
OldTranslation[i] = fTranslation[i];
}
Double_t first=0.;
Double_t second=0.;
minfitRot(fFix,first,second);
if (*fout){
*fout << "Parameters after minimization " << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << fEuler[i].getX() << "+-" << fError[i*6] << ", "
<< fEuler[i].getY() << "+-" << fError[i*6+1] << ", "
<< fEuler[i].getZ() << "+-" << fError[i*6+2] << ", "
<< fTranslation[i].getX() << "+-" << fError[i*6+3] << ", "
<< fTranslation[i].getY() << "+-" << fError[i*6+4] << ", "
<< fTranslation[i].getZ() << "+-" << fError[i*6+5] << endl;
}
*fout << endl;
}
for(Int_t i=0;i<fNumMods-1;i++){
if(fEuler[i].getX()!=0)
IterCri += fabs((fEuler[i].getX()-OldEuler[i].getX())/
fEuler[i].getX());
if(fEuler[i].getY()!=0)
IterCri += fabs((fEuler[i].getY()-OldEuler[i].getY())/
fEuler[i].getY());
if(fEuler[i].getZ()!=0)
IterCri += fabs((fEuler[i].getZ()-OldEuler[i].getZ())/
fEuler[i].getZ());
if(fTranslation[i].getX()!=0)
IterCri += fabs((fTranslation[i].getX()-OldTranslation[i].getX())/
fTranslation[i].getX());
if(fTranslation[i].getY()!=0)
IterCri += fabs((fTranslation[i].getY()-OldTranslation[i].getY())/
fTranslation[i].getY());
if(fTranslation[i].getZ()!=0)
IterCri += fabs((fTranslation[i].getZ()-OldTranslation[i].getZ())/
fTranslation[i].getZ());
if(A_DEBUG==0){
cout << i << "IterCri: " << IterCri << endl;
}
}
IterCounter++;
if(IterCounter>3) {
cout << "WARNING in HMdcAligner :: finalize" << endl;
cout << "Sector: " << sector << " ModuleA: "
<< modA << " ModuleB: " << modB << endl;
cout << "More than 3 iterations (MINUIT ROT) without results!" <<endl;
break;
}
}while(IterCri>fIterCriteria);
}
findAbsolutePosition(absRot,absVect);
if(*fout){
*fout << endl <<"Individual transformations in "
<< "minimization (init values): " << endl;
*fout << "Interpret smaller MDC index as last in the previous list"
<< endl << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout << "Module" << i << endl;
for(Int_t j=0;j<9;j++) *fout << absRot[i](j) << " " ;
*fout << endl;
for(Int_t j=0;j<3;j++) *fout << absVect[i](j) << " " ;
*fout << endl << endl;
}
}
if(A_DEBUG>0){
cout << endl << "Individual transformations in "
<< "minimization: " << endl;
cout << "Interpret smaller MDC index as last in the previous list"
<< endl << endl;
for(Int_t i=0;i<fNumMods-1;i++){
cout << "Module" << i << endl;
absRot[i].print();
absVect[i].print();
}
}
fillHistograms(2);
fillHistograms(3,1);
storeInFile();
fout->close();
delete fout;
return kTRUE;
}
void HMdcAligner::fillHistograms (Int_t index, Int_t select){
HMdcHit* hitA;
HMdcHit* hitB;
HMdcHit* hitC=NULL;
HMdcHit* hitD=NULL;
HMdcHit* hitBC=new HMdcHit;
HMdcHit* hitAB=new HMdcHit;
HMdcHit* hitAC=new HMdcHit;
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
Float_t* origSlopes = new Float_t[2];
Float_t* SlopesAinA = new Float_t[2];
Float_t* SlopesBinA = new Float_t[2];
Float_t* SlopesCinA = new Float_t[2];
HGeomRotation rotaux;
HGeomVector transaux;
HGeomVector transf[4];
HGeomVector a,b,c,d;
Float_t errorx[4];
Float_t errory[4];
Stat_t entries;
if(fNumMods==3){
if (index==2){
BvsCinCCS_X[2]->Reset();
BvsCinCCS_Y[2]->Reset();
BvsCinCCS_XSlope[2]->Reset();
BvsCinCCS_YSlope[2]->Reset();
AvsCinCCS_X[2]->Reset();
AvsCinCCS_Y[2]->Reset();
AvsCinCCS_XSlope[2]->Reset();
AvsCinCCS_YSlope[2]->Reset();
AvsCinCCS_Polar->Reset();
BvsCinCCS_Polar->Reset();
AvsCinCCS_Polar_Stripe1->Reset();
AvsCinCCS_Polar_Stripe2->Reset();
AvsCinCCS_Polar_Stripe3->Reset();
AvsCinCCS_Polar_Stripe4->Reset();
AvsCinCCS_Polar_Stripe5->Reset();
BvsCinCCS_Polar_Stripe1->Reset();
BvsCinCCS_Polar_Stripe2->Reset();
BvsCinCCS_Polar_Stripe3->Reset();
BvsCinCCS_Polar_Stripe4->Reset();
BvsCinCCS_Polar_Stripe5->Reset();
CvsBinBCS_X[2]->Reset();
CvsBinBCS_Y[2]->Reset();
CvsBinBCS_XSlope[2]->Reset();
CvsBinBCS_YSlope[2]->Reset();
AvsBinBCS_X[2]->Reset();
AvsBinBCS_Y[2]->Reset();
AvsBinBCS_XSlope[2]->Reset();
AvsBinBCS_YSlope[2]->Reset();
CvsAinACS_X[2]->Reset();
CvsAinACS_Y[2]->Reset();
CvsAinACS_XSlope[2]->Reset();
CvsAinACS_YSlope[2]->Reset();
BvsAinACS_X[2]->Reset();
BvsAinACS_Y[2]->Reset();
BvsAinACS_XSlope[2]->Reset();
BvsAinACS_YSlope[2]->Reset();
BCvsAinACS_X[2]->Reset();
BCvsAinACS_Y[2]->Reset();
BCvsACinACS_XSlope[2]->Reset();
BCvsACinACS_YSlope[2]->Reset();
ABvsCinCCS_X[2]->Reset();
ABvsCinCCS_Y[2]->Reset();
ABvsCinCCS_XSlope[2]->Reset();
ABvsCinCCS_YSlope[2]->Reset();
ACvsBinBCS_X[2]->Reset();
ACvsBinBCS_Y[2]->Reset();
ACvsBinBCS_XSlope[2]->Reset();
ACvsBinBCS_YSlope[2]->Reset();
DiffBCvsAinACS_XSlope[2]->Reset();
DiffBCvsAinACS_YSlope[2]->Reset();
DiffBCvsBinACS_XSlope[2]->Reset();
DiffBCvsBinACS_YSlope[2]->Reset();
DiffBCvsCinACS_XSlope[2]->Reset();
DiffBCvsCinACS_YSlope[2]->Reset();
DiffACvsAinACS_XSlope[2]->Reset();
DiffACvsAinACS_YSlope[2]->Reset();
DiffACvsBinACS_XSlope[2]->Reset();
DiffACvsBinACS_YSlope[2]->Reset();
DiffACvsCinACS_XSlope[2]->Reset();
DiffACvsCinACS_YSlope[2]->Reset();
DiffBCvsAinACS_XSlopeLow[2]->Reset();
DiffBCvsAinACS_YSlopeLow[2]->Reset();
DiffBCvsBinACS_XSlopeLow[2]->Reset();
DiffBCvsBinACS_YSlopeLow[2]->Reset();
DiffBCvsCinACS_XSlopeLow[2]->Reset();
DiffBCvsCinACS_YSlopeLow[2]->Reset();
DiffACvsAinACS_XSlopeLow[2]->Reset();
DiffACvsAinACS_YSlopeLow[2]->Reset();
DiffACvsBinACS_XSlopeLow[2]->Reset();
DiffACvsBinACS_YSlopeLow[2]->Reset();
DiffACvsCinACS_XSlopeLow[2]->Reset();
DiffACvsCinACS_YSlopeLow[2]->Reset();
DiffBCvsAinACS_XSlopeUp[2]->Reset();
DiffBCvsAinACS_YSlopeUp[2]->Reset();
DiffBCvsBinACS_XSlopeUp[2]->Reset();
DiffBCvsBinACS_YSlopeUp[2]->Reset();
DiffBCvsCinACS_XSlopeUp[2]->Reset();
DiffBCvsCinACS_YSlopeUp[2]->Reset();
DiffACvsAinACS_XSlopeUp[2]->Reset();
DiffACvsAinACS_YSlopeUp[2]->Reset();
DiffACvsBinACS_XSlopeUp[2]->Reset();
DiffACvsBinACS_YSlopeUp[2]->Reset();
DiffACvsCinACS_XSlopeUp[2]->Reset();
DiffACvsCinACS_YSlopeUp[2]->Reset();
DiffACvsAinACS_YSlope_Stripe1->Reset();
DiffACvsAinACS_YSlope_Stripe2->Reset();
DiffACvsAinACS_YSlope_Stripe3->Reset();
DiffACvsAinACS_YSlope_Stripe4->Reset();
DiffACvsAinACS_YSlope_Stripe5->Reset();
DiffACvsBinACS_YSlope_Stripe1->Reset();
DiffACvsBinACS_YSlope_Stripe2->Reset();
DiffACvsBinACS_YSlope_Stripe3->Reset();
DiffACvsBinACS_YSlope_Stripe4->Reset();
DiffACvsBinACS_YSlope_Stripe5->Reset();
DiffACvsCinACS_YSlope_Stripe1->Reset();
DiffACvsCinACS_YSlope_Stripe2->Reset();
DiffACvsCinACS_YSlope_Stripe3->Reset();
DiffACvsCinACS_YSlope_Stripe4->Reset();
DiffACvsCinACS_YSlope_Stripe5->Reset();
}
}
if(fNumMods==2){
if (index==2){
AvsBinBCS_X[2]->Reset();
AvsBinBCS_Y[2]->Reset();
AvsBinBCS_XSlope[2]->Reset();
AvsBinBCS_YSlope[2]->Reset();
BvsAinACS_X[2]->Reset();
BvsAinACS_Y[2]->Reset();
BvsAinACS_XSlope[2]->Reset();
BvsAinACS_YSlope[2]->Reset();
}
}
if(select != 0) entries = fAlignAllCut->GetEntries();
else entries = fAlignAll->GetEntries();
for (Int_t i=0;i<entries;i++) {
if(select != 0) fAlignAllCut->GetEntry(i);
else fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
if(fNumMods>2) hitC = (HMdcHit*) fHits->At(2);
if(fNumMods>3) hitD = (HMdcHit*) fHits->At(3);
if(fNumMods==4) {
projPoint = findProjPoint(hitC,fRotMat[0],fTranslation[0],projSlopes);
CvsDinDCS_X[index]->Fill(hitD->getX() - projPoint.getX());
CvsDinDCS_Y[index]->Fill(hitD->getY() - projPoint.getY());
transformToSlopes(hitD,origSlopes);
CvsDinDCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
CvsDinDCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
projPoint = findProjPoint(hitB,fRotMat[1],fTranslation[1],projSlopes);
BvsDinDCS_X[index]->Fill(hitD->getX() - projPoint.getX());
BvsDinDCS_Y[index]->Fill(hitD->getY() - projPoint.getY());
BvsDinDCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BvsDinDCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
projPoint = findProjPoint(hitA,fRotMat[2],fTranslation[0],projSlopes);
AvsDinDCS_X[index]->Fill(hitD->getX() - projPoint.getX());
AvsDinDCS_Y[index]->Fill(hitD->getY() - projPoint.getY());
AvsDinDCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
AvsDinDCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
projPoint = findProjPoint(hitD,rotaux,transaux,projSlopes);
DvsCinCCS_X[index]->Fill(hitC->getX() - projPoint.getX());
DvsCinCCS_Y[index]->Fill(hitC->getY() - projPoint.getY());
transformToSlopes(hitC,origSlopes);
DvsCinCCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
DvsCinCCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[0].inverse())*fRotMat[1];
transaux = (fRotMat[0].inverse())*(fTranslation[1]-fTranslation[0]);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
BvsCinCCS_X[index]->Fill(hitC->getX() - projPoint.getX());
BvsCinCCS_Y[index]->Fill(hitC->getY() - projPoint.getY());
BvsCinCCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BvsCinCCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[0].inverse())*fRotMat[2];
transaux = (fRotMat[0].inverse())*(fTranslation[2]-fTranslation[0]);
projPoint = findProjPoint(hitA,rotaux,transaux,projSlopes);
AvsCinCCS_X[index]->Fill(hitC->getX() - projPoint.getX());
AvsCinCCS_Y[index]->Fill(hitC->getY() - projPoint.getY());
AvsCinCCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
AvsCinCCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = fRotMat[1].inverse();
transaux = -(rotaux * fTranslation[1]);
projPoint = findProjPoint(hitD,rotaux,transaux,projSlopes);
DvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
DvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
transformToSlopes(hitB,origSlopes);
DvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
DvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[1].inverse())*fRotMat[0];
transaux = (fRotMat[1].inverse())*(fTranslation[0]-fTranslation[1]);
projPoint = findProjPoint(hitC,rotaux,transaux,projSlopes);
CvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
CvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
CvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
CvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[1].inverse())*fRotMat[2];
transaux = (fRotMat[1].inverse())*(fTranslation[2]-fTranslation[1]);
projPoint = findProjPoint(hitA,rotaux,transaux,projSlopes);
AvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
AvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
AvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
AvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = fRotMat[2].inverse();
transaux = -(rotaux * fTranslation[2]);
projPoint = findProjPoint(hitD,rotaux,transaux,projSlopes);
DvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
DvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
transformToSlopes(hitA,origSlopes);
DvsAinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
DvsAinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[2].inverse())*fRotMat[0];
transaux = (fRotMat[2].inverse())*(fTranslation[0]-fTranslation[2]);
projPoint = findProjPoint(hitC,rotaux,transaux,projSlopes);
CvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
CvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
CvsAinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
CvsAinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[2].inverse())*fRotMat[1];
transaux = (fRotMat[2].inverse())*(fTranslation[1]-fTranslation[2]);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
BvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
BvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
BvsAinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BvsAinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
}
if(fNumMods==3){
projPoint = findProjPoint(hitB,fRotMat[0],fTranslation[0],projSlopes);
BvsCinCCS_X[index]->Fill(hitC->getX() - projPoint.getX());
BvsCinCCS_Y[index]->Fill(hitC->getY() - projPoint.getY());
transformToSlopes(hitC,origSlopes);
BvsCinCCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BvsCinCCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
if(index==2){
BvsCinCCS_Polar->Fill(atanf(origSlopes[1]) - atanf(projSlopes[1]));
if(origSlopes[1]>0.2)
BvsCinCCS_Polar_Stripe1->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else if(origSlopes[1]>0.)
BvsCinCCS_Polar_Stripe2->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else if(origSlopes[1]>-0.2)
BvsCinCCS_Polar_Stripe3->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else if(origSlopes[1]>-0.4)
BvsCinCCS_Polar_Stripe4->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else
BvsCinCCS_Polar_Stripe5->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
}
projPoint = findProjPoint(hitA,fRotMat[1],fTranslation[1],projSlopes);
AvsCinCCS_X[index]->Fill(hitC->getX() - projPoint.getX());
AvsCinCCS_Y[index]->Fill(hitC->getY() - projPoint.getY());
AvsCinCCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
AvsCinCCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
if(index==2){
AvsCinCCS_Polar->Fill(atanf(origSlopes[1]) - atanf(projSlopes[1]));
if(origSlopes[1]>0.2)
AvsCinCCS_Polar_Stripe1->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else if(origSlopes[1]>0.)
AvsCinCCS_Polar_Stripe2->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else if(origSlopes[1]>-0.2)
AvsCinCCS_Polar_Stripe3->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else if(origSlopes[1]>-0.4)
AvsCinCCS_Polar_Stripe4->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
else
AvsCinCCS_Polar_Stripe5->Fill(atanf(origSlopes[1])
- atanf(projSlopes[1]));
}
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
projPoint = findProjPoint(hitC,rotaux,transaux,projSlopes);
CvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
CvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
transformToSlopes(hitB,origSlopes);
CvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
CvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = (fRotMat[0].inverse())*fRotMat[1];
transaux = (fRotMat[0].inverse())*(fTranslation[1]-fTranslation[0]);
projPoint = findProjPoint(hitA,rotaux,transaux,projSlopes);
AvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
AvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
AvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
AvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = fRotMat[1].inverse();
transaux = -(rotaux * fTranslation[1]);
projPoint = findProjPoint(hitC,rotaux,transaux,projSlopes);
CvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
CvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
transformToSlopes(hitA,origSlopes);
CvsAinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
CvsAinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
SlopesCinA[0] = projSlopes[0];
SlopesCinA[1] = projSlopes[1];
rotaux = (fRotMat[1].inverse())*fRotMat[0];
transaux = (fRotMat[1].inverse())*(fTranslation[0]-fTranslation[1]);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
BvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
BvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
BvsAinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BvsAinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
SlopesBinA[0] = projSlopes[0];
SlopesBinA[1] = projSlopes[1];
rotaux = fRotMat[1].inverse();
transaux = -(rotaux * fTranslation[1]);
mergeHits(hitC,hitB,fRotMat[0],fTranslation[0],hitBC);
projPoint = findProjPoint(hitBC,rotaux,transaux,projSlopes);
BCvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
BCvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
mergeHits(hitC,hitA,fRotMat[1],fTranslation[1],hitAC);
projPoint = findProjPoint(hitAC,rotaux,transaux,origSlopes);
BCvsACinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BCvsACinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
transformToSlopes(hitA,SlopesAinA);
DiffBCvsAinACS_XSlope[index]->Fill(SlopesAinA[0] - projSlopes[0]);
DiffBCvsAinACS_YSlope[index]->Fill(SlopesAinA[1] - projSlopes[1]);
DiffBCvsBinACS_XSlope[index]->Fill(SlopesBinA[0] - projSlopes[0]);
DiffBCvsBinACS_YSlope[index]->Fill(SlopesBinA[1] - projSlopes[1]);
DiffBCvsCinACS_XSlope[index]->Fill(SlopesCinA[0] - projSlopes[0]);
DiffBCvsCinACS_YSlope[index]->Fill(SlopesCinA[1] - projSlopes[1]);
DiffACvsAinACS_XSlope[index]->Fill(SlopesAinA[0] - origSlopes[0]);
DiffACvsAinACS_YSlope[index]->Fill(SlopesAinA[1] - origSlopes[1]);
DiffACvsBinACS_XSlope[index]->Fill(SlopesBinA[0] - origSlopes[0]);
DiffACvsBinACS_YSlope[index]->Fill(SlopesBinA[1] - origSlopes[1]);
DiffACvsCinACS_XSlope[index]->Fill(SlopesCinA[0] - origSlopes[0]);
DiffACvsCinACS_YSlope[index]->Fill(SlopesCinA[1] - origSlopes[1]);
if(SlopesAinA[1]>0.2)
DiffACvsAinACS_YSlope_Stripe1->Fill(SlopesAinA[1] - origSlopes[1]);
else if(SlopesAinA[1]>0)
DiffACvsAinACS_YSlope_Stripe2->Fill(SlopesAinA[1] - origSlopes[1]);
else if(SlopesAinA[1]>-0.2)
DiffACvsAinACS_YSlope_Stripe3->Fill(SlopesAinA[1] - origSlopes[1]);
else if(SlopesAinA[1]>-0.4)
DiffACvsAinACS_YSlope_Stripe4->Fill(SlopesAinA[1] - origSlopes[1]);
else
DiffACvsAinACS_YSlope_Stripe5->Fill(SlopesAinA[1] - origSlopes[1]);
if(SlopesBinA[1]>0.2)
DiffACvsBinACS_YSlope_Stripe1->Fill(SlopesBinA[1] - origSlopes[1]);
else if(SlopesBinA[1]>0)
DiffACvsBinACS_YSlope_Stripe2->Fill(SlopesBinA[1] - origSlopes[1]);
else if(SlopesBinA[1]>-0.2)
DiffACvsBinACS_YSlope_Stripe3->Fill(SlopesBinA[1] - origSlopes[1]);
else if(SlopesBinA[1]>-0.4)
DiffACvsBinACS_YSlope_Stripe4->Fill(SlopesBinA[1] - origSlopes[1]);
else
DiffACvsBinACS_YSlope_Stripe5->Fill(SlopesBinA[1] - origSlopes[1]);
if(SlopesCinA[1]>0.2)
DiffACvsCinACS_YSlope_Stripe1->Fill(SlopesCinA[1] - origSlopes[1]);
else if(SlopesCinA[1]>0)
DiffACvsCinACS_YSlope_Stripe2->Fill(SlopesCinA[1] - origSlopes[1]);
else if(SlopesCinA[1]>-0.2)
DiffACvsCinACS_YSlope_Stripe3->Fill(SlopesCinA[1] - origSlopes[1]);
else if(SlopesCinA[1]>-0.4)
DiffACvsCinACS_YSlope_Stripe4->Fill(SlopesCinA[1] - origSlopes[1]);
else
DiffACvsCinACS_YSlope_Stripe5->Fill(SlopesCinA[1] - origSlopes[1]);
if(hitC->getY()<0){
DiffBCvsAinACS_XSlopeLow[index]->Fill(SlopesAinA[0] - projSlopes[0]);
DiffBCvsAinACS_YSlopeLow[index]->Fill(SlopesAinA[1] - projSlopes[1]);
DiffBCvsBinACS_XSlopeLow[index]->Fill(SlopesBinA[0] - projSlopes[0]);
DiffBCvsBinACS_YSlopeLow[index]->Fill(SlopesBinA[1] - projSlopes[1]);
DiffBCvsCinACS_XSlopeLow[index]->Fill(SlopesCinA[0] - projSlopes[0]);
DiffBCvsCinACS_YSlopeLow[index]->Fill(SlopesCinA[1] - projSlopes[1]);
DiffACvsAinACS_XSlopeLow[index]->Fill(SlopesAinA[0] - origSlopes[0]);
DiffACvsAinACS_YSlopeLow[index]->Fill(SlopesAinA[1] - origSlopes[1]);
DiffACvsBinACS_XSlopeLow[index]->Fill(SlopesBinA[0] - origSlopes[0]);
DiffACvsBinACS_YSlopeLow[index]->Fill(SlopesBinA[1] - origSlopes[1]);
DiffACvsCinACS_XSlopeLow[index]->Fill(SlopesCinA[0] - origSlopes[0]);
DiffACvsCinACS_YSlopeLow[index]->Fill(SlopesCinA[1] - origSlopes[1]);
}
else{
DiffBCvsAinACS_XSlopeUp[index]->Fill(SlopesAinA[0] - projSlopes[0]);
DiffBCvsAinACS_YSlopeUp[index]->Fill(SlopesAinA[1] - projSlopes[1]);
DiffBCvsBinACS_XSlopeUp[index]->Fill(SlopesBinA[0] - projSlopes[0]);
DiffBCvsBinACS_YSlopeUp[index]->Fill(SlopesBinA[1] - projSlopes[1]);
DiffBCvsCinACS_XSlopeUp[index]->Fill(SlopesCinA[0] - projSlopes[0]);
DiffBCvsCinACS_YSlopeUp[index]->Fill(SlopesCinA[1] - projSlopes[1]);
DiffACvsAinACS_XSlopeUp[index]->Fill(SlopesAinA[0] - origSlopes[0]);
DiffACvsAinACS_YSlopeUp[index]->Fill(SlopesAinA[1] - origSlopes[1]);
DiffACvsBinACS_XSlopeUp[index]->Fill(SlopesBinA[0] - origSlopes[0]);
DiffACvsBinACS_YSlopeUp[index]->Fill(SlopesBinA[1] - origSlopes[1]);
DiffACvsCinACS_XSlopeUp[index]->Fill(SlopesCinA[0] - origSlopes[0]);
DiffACvsCinACS_YSlopeUp[index]->Fill(SlopesCinA[1] - origSlopes[1]);
}
rotaux = fRotMat[0].inverse() * fRotMat[1];
transaux = fRotMat[0].inverse()*fTranslation[1]-
fRotMat[0].inverse()*fTranslation[0];
mergeHits(hitB,hitA,rotaux,transaux,hitAB);
projPoint = findProjPoint(hitAB,fRotMat[0],fTranslation[0],projSlopes);
transformToSlopes(hitC,origSlopes);
ABvsCinCCS_X[index]->Fill(hitC->getX() - projPoint.getX());
ABvsCinCCS_Y[index]->Fill(hitC->getY() - projPoint.getY());
ABvsCinCCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
ABvsCinCCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
mergeHits(hitC,hitA,fRotMat[1],fTranslation[1],hitAC);
projPoint = findProjPoint(hitAC,rotaux,transaux,projSlopes);
transformToSlopes(hitB,origSlopes);
ACvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
ACvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
ACvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
ACvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
}
if(fNumMods==2) {
projPoint = findProjPoint(hitA,fRotMat[0],fTranslation[0],projSlopes);
AvsBinBCS_X[index]->Fill(hitB->getX() - projPoint.getX());
AvsBinBCS_Y[index]->Fill(hitB->getY() - projPoint.getY());
transformToSlopes(hitB,origSlopes);
AvsBinBCS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
AvsBinBCS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
BvsAinACS_X[index]->Fill(hitA->getX() - projPoint.getX());
BvsAinACS_Y[index]->Fill(hitA->getY() - projPoint.getY());
transformToSlopes(hitA,origSlopes);
BvsAinACS_XSlope[index]->Fill(origSlopes[0] - projSlopes[0]);
BvsAinACS_YSlope[index]->Fill(origSlopes[1] - projSlopes[1]);
}
if(fNumMods>2) {
if(fNumMods>3){
d.setX(hitD->getX());
d.setY(hitD->getY());
d.setZ(0.);
}
c.setX(hitC->getX());
c.setY(hitC->getY());
c.setZ(0.);
b.setX(hitB->getX());
b.setY(hitB->getY());
b.setZ(0.);
a.setX(hitA->getX());
a.setY(hitA->getY());
a.setZ(0.);
if(fUseUnitErrors==kFALSE && fUseModErrors==kFALSE ){
errorx[0] = (hitA->getErrX()!=0)? hitA->getErrX() : 0.2;
errorx[1] = (hitB->getErrX()!=0)? hitB->getErrX() : 0.2;
errorx[2] = (hitC->getErrX()!=0)? hitC->getErrX() : 0.2;
if(fNumMods>3) errorx[3] = (hitD->getErrX()!=0)? hitD->getErrX():0.2;
errory[0] = (hitA->getErrY()!=0)? hitA->getErrY() : 0.1;
errory[1] = (hitB->getErrY()!=0)? hitB->getErrY() : 0.1;
errory[2] = (hitC->getErrY()!=0)? hitC->getErrY() : 0.1;
if(fNumMods>3) errory[3] = (hitD->getErrY()!=0)? hitD->getErrY():0.1;
}
else if(fUseModErrors==kTRUE){
errorx[0]=fPosError[0];errory[0]=fPosError[1];
errorx[1]=fPosError[2];errory[1]=fPosError[3];
errorx[2]=fPosError[4];errory[2]=fPosError[5];
if(fNumMods>3){errorx[3]=fPosError[6];errory[3]=fPosError[7];}
}
else
for(Int_t i=0;i<fNumMods;i++){
errorx[i]=1.0;
errory[i]=1.0;
}
if(A_DEBUG>3){
for(Int_t i=0;i<fNumMods;i++){
cout << "errorx[" << i <<"] = " << errorx[i] << endl;
cout << "errory[" << i <<"] = " << errory[i] << endl;
}
}
if(fNumMods>3){
transf[3] = d;
transf[2] = fRotMat[0] * c + fTranslation[0];
transf[1] = fRotMat[1] * b + fTranslation[1];
transf[0] = fRotMat[2] * a + fTranslation[2];
}
else{
transf[2] = c;
transf[1] = fRotMat[0] * b + fTranslation[0];
transf[0] = fRotMat[1] * a + fTranslation[1];
}
if(A_DEBUG>3){
for(Int_t i=0;i<fNumMods;i++){
cout << "transf[" << i <<"] ";
transf[i].print();
}
}
Float_t ax=0.0, ay=0.0, bx=0.0, by=0.0;
Float_t sigax=0.0, sigay=0.0, sigbx=0.0, sigby=0.0;
Float_t Xwt, Xt, Xsxoss, Xsx=0.0, Xsy=0.0, Xst2=0.0, Xss=0.0;
Float_t Ywt, Yt, Ysxoss, Ysx=0.0, Ysy=0.0, Yst2=0.0, Yss=0.0;
Float_t XChi2=0.0, YChi2=0.0, chipar=0.0;
for(Int_t i=0;i<fNumMods;i++){
Xwt = 1.0/(errorx[i]*errorx[i]);
Xss += Xwt;
Xsx += transf[i].getZ()*Xwt;
Xsy += transf[i].getX()*Xwt;
Ywt = 1.0/(errory[i]*errory[i]);
Yss += Ywt;
Ysx += transf[i].getZ()*Ywt;
Ysy += transf[i].getY()*Ywt;
if(A_DEBUG>3) cout << "Xwt=" << Xwt << " Xss=" << Xss
<< " Xsx=" << Xsx << " Xsy=" << Xsy
<< " Ywt=" << Ywt << " Yss=" << Yss
<< " Ysx=" << Ysx << " Ysy=" << Ysy << endl;
}
Xsxoss = Xsx/Xss;
Ysxoss = Ysx/Yss;
if(A_DEBUG>3) cout << "Xsxoss=" << Xsxoss << " Ysxoss="
<< Ysxoss << endl;
for(Int_t i=0;i<fNumMods;i++){
Xt = (transf[i].getZ()-Xsxoss)/errorx[i];
Xst2 += Xt * Xt;
bx += Xt * transf[i].getX()/errorx[i];
Yt = (transf[i].getZ()-Ysxoss)/errory[i];
Yst2 += Yt * Yt;
by += Yt * transf[i].getY()/errory[i];
if(A_DEBUG>3) cout << "Xt=" << Xt << " Xst2=" << Xst2
<< " bx (partial)=" << bx << "Yt=" << Yt
<< " Yst2=" << Yst2
<< " by (partial)=" << by << endl;
}
bx /= Xst2;
ax = (Xsy-(Xsx*bx))/Xss;
by /= Yst2;
ay = (Ysy-(Ysx*by))/Yss;
if(A_DEBUG>3) cout << "bx=" << bx << " ax=" << ax
<< "by=" << by << " ay=" << ay << endl;
sigax = sqrt((1.0+Xsx*Xsx/(Xss*Xst2))/Xss);
sigbx = sqrt(1.0/Xst2);
sigay = sqrt((1.0+Ysx*Ysx/(Yss*Yst2))/Yss);
sigby = sqrt(1.0/Yst2);
if(A_DEBUG>3) cout << "sigbx=" << sigbx << " sigax=" << sigax
<< "sigby=" << sigby << " sigay=" << sigay << endl;
for(Int_t i=0;i<fNumMods;i++){
chipar = (transf[i].getX()-ax-bx*transf[i].getZ())/errorx[i];
XChi2 += chipar*chipar;
chipar = (transf[i].getY()-ay-by*transf[i].getZ())/errory[i];
YChi2 += chipar*chipar;
if(A_DEBUG>3) cout << "XChi2=" << XChi2 << " YChi2=" << YChi2 << endl;
}
XChi2Hist[index]->Fill(XChi2);
YChi2Hist[index]->Fill(YChi2);
TotalChi2[index]->Fill(XChi2+YChi2);
Float_t part1=0.0,part2=0.0,part3=0.0,sdistance=0.0,sdist=0.0;
for(Int_t i=0;i<fNumMods;i++){
part1 = ( (transf[i].getX()-ax)*by ) - ( (transf[i].getY()-ay)*bx );
part2 = ( (transf[i].getY()-ay) ) - ( (transf[i].getZ() )*by );
part3 = ( (transf[i].getZ() )*bx ) - ( (transf[i].getX()-ax) );
sdist = (part1*part1 + part2*part2 + part3*part3)/(1+bx*bx+by*by);
sdistance += sdist;
if(A_DEBUG>3)
cout << "Square Distance point " << i << " - line: "
<< sdistance << endl;
if(i==0)SqrDistToA[index]->Fill(sdist);
if(i==1)SqrDistToB[index]->Fill(sdist);
if(i==2)SqrDistToC[index]->Fill(sdist);
if(i==3)SqrDistToD[index]->Fill(sdist);
}
SqrDist[index]->Fill(sdistance);
}
else{
}
}
if(hitBC!=0) delete hitBC;
if(hitAB!=0) delete hitAB;
if(hitAC!=0) delete hitAC;
if(projSlopes!=0) delete[] projSlopes;
if(origSlopes!=0) delete[] origSlopes;
}
void HMdcAligner::storeInFile(void)
{
Int_t sector = fLoc[0];
Int_t modA = fLoc[1];
Int_t modB = fLoc[2];
Int_t modC=-1;
Int_t modD=-1;
if(fNumMods>2) modC = fLoc[3];
if(fNumMods>3) modD = fLoc[4];
fAlignAll->Write();
fAlignAllCut->Write();
static Char_t newDirName[255];
if(fNumMods == 2) sprintf(newDirName,"%s%s%i%s%i%s%i","Aligner_",
"S_",sector,"_ModA_",modA,"_ModB_",modB);
if(fNumMods == 3) sprintf(newDirName,"%s%s%i%s%i%s%i%s%i","Aligner_",
"S_",sector,"_ModA_",modA,"_ModB_",modB,
"_ModC_",modC);
if(fNumMods == 4) sprintf(newDirName,"%s%s%i%s%i%s%i%s%i%s%i",
"Aligner_","S_",sector,"_ModA_",modA,
"_ModB_",modB,"_ModC_",modC,"_ModD_",modD);
if(fHistoOff!=kTRUE) {
fOutRoot->cd(newDirName);
for(Int_t i=0;i<fNumMods-1;i++){
fRotMat[i].Write();
fTranslation[i].Write();
}
graphXchi2->Write();
graphYchi2->Write();
graphXchi2X->Write();
graphXchi2Y->Write();
graphYchi2X->Write();
graphYchi2Y->Write();
graphCont->Write();
fOutRoot->cd();
}
fRecCount--;
if(!fRecCount) {
fOutRoot->Write();
fOutRoot->Close();
}
}
void HMdcAligner::fillRotMatrix(Int_t ind, Float_t prim,
Float_t segu, Float_t terc){
const Double_t rad2deg = 57.29577951308;
fRotMat[ind].setEulerAngles(prim*rad2deg,segu*rad2deg,terc*rad2deg);
}
void HMdcAligner::fillTranslation(Int_t ind,Float_t x,
Float_t y, Float_t z){
fTranslation[ind].setX(x);
fTranslation[ind].setY(y);
fTranslation[ind].setZ(z);
}
void HMdcAligner::setEulerAngles(Int_t ind,Float_t f,
Float_t s, Float_t t){
fEuler[ind].setX(f);
fEuler[ind].setY(s);
fEuler[ind].setZ(t);
}
void HMdcAligner::setSearchLimits(Float_t x, Float_t y, Float_t s){
fXArea = x;
fYArea = y;
fSArea = s;
}
void HMdcAligner::setIterCriteria(Float_t cri){
fIterCriteria = cri;
}
void HMdcAligner::setWeights(Float_t w0,Float_t w1,Float_t w2,Float_t w3){
fWeights[0]= w0;
fWeights[1]= w1;
fWeights[2]= w2;
fWeights[3]= w3;
}
void HMdcAligner::setModErrors(Float_t errXModA,Float_t errYModA,
Float_t errXModB,Float_t errYModB,
Float_t errXModC,Float_t errYModC,
Float_t errXModD,Float_t errYModD){
fUseModErrors=kTRUE;
fPosError[0]=errXModA;fPosError[1]=errYModA;
fPosError[2]=errXModB;fPosError[3]=errYModB;
fPosError[4]=errXModC;fPosError[5]=errYModC;
fPosError[6]=errXModD;fPosError[7]=errYModD;
}
void HMdcAligner::setSteps(Float_t s0,Float_t s1,Float_t s2,
Float_t s3, Float_t s4, Float_t s5,
Float_t s6, Float_t s7, Float_t s8,
Float_t s9, Float_t s10, Float_t s11,
Float_t s12, Float_t s13, Float_t s14,
Float_t s15, Float_t s16, Float_t s17){
fSteps[0]= s0; fSteps[1]= s1; fSteps[2]= s2;
fSteps[3]= s3; fSteps[4]= s4; fSteps[5]= s5;
fSteps[6]= s6; fSteps[7]= s7; fSteps[8]= s8;
fSteps[9]= s9; fSteps[10]= s10; fSteps[11]= s11;
fSteps[12]= s12; fSteps[13]= s13; fSteps[14]= s14;
fSteps[15]= s15; fSteps[16]= s16; fSteps[17]= s17;
if(A_DEBUG>3) cout << "Steps in the minimization adjusted to "
<< s0 << ", " << s1 << ", " << s2 << ", "
<< s3 << ", " << s4 << ", " << s5 << ", "
<< s6 << ", " << s7 << ", " << s8 << ", "
<< s9 << ", " << s10 << ", " << s11 << ", "
<< s12 << ", " << s13 << ", " << s14 << ", "
<< s15 << ", " << s16 << ", " << s17 << endl;
}
void HMdcAligner::setLimits(Float_t l0,Float_t l1,Float_t l2,
Float_t l3, Float_t l4, Float_t l5,
Float_t l6, Float_t l7, Float_t l8,
Float_t l9, Float_t l10, Float_t l11,
Float_t l12, Float_t l13, Float_t l14,
Float_t l15, Float_t l16, Float_t l17){
fLimits[0]= l0; fLimits[1]= l1; fLimits[2]= l2;
fLimits[3]= l3; fLimits[4]= l4; fLimits[5]= l5;
fLimits[6]= l6; fLimits[7]= l7; fLimits[8]= l8;
fLimits[9]= l9; fLimits[10]= l10; fLimits[11]= l11;
fLimits[12]= l12; fLimits[13]= l13; fLimits[14]= l14;
fLimits[15]= l15; fLimits[16]= l16; fLimits[17]= l17;
if(A_DEBUG>3) cout << "Limits in the minimization adjusted to "
<< l0 << ", " << l1 << ", " << l2 << ", "
<< l3 << ", " << l4 << ", " << l5 << ", "
<< l6 << ", " << l7 << ", " << l8 << ", "
<< l9 << ", " << l10 << ", " << l11 << ", "
<< l12 << ", " << l13 << ", " << l14 << ", "
<< l15 << ", " << l16 << ", " << l17 << endl;
}
void HMdcAligner::findRotXYBySampling(Int_t angleIter,Int_t iter){
ofstream *fout2=NULL;
if (fNameAscii) fout2 = new ofstream(fNameAscii.Data(), ios::app);
if(angleIter==1 && iter<1) divideInZones(1,fRotMat[0],fTranslation[0]);
else if(angleIter==2 && iter<1) divideInZones(2,fRotMat[0],fTranslation[0]);
else divideInZones(-3,fRotMat[0],fTranslation[0]);
HGeomRotation correct, origRot, newRot;
HGeomVector euler, result;
Float_t testCorrectAngle, correctAngle;
Float_t chi2X[40];
Float_t chi2Y[40];
Float_t angle_eval[40];
Int_t counter;
origRot = fRotMat[0];
counter=0;
testCorrectAngle = -0.020;
for(Int_t i=0;i<40;i++){
chi2X[i] = 0;
chi2Y[i] = 0;
angle_eval[i] = 0;
}
do{
angle_eval[counter] = testCorrectAngle;
if(angleIter==1){
correct.setUnitMatrix();
correct.setElement(cos(testCorrectAngle),4);
correct.setElement(sin(testCorrectAngle),5);
correct.setElement(-sin(testCorrectAngle),7);
correct.setElement(cos(testCorrectAngle),8);
}
else {
correct.setUnitMatrix();
correct.setElement(cos(testCorrectAngle),0);
correct.setElement(sin(testCorrectAngle),2);
correct.setElement(-sin(testCorrectAngle),6);
correct.setElement(cos(testCorrectAngle),8);
}
newRot = origRot * correct;
divideInZones(-3,newRot,fTranslation[0]);
for (Int_t zo = 0;zo<9;zo++){
chi2Y[counter] += (zones_Y[zo]-resZon_Y[zo])*(zones_Y[zo]-resZon_Y[zo]);
chi2X[counter] += (zones_X[zo]-resZon_X[zo])*(zones_X[zo]-resZon_X[zo]);
}
testCorrectAngle=testCorrectAngle+0.001;
counter++;
}while(testCorrectAngle<0.020);
if (*fout2){
*fout2 << endl<< " Results Table -- angle, chi2X, chi2Y"<< endl;
for(Int_t ele=0;ele<40;ele++)
*fout2 << angle_eval[ele] << " "
<< chi2X[ele] << " "
<< chi2Y[ele] << endl;
*fout2 << endl;
}
TF1 *f1 = new TF1("f1","pol2",angle_eval[0],angle_eval[39]);
for(Int_t ele=0;ele<40;ele++){
if(angleIter==1){
graphXchi2Y->SetPoint(ele, angle_eval[ele], chi2Y[ele]);
graphXchi2X->SetPoint(ele, angle_eval[ele], chi2X[ele]);
graphXchi2->SetPoint(ele, angle_eval[ele], chi2X[ele]+2*chi2Y[ele]);
}
else {
graphYchi2X->SetPoint(ele, angle_eval[ele], chi2X[ele]);
graphYchi2Y->SetPoint(ele, angle_eval[ele], chi2Y[ele]);
graphYchi2->SetPoint(ele, angle_eval[ele], chi2X[ele]+2*chi2Y[ele]);
}
}
if(angleIter==1){
graphXchi2Y->Fit("f1","RQNW");
correctAngle = -(f1->GetParameter(1))/(2 * f1->GetParameter(2));
graphXchi2X->Fit("f1","RQNW");
if(*fout2){
*fout2 << "Correction angle from chi2Y: " << correctAngle << endl
<< "Correction angle from chi2X: "
<< -(f1->GetParameter(1))/(2 * f1->GetParameter(2)) << endl;
}
graphXchi2->Fit("f1","RQNW");
correctAngle = -(f1->GetParameter(1))/(2 * f1->GetParameter(2));
}
else{
graphYchi2X->Fit("f1","RQNW");
correctAngle = -(f1->GetParameter(1))/(2 * f1->GetParameter(2));
graphYchi2Y->Fit("f1","RQNW");
if(*fout2){
*fout2 << "Correction angle from chi2X: " << correctAngle << endl
<< "Correction angle from chi2Y: "
<< -(f1->GetParameter(1))/(2 * f1->GetParameter(2)) << endl;
}
graphYchi2->Fit("f1","RQNW");
correctAngle = -(f1->GetParameter(1))/(2 * f1->GetParameter(2));
}
if (*fout2)
*fout2 <<endl<<" The winner angle is " << correctAngle <<endl<<endl;
if(angleIter==1){
correct.setUnitMatrix();
correct.setElement(cos(correctAngle),4);
correct.setElement(sin(correctAngle),5);
correct.setElement(-sin(correctAngle),7);
correct.setElement(cos(correctAngle),8);
}
else {
correct.setUnitMatrix();
correct.setElement(cos(correctAngle),0);
correct.setElement(sin(correctAngle),2);
correct.setElement(-sin(correctAngle),6);
correct.setElement(cos(correctAngle),8);
}
newRot = origRot * correct;
fRotMat[0] = newRot;
euler = findEulerAngles(fRotMat[0]);
setEulerAngles(0,euler(0),euler(1),euler(2));
if (*fout2){
if(fMin==14 || fMin==514)
*fout2 << endl << "Parameters after rotation around ";
else
*fout2 << endl << "Parameters after rotation (including ANALYTIC "
<< " translation minimization) around " ;
if(angleIter==1) *fout2 << endl << " X axis"<< endl;
else *fout2 << endl << " Y axis"<< endl;
for(Int_t i=0; i<fNumMods-1;i++){
*fout2 << fEuler[i].getX() << ", " << fEuler[i].getY() << ", "
<< fEuler[i].getZ() << ", " << fTranslation[i].getX() << ", "
<< fTranslation[i].getY() << ", " << fTranslation[i].getZ()
<< endl;
}
*fout2 << endl;
}
if(angleIter==1) divideInZones(2,fRotMat[0],fTranslation[0]);
else divideInZones(3,fRotMat[0],fTranslation[0]);
}
void HMdcAligner::findRotXGeometrically(Int_t iter){
Float_t* rotResults2=0;
HGeomRotation correct2;
HGeomRotation newRotation;
HGeomVector euler;
ofstream *fout2=NULL;
if (fNameAscii) fout2 = new ofstream(fNameAscii.Data(), ios::app);
if(iter<1) divideInZones(1,fRotMat[0],fTranslation[0]);
else divideInZones(-3,fRotMat[0],fTranslation[0]);
rotResults2 = rotYXFinder(1,1);
correct2.setUnitMatrix();
correct2.setElement(cos(rotResults2[2]),4);
correct2.setElement(sin(rotResults2[2]),5);
correct2.setElement(-sin(rotResults2[2]),7);
correct2.setElement(cos(rotResults2[2]),8);
newRotation = fRotMat[0] * correct2;
if(!fUseZones){
fRotMat[0] = newRotation;
euler = findEulerAngles(newRotation);
setEulerAngles(0,euler(0),euler(1),euler(2));
}
*fout2 << endl << " *** Using all hits ***" << endl;
*fout2 << " Second angle; rotX = " <<rotResults2[0]<<" in "<< rotResults2[6]
<< " entries, with Variance " << rotResults2[3] << endl;
*fout2 << " Negatives in root: " << rotResults2[7];
*fout2 << " Discarted (inner) hits: " << rotResults2[8] << endl;
*fout2 << "usingfit; rotX = " << rotResults2[1]
<< " with sigma " << rotResults2[4] << endl;
*fout2 << "usingfitcen; rotX = " << rotResults2[2]
<< " with sigma " << rotResults2[5] << endl;
rotResults2 = rotYXFinder(0,1);
correct2.setUnitMatrix();
correct2.setElement(cos(rotResults2[0]),4);
correct2.setElement(sin(rotResults2[0]),5);
correct2.setElement(-sin(rotResults2[0]),7);
correct2.setElement(cos(rotResults2[0]),8);
newRotation = fRotMat[0] * correct2;
if(fUseZones){
fRotMat[0] = newRotation;
euler = findEulerAngles(newRotation);
setEulerAngles(0,euler(0),euler(1),euler(2));
}
*fout2 << endl << " *** Using Zones ***" << endl;
*fout2 << " Second angle; rotX = " <<rotResults2[0]<<" in "<< rotResults2[6]
<< " entries, with Variance " << rotResults2[3] << endl;
*fout2 << " Negatives in root: " << rotResults2[7];
*fout2 << " Discarted (inner) hits: " << rotResults2[8] << endl;
}
void HMdcAligner::findRotYGeometrically(Int_t iter){
Float_t* rotResults3=0;
HGeomRotation correct3;
HGeomRotation newRotation;
HGeomVector euler;
ofstream *fout2=NULL;
if (fNameAscii) fout2 = new ofstream(fNameAscii.Data(), ios::app);
if(iter<1) divideInZones(2,fRotMat[0],fTranslation[0]);
else divideInZones(-3,fRotMat[0],fTranslation[0]);
rotResults3 = rotYXFinder(1);
correct3.setUnitMatrix();
correct3.setElement(cos(rotResults3[2]),0);
correct3.setElement(sin(rotResults3[2]),2);
correct3.setElement(-sin(rotResults3[2]),6);
correct3.setElement(cos(rotResults3[2]),8);
newRotation = fRotMat[0] * correct3;
if(!fUseZones){
fRotMat[0] = newRotation;
euler = findEulerAngles(newRotation);
setEulerAngles(0,euler(0),euler(1),euler(2));
}
*fout2 << endl << " *** Using all hits ***" << endl;
*fout2 << " Third angle; rotY = " <<rotResults3[0]<<" in "<< rotResults3[6]
<< " entries, with Variance " << rotResults3[3] << endl;
*fout2 << " Negatives in root: " << rotResults3[7];
*fout2 << " Discarted (inner) hits: " << rotResults3[8] << endl;
*fout2 << "Additional info: " << endl;
*fout2 << "usingfit; rotY = " << rotResults3[1]
<< " with sigma " << rotResults3[4] << endl;
*fout2 << "usingfitcen; rotY = " << rotResults3[2]
<< " with sigma " << rotResults3[5] << endl;
rotResults3 = rotYXFinder();
correct3.setUnitMatrix();
correct3.setElement(cos(rotResults3[0]),0);
correct3.setElement(sin(rotResults3[0]),2);
correct3.setElement(-sin(rotResults3[0]),6);
correct3.setElement(cos(rotResults3[0]),8);
newRotation = fRotMat[0] * correct3;
if(fUseZones){
fRotMat[0] = newRotation;
euler = findEulerAngles(newRotation);
setEulerAngles(0,euler(0),euler(1),euler(2));
}
*fout2 << endl << " *** Using Zones ***" << endl;
*fout2 << " Third angle; rotY = " <<rotResults3[0]<<" in "<< rotResults3[6]
<< " entries, with Variance " << rotResults3[3] << endl;
*fout2 << " Negatives in root: " << rotResults3[7];
*fout2 << " Discarted (inner) hits: " << rotResults3[8] << endl;
}
void HMdcAligner::findRotZGeometrically(Int_t iter){
Float_t* rotResults=0;
HGeomRotation correct1;
HGeomRotation newRotation;
HGeomVector euler;
ofstream *fout2=NULL;
if (fNameAscii) fout2 = new ofstream(fNameAscii.Data(), ios::app);
if(iter<1) divideInZones(0,fRotMat[0],fTranslation[0]);
else divideInZones(-3,fRotMat[0],fTranslation[0]);
rotResults = rotZFinder(1);
correct1.setUnitMatrix();
correct1.setElement(cos(rotResults[2]),0);
correct1.setElement(-sin(rotResults[2]),1);
correct1.setElement(sin(rotResults[2]),3);
correct1.setElement(cos(rotResults[2]),4);
newRotation = fRotMat[0] * correct1;
if(!fUseZones){
fRotMat[0] = newRotation;
euler = findEulerAngles(newRotation);
setEulerAngles(0,euler(0),euler(1),euler(2));
}
*fout2 << endl << " *** Using all hits ***" << endl;
*fout2 << " First angle; rotZ = " << rotResults[0]
<<" in " << rotResults[6]
<< " entries, with Variance " << rotResults[3] << endl;
*fout2 << "usingfit; rotZ = " << rotResults[1]
<< " with sigma " << rotResults[4] << endl;
*fout2 << "usingfitcen; rotZ = " << rotResults[2]
<< " with sigma " << rotResults[5] << endl;
rotResults = rotZFinder();
correct1.setElement(cos(rotResults[0]),0);
correct1.setElement(-sin(rotResults[0]),1);
correct1.setElement(sin(rotResults[0]),3);
correct1.setElement(cos(rotResults[0]),4);
newRotation = fRotMat[0] * correct1;
if(fUseZones){
fRotMat[0] = newRotation;
euler = findEulerAngles(newRotation);
setEulerAngles(0,euler(0),euler(1),euler(2));
}
*fout2 << endl << " *** Using Zones ***" << endl;
*fout2 << " First angle; rotZ = " << rotResults[0] <<" in " << rotResults[6]
<< " entries, with Variance " << rotResults[3] << endl;
}
HGeomVector HMdcAligner::translationFinderZones(HGeomRotation rot,HGeomVector tran){
Float_t a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
Float_t thetaX=0,thetaY=0;
Float_t resX=0,resY=0,resXstar=0,resYstar=0;
Float_t Wx=1,Wy=1;
Stat_t used=0;
HGeomRotation rotaux;
HGeomVector transaux;
HGeomVector resultaux,result;
HGeomVector TargetPos = getLocalTarget(rot,tran);
rotaux = rot.inverse();
transaux = -(rotaux * tran);
for (Int_t i=0;i<9;i++) {
resX = zones_X[i] - resZon_X[i];
resY = zones_Y[i] - resZon_Y[i];
used++;
Float_t s0=0,s1=0;
if(fUseTarget) {
s0 = (resZon_X[i]-TargetPos.getX())/(-TargetPos.getZ());
s1 = (resZon_Y[i]-TargetPos.getY())/(-TargetPos.getZ());
}
else cout << "FATAL ERROR in translationFinderZones()" << endl;
thetaX = (s0*rotaux(0) + s1*rotaux(1) + rotaux(2))/
(rotaux(8) + s0*rotaux(6) + s1*rotaux(7));
thetaY = (s0*rotaux(3) + s1*rotaux(4) + rotaux(5))/
(rotaux(8) + s0*rotaux(6) + s1*rotaux(7));
resXstar = resX + transaux.getX() - thetaX * transaux.getZ() ;
resYstar = resY + transaux.getY() - thetaY * transaux.getZ() ;
if(fUseUnitErrors){
a+=1;
b+=1;
c+=-thetaX;
d+=-thetaY;
e+=thetaX*thetaX+thetaY*thetaY;
f+=resXstar;
g+=resYstar;
h+=-(thetaX*resXstar+thetaY*resYstar);
}
else{
a+=Wx;
b+=Wy;
c+=-thetaX/Wx;
d+=-thetaY/Wy;
e+=thetaX*thetaX/Wx+thetaY*thetaY/Wy;
f+=resXstar/Wx;
g+=resYstar/Wy;
h+=-(thetaX*resXstar/Wx+thetaY*resYstar/Wy);
}
}
Float_t den = a*b*e-c*b*c-a*d*d;
resultaux.setX((f*b*e+g*d*c-b*c*h-f*d*d)/den);
resultaux.setY((a*g*e+f*d*c-g*c*c-d*h*a)/den);
resultaux.setZ((a*b*h-f*b*c-g*d*a)/den);
result = -(rot * resultaux);
cout << "translationFinderZones(): used " << used
<< " from 9" << endl;
result.print();
return result;
}
HGeomVector HMdcAligner::translationFinder(Int_t XYorBoth,
Int_t XLowLim, Int_t XUppLim,
Int_t YLowLim, Int_t YUppLim){
HGeomVector result;
if(!fUseCut) {
result = translationFinderRW(XYorBoth, XLowLim, XUppLim,
YLowLim, YUppLim);
return result;
}
else{
Int_t IterCounter = 0;
Float_t IterCri = 0;
HGeomVector OldTranslation[(fNumMods-1)];
ofstream *fout2=NULL;
if (fNameAscii) fout2 = new ofstream(fNameAscii.Data(), ios::app);
if (*fout2) *fout2 << endl << "ITERATIVE translationFinder!" << endl;
do{
IterCri = 0;
for(Int_t i=0;i<fNumMods-1;i++){
OldTranslation[i] = fTranslation[i];
}
result = translationFinderRW(XYorBoth, XLowLim, XUppLim,
YLowLim, YUppLim);
fillTranslation(0,result.getX(),result.getY(),result.getZ());
if (*fout2){
*fout2 << "Parameters after minimization " << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout2 << fTranslation[i].getX() << ", "
<< fTranslation[i].getY() << ", "
<< fTranslation[i].getZ() << endl;
}
*fout2 << "Using " << fCountCut << " combinations." << endl;
}
for(Int_t i=0;i<fNumMods-1;i++){
if(fTranslation[i].getX()!=0)
IterCri += fabs((fTranslation[i].getX()-OldTranslation[i].getX())/
fTranslation[i].getX());
if(fTranslation[i].getY()!=0)
IterCri += fabs((fTranslation[i].getY()-OldTranslation[i].getY())/
fTranslation[i].getY());
if(fTranslation[i].getZ()!=0)
IterCri += fabs((fTranslation[i].getZ()-OldTranslation[i].getZ())/
fTranslation[i].getZ());
if(A_DEBUG==0){
cout << i << "IterCri: " << IterCri << endl;
}
}
IterCounter++;
if(IterCounter>10) {
cout << "WARNING in HMdcAligner::translationFinder()" << endl;
cout << "More than 10 iterations without results!" <<endl;
break;
}
if(IterCri>fIterCriteria){
fillHistograms(2);
fitHistograms(2);
}
}while(IterCri>fIterCriteria);
if (*fout2){
*fout2 << "Parameters after ANALYTIC translation minimization " << endl;
for(Int_t i=0;i<fNumMods-1;i++){
*fout2 << fEuler[i].getX() << ", " << fEuler[i].getY() << ", "
<< fEuler[i].getZ() << ", " << fTranslation[i].getX() << ", "
<< fTranslation[i].getY() << ", " << fTranslation[i].getZ() << endl;
}
*fout2 << endl;
}
fout2->close();
delete fout2;
return result;
}
}
HGeomVector HMdcAligner::translationFinderRW(Int_t XYorBoth,
Int_t XLowLim, Int_t XUppLim,
Int_t YLowLim, Int_t YUppLim){
HMdcHit* hitA;
HMdcHit* hitB;
HMdcHit* hitC;
HMdcHit* hitD;
HGeomVector projPoint;
Float_t* origSlopes = new Float_t[2];
Float_t* projSlopes = new Float_t[2];
HGeomRotation rotaux;
HGeomVector transaux;
HGeomVector resultaux,result;
Float_t a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
Float_t thetaX=0,thetaY=0;
Float_t resX=0,resY=0,resS0=0,resS1=0,resXstar=0,resYstar=0;
Float_t Wx=1,Wy=1,WxSx=0,WxSy=0,WySy=0;
Stat_t entries, used=0;
if(fUseCut) entries= fAlignAllCut->GetEntries();
else entries= fAlignAll->GetEntries();
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
for (Int_t i=0;i<entries;i++) {
if(fUseCut) fAlignAllCut->GetEntry(i);
else fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
if(fNumMods>2) hitC = (HMdcHit*) fHits->At(2);
if(fNumMods>3) hitD = (HMdcHit*) fHits->At(3);
if(XYorBoth!=-1){
if(XYorBoth==0 &&
(hitA->getX() < XLowLim || hitA->getX() > XUppLim)) continue;
if(XYorBoth==1 &&
(hitA->getY() < YLowLim || hitA->getY() > YUppLim)) continue;
if(XYorBoth==2 && (
(hitA->getX() < XLowLim || hitA->getX() > XUppLim) ||
(hitA->getY() < YLowLim || hitA->getY() > YUppLim) )) continue;
}
used++;
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
transformToSlopes(hitA,origSlopes);
resX = hitA->getX() - projPoint.getX();
resY = hitA->getY() - projPoint.getY();
resS0 = origSlopes[0]-projSlopes[0];
resS1 = origSlopes[1]-projSlopes[1];
Float_t s0=0,s1=0;
if(fUseTarget) {
s0 = (hitB->getX()-fTargetPos.getX())/(-fTargetPos.getZ());
s1 = (hitB->getY()-fTargetPos.getY())/(-fTargetPos.getZ());
}
else{
Float_t xDir = hitB->getXDir();
Float_t yDir = hitB->getYDir();
Float_t aux = sqrt(1 - xDir * xDir - yDir * yDir);
if(aux == 0.){ s0=1; s1=1;}
else{
s0 = xDir/aux;
s1 = yDir/aux;
}
}
thetaX = (s0*rotaux(0) + s1*rotaux(1) + rotaux(2))/
(rotaux(8) + s0*rotaux(6) + s1*rotaux(7));
thetaY = (s0*rotaux(3) + s1*rotaux(4) + rotaux(5))/
(rotaux(8) + s0*rotaux(6) + s1*rotaux(7));
resXstar = resX + transaux.getX() - thetaX * transaux.getZ();
resYstar = resY + transaux.getY() - thetaY * transaux.getZ();
if(fUseUnitErrors!=kTRUE){
Float_t det = ( (fSigmaX*fSigmaX+fSigmaY*fSigmaY+
fSigmaS0*fSigmaS0+fSigmaS1*fSigmaS1) *
(1 - fRhoxSy*fRhoxSy - fRhoxSx*fRhoxSx -
fRhoySy*fRhoySy + fRhoxSx*fRhoxSx*fRhoySy*fRhoySy) );
Wx = (fSigmaY*fSigmaS0*fSigmaS1-
fRhoySy*fRhoySy*fSigmaY*fSigmaY*fSigmaS1*fSigmaS1*fSigmaS0)/det;
Wy = (fSigmaX*fSigmaS0*fSigmaS1-
fRhoxSy*fRhoxSy*fSigmaX*fSigmaX*fSigmaS1*fSigmaS1*fSigmaS0-
fRhoxSx*fRhoxSx*fSigmaX*fSigmaX*fSigmaS0*fSigmaS0*fSigmaS1)/det;
WxSx = -(fRhoxSx*fSigmaX*fSigmaS0*fSigmaY*fSigmaS1-
fRhoySy*fRhoySy*fSigmaY*fSigmaY*fSigmaS1*
fSigmaS1*fRhoxSx*fSigmaX*fSigmaS0)/det;
WySy = -(fSigmaX*fSigmaS0*fRhoySy*fSigmaY*fSigmaS1-
fRhoxSx*fRhoxSx*fSigmaX*fSigmaX*fSigmaS0*fSigmaS0*
fRhoySy*fSigmaY*fSigmaS1)/det;
WxSy = -(fRhoxSx*fSigmaX*fSigmaS0*fSigmaY*fRhoxSy*fSigmaX*fSigmaS1)/det;
if(fDoNotUseCov){
resXstar = resX + transaux.getX() - thetaX * transaux.getZ();
resYstar = resY + transaux.getY() - thetaY * transaux.getZ();
}
else{
resXstar = resX + transaux.getX() - thetaX * transaux.getZ()
+ (WxSx/Wx) * resS0 + (WxSy/Wx) * resS1 ;
resYstar = resY + transaux.getY() - thetaY * transaux.getZ()
+ (WxSy/Wy) * resS1 ;
}
}
else{
Wx = 1;
Wy = 1;
resXstar = resX + transaux.getX() - thetaX * transaux.getZ();
resYstar = resY + transaux.getY() - thetaY * transaux.getZ();
}
a+=1*Wx;
b+=1*Wy;
c+=-thetaX*Wx;
d+=-thetaY*Wy;
e+=thetaX*thetaX*Wx+thetaY*thetaY*Wy;
f+=resXstar*Wx;
g+=resYstar*Wy;
h+=-(thetaX*resXstar*Wx+thetaY*resYstar*Wy);
}
Float_t den = a*b*e-c*b*c-a*d*d;
resultaux.setX((f*b*e+g*d*c-b*c*h-f*d*d)/den);
resultaux.setY((a*g*e+f*d*c-g*c*c-d*h*a)/den);
resultaux.setZ((a*b*h-f*b*c-g*d*a)/den);
result = -(fRotMat[0] * resultaux);
cout << "translationFinder(";
if(XYorBoth!=-1) cout << XYorBoth << ", " << XLowLim<< "," << XUppLim ;
if(XYorBoth>0) cout << ", " << YLowLim<< "," << YUppLim;
cout << "): used " << used << " from "<< entries << endl;
result.print();
if(projSlopes!=0) delete[] projSlopes;
return result;
}
void HMdcAligner::divideInZones(Int_t loop,HGeomRotation rot,HGeomVector tran){
HMdcHit* hitA;
HMdcHit* hitB;
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
HGeomRotation rotaux;
HGeomVector transaux;
Stat_t entries;
Float_t xhit=0,yhit=0,xpro=0,ypro=0;
Bool_t doNotCenter=kFALSE;
TF1 *f1 = new TF1("f1","gaus",-10,10);
rotaux = rot.inverse();
transaux = -(rotaux * tran);
if(loop<0){
if(loop==-1) doNotCenter=kTRUE;
loop = 3;
}
for(Int_t index =0;index<9;index++){
BvsAinACS_X_Zone[index+(9*loop)]->Reset();
BvsAinACS_Y_Zone[index+(9*loop)]->Reset();
BvsAinACS_Zon[loop]->Reset();
}
if(fUseCutRot) entries= fAlignAllCut->GetEntries();
else entries= fAlignAll->GetEntries();
for (Int_t i=0;i<entries;i++) {
if(fUseCutRot) fAlignAllCut->GetEntry(i);
else fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
xhit = hitA->getX();
xpro = projPoint.getX();
yhit = hitA->getY();
ypro = projPoint.getY();
for(Int_t index=0;index<9;index++){
if( xhit > zones_X[index]-zones_DX[index]/2 &&
xhit < zones_X[index]+zones_DX[index]/2 &&
yhit > zones_Y[index]-zones_DY[index]/2 &&
yhit < zones_Y[index]+zones_DY[index]/2 ) {
BvsAinACS_X_Zone[index+(9*loop)]->Fill(xhit-xpro);
BvsAinACS_Y_Zone[index+(9*loop)]->Fill(yhit-ypro);
BvsAinACS_Zon[loop]->Fill(xhit-xpro+zones_X[index]/10,
yhit-ypro+zones_Y[index]/10);
}
}
}
Float_t offsetX=0.,offsetY=0.;
for(Int_t index =0;index<9;index++){
BvsAinACS_X_Zone[index+(9*loop)]->Fit("f1","RQN");
resZon_X[index] = zones_X[index] - f1->GetParameter(1);
if(index==4) offsetX= f1->GetParameter(1);
BvsAinACS_Y_Zone[index+(9*loop)]->Fit("f1","RQN");
resZon_Y[index] = zones_Y[index] - f1->GetParameter(1);
if(index==4) offsetY= f1->GetParameter(1);
if(A_DEBUG>3){
cout << "DEBUG: index=" << index << " resZon_X[index]="
<< resZon_X[index] << " resZon_Y[index]=" << resZon_Y[index] << endl;
cout << " zones_X[index]=" << zones_X[index]
<< " zones_Y[index]=" << zones_Y[index] << endl;
}
}
if(doNotCenter==kFALSE) {
for(Int_t index =0;index<9;index++){
if(A_DEBUG>3){
cout << "offsetX = " << offsetX<< endl;
cout << "offsetY = " << offsetY<< endl;
}
resZon_X[index] = resZon_X[index] + offsetX;
resZon_Y[index] = resZon_Y[index] + offsetY;
if(A_DEBUG>3){
cout << "resZon_X["<< index<< "] = " << resZon_X[index] << endl;
cout << "resZon_Y["<< index<< "] = " << resZon_Y[index] << endl;
}
}
}
if(projSlopes!=0) delete[] projSlopes;
if(f1!=0) delete f1;
}
Float_t* HMdcAligner::rotZFinder(Int_t noZones){
HMdcHit* hitA;
HMdcHit* hitB;
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
HGeomRotation rotaux;
HGeomVector transaux;
Float_t* rotvalues = new Float_t[7];
Float_t rotZ=0., rotZmean=0., rotZfit=0., rotZfitcen=0.;
Float_t rotZsqr=0., sigmafit=0., sigmafitcen=0.;
Float_t xhit=0,yhit=0,xpro=0,ypro=0;
Stat_t count=0;
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
if(noZones != 0){
Stat_t entries;
hisrotZ->Reset();
if(fUseCutRotZ) entries= fAlignAllCut->GetEntries();
else entries= fAlignAll->GetEntries();
count = entries;
for (Int_t i=0;i<entries;i++) {
if(fUseCutRotZ) fAlignAllCut->GetEntry(i);
else fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
xhit = hitA->getX();
xpro = projPoint.getX();
yhit = hitA->getY();
ypro = projPoint.getY();
rotZ = atan2(xhit*ypro-yhit*xpro,xhit*xpro+yhit*ypro);
hisrotZ->Fill(rotZ);
rotZmean += rotZ;
rotZsqr += rotZ*rotZ;
}
rotZmean = rotZmean / count;
cout << endl << endl;
cout << "rotZ (first rotation)"<<endl;
cout << "rotZmean=" << rotZmean;
TF1 *f1 = new TF1("f1","gaus",-0.2,0.2);
hisrotZ->Fit("f1","RQN");
rotZfit = f1->GetParameter(1);
sigmafit = f1->GetParameter(2);
TF1 *f2 = new TF1("f2","gaus",rotZfit-1.64*sigmafit,rotZfit+1.64*sigmafit);
hisrotZ->Fit("f2","RQN");
rotZfitcen = f2->GetParameter(1);
sigmafitcen = f2->GetParameter(2);
if(fCloseToSolution){
rotZfitcen=0;
Float_t entriesTot=0;
for(Int_t co=498;co<504;co++){
rotZfitcen += hisrotZ->GetBinContent(co)*hisrotZ->GetBinCenter(co);
entriesTot += hisrotZ->GetBinContent(co);
}
rotZfitcen = rotZfitcen/entriesTot;
}
else{
if((f2->GetChisquare()/f2->GetNDF())>(f1->GetChisquare()/f1->GetNDF())){
rotZfitcen = f1->GetParameter(1);
sigmafitcen = f1->GetParameter(2);
}
}
rotvalues[0] = rotZmean;
rotvalues[1] = rotZfit;
rotvalues[2] = rotZfitcen;
rotvalues[3] = (rotZsqr / count) - (rotZmean*rotZmean);
rotvalues[4] = sigmafit;
rotvalues[5] = sigmafitcen;
rotvalues[6] = count;
if(f1!=0) delete f1;
if(f2!=0) delete f2;
}
else {
count = 9;
hisrotZZon->Reset();
for (Int_t i=0;i<9;i++) {
xhit = zones_X[i];
xpro = resZon_X[i];
yhit = zones_Y[i];
ypro = resZon_Y[i];
if(xhit==0 && yhit==0) count--;
else{
rotZ = atan2(xhit*ypro-yhit*xpro,xhit*xpro+yhit*ypro);
hisrotZZon->Fill(rotZ);
rotZmean += rotZ;
rotZsqr += rotZ*rotZ;
}
}
rotZmean = rotZmean / count;
rotvalues[0] = rotZmean;
rotvalues[1] = 0.;
rotvalues[2] = 0.;
rotvalues[3] = (rotZsqr / count) - (rotZmean*rotZmean);
rotvalues[4] = 0.;
rotvalues[5] = 0.;
rotvalues[6] = count;
}
if(projSlopes!=0) delete[] projSlopes;
return rotvalues;
}
Float_t* HMdcAligner::rotYXFinder(Int_t noZones, Int_t YorX){
HMdcHit* hitA;
HMdcHit* hitB;
HGeomVector projPoint;
Float_t* projSlopes = new Float_t[2];
HGeomRotation rotaux;
HGeomVector transaux;
Float_t* rotvalues = new Float_t[9];
Float_t rot=0., rotmean=0., rotfit=0., rotfitcen=0.;
Float_t rotsqr=0., sigmafit=0., sigmafitcen=0.;
Float_t fnum=0, snum=0, den=0, totalpos=0, totalneg=0;
Float_t total=0, a=0, c=0, hit=0, pro=0;
Int_t snumneg=0, innerhits=0;
Stat_t count=0;
HGeomVector localTarget = fRotMat[0].inverse() *
(fTargetPos-fTranslation[0]);
Float_t xTar = localTarget.getX();
Float_t yTar = localTarget.getY();
Float_t zTar = localTarget.getZ();
rotaux = fRotMat[0].inverse();
transaux = -(rotaux * fTranslation[0]);
if(noZones != 0){
Stat_t entries;
if(YorX !=0) {
hisrotXNeg->Reset();
hisrotXPos->Reset();
hisrotX->Reset();
}
else{
hisrotYNeg->Reset();
hisrotYPos->Reset();
hisrotY->Reset();
}
if(fUseCutRot) entries= fAlignAllCut->GetEntries();
else entries= fAlignAll->GetEntries();
count = entries;
for (Int_t i=0;i<entries;i++) {
if(fUseCutRot) fAlignAllCut->GetEntry(i);
else fAlignAll->GetEntry(i);
hitA = (HMdcHit*) fHits->At(0);
hitB = (HMdcHit*) fHits->At(1);
projPoint = findProjPoint(hitB,rotaux,transaux,projSlopes);
if(YorX !=0) {
hit = hitA->getY();
pro = projPoint.getY();
}
else{
hit = hitA->getX();
pro = projPoint.getX();
}
if(fabs(pro)>100) {
if(YorX !=0) a = hit-yTar;
else a = hit-xTar;
c = -zTar;
fnum = (a*pro) / (c*hit);
snum = 1 + ((a*a)/(c*c)) - ((pro*pro)/(hit*hit));
den = 1 + (a*a)/(c*c);
if(snum>0) {
totalneg = (fnum - sqrt(snum)) / den;
if(totalneg>1 || totalneg < -1)
cout << "FATAL ERROR IN rotYXFinder()" << endl;
else{
rot = asin(totalneg);
if(YorX !=0) hisrotXNeg->Fill(rot);
else hisrotYNeg->Fill(rot);
}
totalpos = (fnum + sqrt(snum)) / den;
if(totalpos>1 || totalpos < -1)
cout << "FATAL ERROR IN rotYXFinder()" << endl;
else{
rot = asin(totalpos);
if(YorX !=0) hisrotXPos->Fill(rot);
else hisrotYPos->Fill(rot);
}
if(fabs(totalpos)>fabs(totalneg)) total = totalneg;
else total = totalpos;
rot = asin(total);
if(YorX !=0) hisrotX->Fill(rot);
else hisrotY->Fill(rot);
rotmean += rot;
rotsqr += rot*rot;
}
else {
snumneg++;
count--;
}
}
else {
innerhits++;
count--;
}
}
rotmean = rotmean / count;
cout << endl << endl;
cout << "rot (second and third rotation)"<<endl;
cout << "rotmean=" << rotmean;
if(!fCloseToSolution){
TF1 *f1 = new TF1("f1","gaus",-0.2,0.2);
if(YorX !=0) hisrotX->Fit("f1","RQN");
else hisrotY->Fit("f1","RQN");
rotfit = f1->GetParameter(1);
sigmafit = f1->GetParameter(2);
TF1 *f2 = new TF1("f2","gaus",rotfit-1.64*sigmafit,rotfit+1.64*sigmafit);
if(YorX !=0) hisrotX->Fit("f2","RQN");
else hisrotY->Fit("f2","RQN");
rotfitcen = f1->GetParameter(1);
sigmafitcen = f1->GetParameter(2);
if(f2->GetChisquare()/f2->GetNDF()<5.){
rotfitcen = f2->GetParameter(1);
sigmafitcen = f2->GetParameter(2);
}
else if(YorX ==0){
cout << "WARNING: Bad fit in rotXYFinder()" << endl;
cout << "Mean of center bins" << endl;
cout << "DUMMY FIT SIGMA IN THE TEXT OUTPUT (999)!!!!!" << endl;
rotfitcen=0;
Float_t entriesTot=0;
for(Int_t co=491;co<511;co++){
rotfitcen += hisrotY->GetBinContent(co)*hisrotY->GetBinCenter(co);
entriesTot += hisrotY->GetBinContent(co);
}
rotfitcen = rotfitcen/entriesTot;
sigmafitcen = 999;
}
else{
cout << "WARNING: Bad second fit in rotXYFinder()" << endl;
cout << "Mean of center bins" << endl;
cout << "DUMMY FIT SIGMA IN THE TEXT OUTPUT (999)!!!!!" << endl;
rotfitcen=0;
Float_t entriesTot=0;
for(Int_t co=498;co<504;co++){
rotfitcen += hisrotX->GetBinContent(co)*hisrotX->GetBinCenter(co);
entriesTot += hisrotX->GetBinContent(co);
}
rotfitcen = rotfitcen/entriesTot;
sigmafitcen = 999;
if(f1!=0) delete f1;
if(f2!=0) delete f2;
}
}
else{
if(YorX !=0){
rotfitcen=0;
Float_t entriesTot=0;
for(Int_t co=498;co<504;co++){
rotfitcen += hisrotX->GetBinContent(co)*hisrotX->GetBinCenter(co);
entriesTot += hisrotX->GetBinContent(co);
}
rotfitcen = rotfitcen/entriesTot;
}
else{
TF1 *f3 = new TF1("f3","gaus",-0.03,0.01);
TF1 *f4 = new TF1("f4","gaus",-0.02,0.02);
TF1 *f5 = new TF1("f5","gaus",-0.01,0.03);
hisrotY->Fit("f3","RQN");
hisrotY->Fit("f4","RQN");
hisrotY->Fit("f5","RQN");
if( (f3->GetChisquare()/f3->GetNDF())<(f4->GetChisquare()/f4->GetNDF()) &&
(f3->GetChisquare()/f3->GetNDF())<(f5->GetChisquare()/f5->GetNDF()) &&
fabs(f3->GetParameter(1))<0.02){
rotfitcen = f3->GetParameter(1);
sigmafitcen = f3->GetParameter(2);
}
else if( (f5->GetChisquare()/f5->GetNDF())<(f4->GetChisquare()/f4->GetNDF()) &&
fabs(f5->GetParameter(1))<0.02){
rotfitcen = f5->GetParameter(1);
sigmafitcen = f5->GetParameter(2);
}
else{
rotfitcen = f4->GetParameter(1);
sigmafitcen = f4->GetParameter(2);
}
if(f3!=0) delete f3;
if(f4!=0) delete f4;
if(f5!=0) delete f5;
}
}
if(rotfitcen>0.05) {
cout <<"WARNING: Uncontrolled or far from solution in rotXYFinder()"
<< endl;
rotfitcen=0.01;sigmafitcen = 88888;
}
if(rotfitcen<-0.05) {
cout <<"WARNING: Uncontrolled or far from solution in rotXYFinder()"
<< endl;
rotfitcen=-0.01;sigmafitcen = 88888;
}
rotvalues[0] = rotmean;
rotvalues[1] = rotfit;
rotvalues[2] = rotfitcen;
rotvalues[3] = (rotsqr / count) - (rotmean*rotmean);
rotvalues[4] = sigmafit;
rotvalues[5] = sigmafitcen;
rotvalues[6] = count;
rotvalues[7] = snumneg;
rotvalues[8] = innerhits;
}
else{
Float_t oP= 0.;
hisrotXZonNeg->Reset();
hisrotXZonPos->Reset();
hisrotXZon->Reset();
hisrotYZonNeg->Reset();
hisrotYZonPos->Reset();
hisrotYZon->Reset();
count = 9;
for(Int_t i=0;i<9;i++){
if(YorX !=0){
hit = zones_Y[i];
pro = resZon_Y[i];
}
else{
hit = zones_X[i];
pro = resZon_X[i];
}
if(fabs(pro)>100){
if(YorX !=0) a = hit-yTar;
else a = hit-xTar;
c = -zTar;
pro = ((a/c) * oP + pro);
fnum = (a*pro) / (c*hit);
snum = 1 + ((a*a)/(c*c)) - ((pro*pro)/(hit*hit));
den = 1 + (a*a)/(c*c);
if(snum>0) {
totalneg = (fnum - sqrt(snum)) / den;
if(totalneg>1 || totalneg < -1)
cout << "FATAL ERROR IN rotYXFinder()" << endl;
else{
rot = asin(totalneg);
if(YorX !=0) hisrotXZonNeg->Fill(rot);
else hisrotYZonNeg->Fill(rot);
}
totalpos = (fnum + sqrt(snum)) / den;
if(totalpos>1 || totalpos < -1)
cout << "FATAL ERROR IN rotYXFinder()" << endl;
else{
rot = asin(totalpos);
if(YorX !=0) hisrotXZonPos->Fill(rot);
else hisrotYZonPos->Fill(rot);
}
if(fabs(totalpos)>fabs(totalneg)) total = totalneg;
else total = totalpos;
rot = asin(total);
if(YorX !=0) hisrotXZon->Fill(rot);
else hisrotYZon->Fill(rot);
rotmean += rot;
rotsqr += rot*rot;
}
else {
snumneg++;
count--;
}
}
else {
innerhits++;
count--;
}
}
rotmean = rotmean / count;
rotvalues[0] = rotmean;
rotvalues[1] = 0.;
rotvalues[2] = 0.;
rotvalues[3] = (rotsqr / count) - (rotmean*rotmean);
rotvalues[4] = 0.;
rotvalues[5] = 0.;
rotvalues[6] = count;
rotvalues[7] = snumneg;
rotvalues[8] = innerhits;
}
if(projSlopes!=0) delete[] projSlopes;
return rotvalues;
}
void HMdcAligner::minfit(Int_t fix, HGeomVector* fE, HGeomVector* fT){
Double_t args[2]={0,0};
Int_t err = 0;
Float_t* limitL;
Float_t* limitH;
limitL = new Float_t[18];
limitH = new Float_t[18];
Double_t parresult[18];
Double_t oldparresult[18];
Double_t start_val[]={fE[0].getX(),fE[0].getY(),fE[0].getZ(),
fT[0].getX(),fT[0].getY(),fT[0].getZ(),
fE[1].getX(),fE[1].getY(),fE[1].getZ(),
fT[1].getX(),fT[1].getY(),fT[1].getZ(),
fE[2].getX(),fE[2].getY(),fE[2].getZ(),
fT[2].getX(),fT[2].getY(),fT[2].getZ()};
for(Int_t i=0;i<18;i++){
if(fLimits[i]==0){
limitL[i]=0;
limitH[i]=0;
}
else {
limitL[i]=start_val[i]-fLimits[i];
limitH[i]=start_val[i]+fLimits[i];
cout << " LIMITS IN THE MINIMIZATION " << endl;
cout << " (from 0 to 17) Par " << i << " between "
<< limitL[i] << " and " << limitH[i] << endl;
}
}
TMinuit *minuit=new TMinuit((fNumMods-1)*6);
if(fNumMods==2) minuit->SetFCN(fcnalign);
else minuit->SetFCN(fcnalign34);
minuit->SetObjectFit(this);
if(A_DEBUG>0){
cout << "HMdcAligner::minfit()" <<endl;
cout << "Start Values for initialization: ";
for(Int_t i=0;i<(fNumMods-1)*6;i++){
cout << start_val[i] << "," ;
}
cout << endl;
}
Char_t pname[10];
for(Int_t i=0;i<(fNumMods-1)*6;i++){
sprintf(pname,"%s%i","par",i);
minuit->mnparm(i,pname,start_val[i],fSteps[i],limitL[i],limitH[i],err);
oldparresult[i] = start_val[i];
if(err>0) cout << "ERROR IN MINUIT INITIALIZATION" << endl;
}
if(fix!=4096){
Int_t bit=1;
for(Int_t i=0;i<(fNumMods-1)*6;i++){
if(fix & bit)
minuit->FixParameter(i);
bit<<=1;
}
}
if(fMin==4) {
for(Int_t i=0;i<(fNumMods-1);i++){
minuit->FixParameter(6*i+0);
minuit->FixParameter(6*i+1);
minuit->FixParameter(6*i+2);
}
}
if(fMin==1||fMin==3) {
for(Int_t i=0;i<(fNumMods-1);i++){
minuit->FixParameter(6*i+3);
minuit->FixParameter(6*i+4);
minuit->FixParameter(6*i+5);
}
}
if(A_DEBUG<3){
minuit->SetPrintLevel(1);
}
Double_t aDummy=0;
Int_t otherDummy=0;
if(fMin==105 && fix==4096){
Int_t IterCounter =0;
Float_t IterCri;
static Double_t pfix=0;
ofstream *fout=NULL;
if (fNameAscii) fout = new ofstream(fNameAscii.Data(), ios::app);
if (*fout)
*fout << endl << "Iterative fixing and releasing of two params in (105)";
do{
if (*fout) *fout<<endl<<endl<<" Iteration number " <<IterCounter<<endl;
IterCri = 0;
for(Int_t con=0;con<12;con++) oldparresult[con] = parresult[con];
for(Int_t con=0;con<12;con++) {
pfix = con+1;
minuit->mnexcm("RELEASE",&pfix,1,err);
}
pfix = 2;
minuit->mnexcm("FIX",&pfix,1,err);
pfix = 8;
minuit->mnexcm("FIX",&pfix,1,err);
minuit->mnexcm("MIGRAD",args,0,err);
minuit->mnstat(fFunctionMin,aDummy,aDummy,
otherDummy,otherDummy,otherDummy);
for(Int_t i=0;i<(fNumMods-1)*6;i++)
minuit->GetParameter(i,parresult[i],fError[i]);
if (*fout){
*fout << "Fixing the angles: "<< endl;
for(Int_t con=0;con<12;con++)
*fout << parresult[con] << "+-" << fError[con] << ", ";
*fout << "Function value: " << fFunctionMin
<< " from ";
if(fUseCut) *fout << fCountCut << " combinations." << endl;
else *fout << fCount << " combinations." << endl;
*fout << endl;
}
for(Int_t con=0;con<12;con++) {
pfix = con+1;
minuit->mnexcm("FIX",&pfix,1,err);
}
pfix = 2;
minuit->mnexcm("RELEASE",&pfix,1,err);
pfix = 8;
minuit->mnexcm("RELEASE",&pfix,1,err);
minuit->mnexcm("MIGRAD",args,0,err);
minuit->mnstat(fFunctionMin,aDummy,aDummy,
otherDummy,otherDummy,otherDummy);
for(Int_t i=0;i<(fNumMods-1)*6;i++)
minuit->GetParameter(i,parresult[i],fError[i]);
if (*fout){
*fout << endl << "Fixing all but the angles: "<< endl;
for(Int_t con=0;con<12;con++)
*fout << parresult[con] << "+-" << fError[con] << ", ";
*fout << "Function value: " << fFunctionMin
<< " from ";
if(fUseCut) *fout << fCountCut << " combinations." << endl;
else *fout << fCount << " combinations." << endl;
*fout << endl;
}
for(Int_t i=0;i<12;i++){
if(parresult[i]!=0)
IterCri += fabs((parresult[i]-oldparresult[i])/parresult[i]);
}
IterCounter++;
if(IterCounter>10) {
cout << "WARNING in HMdcAligner :: minfit -> Method (105)" << endl;
cout << "More than 10 iterations without results!" <<endl;
break;
}
}while(IterCri>fIterCriteria);
}
else if(fMin == 106){
minuit->mnexcm("MINOS",args,0,err);
if(err>0) cout << "ERROR IN MINUIT INITIALIZATION" << endl;
}
else if(fMin == 777){
graphCont = (TGraph*)minuit->Contour(100,1,7);
}
else{
minuit->mnexcm("MIGRAD",args,0,err);
if(err>0) cout << "ERROR IN MINUIT INITIALIZATION" << endl;
}
minuit->mnstat(fFunctionMin,aDummy,aDummy,otherDummy,otherDummy,otherDummy);
for(Int_t i=0;i<(fNumMods-1)*6;i++){
minuit->GetParameter(i,parresult[i],fError[i]);
}
for(Int_t i=0;i<fNumMods-1;i++){
fEuler[i].setX(parresult[i*6]);
fEuler[i].setY(parresult[i*6+1]);
fEuler[i].setZ(parresult[i*6+2]);
fTranslation[i].setX(parresult[i*6+3]);
fTranslation[i].setY(parresult[i*6+4]);
fTranslation[i].setZ(parresult[i*6+5]);
}
if (err != 0) cout << endl <<"MINIMIZATION EXITED WITH ERROR "
<< err << endl;
if(limitL!=0)delete []limitL;
if(limitH!=0)delete []limitH;
}
void HMdcAligner::minfitRot(Int_t fix, Double_t first, Double_t second){
Double_t args[2]={0,0};
Int_t err = 0;
Double_t start_val[2] = {first,second};
Double_t errors[2];
if(fix==0) setMinFlag(0);
else setMinFlag(1);
TMinuit *minuit=new TMinuit(2);
minuit->SetFCN(fcnRot);
minuit->SetObjectFit(this);
Char_t pname[10];
Int_t parnum;
parnum=2;
for(Int_t i=0;i<parnum;i++){
sprintf(pname,"%s%i","par",i);
minuit->mnparm(i,pname,start_val[i],0.1,0,0,err);
}
minuit->mnexcm("MIGRAD",args,0,err);
Double_t parresult[parnum];
for(Int_t i=0;i<parnum;i++){
minuit->GetParameter(i,parresult[i],errors[i]);
}
if(A_DEBUG>3){
cout << "RESULTS FROM MINUIT ROT" << endl;
cout << "Phi=" << parresult[0] << "+-" << errors[0] << endl;
cout << "Theta=" << parresult[1] << "+-" << errors[1] << endl;
}
Float_t a=0,b=0,c=0,A=0,B=0,C=0;
Float_t num=0,num2=0,den=0,psi=0;
HGeomRotation correction;
HGeomRotation newRotation;
HGeomVector Target = getLocalTarget(fRotMat[0],fTranslation[0]);
Float_t xTar = Target.getX();
Float_t yTar = Target.getY();
Float_t zTar = Target.getZ();
a = resZon_X[0]-xTar;
b = resZon_Y[0]-yTar;
c = -zTar;
A = b*resZon_X[0]-a*resZon_Y[0];
B = c*resZon_X[0] ;
C = c*resZon_Y[0] ;
num = resZon_X[0]* ( (-A)*sin(parresult[1])-B*sin(parresult[0])*cos(parresult[1])+
C*cos(parresult[0])*cos(parresult[1]) ) -
resZon_Y[0] * (B*cos(parresult[0])+C*sin(parresult[0]) );
num2 = resZon_Y[0]* ( (-A)*sin(parresult[1])-B*sin(parresult[0])*cos(parresult[1])+
C*cos(parresult[0])*cos(parresult[1]) ) +
resZon_X[0] * (B*cos(parresult[0])+C*sin(parresult[0]) );
den = a*sin(parresult[1])*cos(parresult[0]) + b*sin(parresult[1])*sin(parresult[0]) + c*cos(parresult[1]);
psi = atan2(num/den,num2/den);
cout << "Psi "<< psi << endl;
const Double_t rad2deg = 57.29577951308;
correction.setEulerAngles(parresult[0]*rad2deg,
parresult[1]*rad2deg,psi*rad2deg);
newRotation = fRotMat[0] * correction;
cout << "The new Rotation is"<< endl;
newRotation.print();
fRotMat[0] =newRotation;
HGeomVector euler = findEulerAngles(newRotation);
for(Int_t i=0;i<fNumMods-1;i++){
fEuler[i].setX(euler.getX());
fEuler[i].setY(euler.getY());
fEuler[i].setZ(euler.getZ());
}
if (err != 0) cout << endl <<"MINIMIZATION EXITED WITH ERROR "
<< err << endl;
}
void fcnalign(Int_t &npar, Double_t *gin, Double_t &f,
Double_t *par, Int_t iflag){
Double_t chisq = 0.;
Double_t zproy, resx, resy, ress0, ress1;
HGeomRotation rotmat;
Double_t prim, segu, terc;
Float_t pxa, pya, ps0a, ps1a, pxb, pyb, ps0b, ps1b;
Float_t xDir,yDir,aux;
prim = par[0];
segu = par[1];
terc = par[2];
HGeomVector translation(par[3],par[4],par[5]);
if (A_DEBUG>2){
cout << "HMdcAligner::fcnalign() Parameters: "
<< par[0] << "," << par[1] << "," << par[2] << ","
<< par[3] << "," << par[4] << "," << par[5] << endl;
}
rotmat.setEulerAngles(prim*180./TMath::Pi(),
segu*180./TMath::Pi(),
terc*180./TMath::Pi());
TTree* pData;
HMdcAligner* pAlign;
TClonesArray* theHits;
pAlign = (HMdcAligner*)(gMinuit->GetObjectFit());
pData = pAlign->getTree();
Int_t strategy = pAlign->getStrategy();
Stat_t entries = pData->GetEntries();
Float_t* weights;
weights = new Float_t[4];
weights = pAlign->getWeights();
HMdcHit *hitA;
HMdcHit *hitB;
for (Int_t i=0;i<entries;i++) {
pData->GetEntry(i);
theHits = pAlign->getHits();
hitA = (HMdcHit*) theHits->At(0);
hitB = (HMdcHit*) theHits->At(1);
pxa = hitA->getX();
pya = hitA->getY();
xDir = hitA->getXDir();
yDir = hitA->getYDir();
aux = sqrt(1 - xDir * xDir - yDir * yDir);
if(aux == 0.) {
ps0a=1;
ps1a=1;
cout<< "ERROR #1 in HMdcAligner::fcnalign().";
}
else{
ps0a = xDir/aux;
ps1a = yDir/aux;
}
pxb = hitB->getX();
pyb = hitB->getY();
xDir = hitB->getXDir();
yDir = hitB->getYDir();
aux = sqrt(1 - xDir * xDir - yDir * yDir);
if(aux == 0.) {
ps0b=1;
ps1b=1;
cout<< "ERROR #2 in HMdcAligner::fcnalign().";
}
else{
ps0b = xDir/aux;
ps1b = yDir/aux;
}
HGeomRotation rotInv = rotmat.inverse();
HGeomVector trasInv = -(rotInv * translation);
zproy = -(rotInv(6)*pxb + rotInv(7)*pyb + trasInv(2)) /
(rotInv(8) + rotInv(6)*ps0b + rotInv(7)*ps1b);
resx = pxa - (pxb*rotInv(0) + pyb*rotInv(1) + trasInv(0) +
zproy*(ps0b*rotInv(0) + ps1b*rotInv(1) + rotInv(2)));
resy = pya - (pxb*rotInv(3) + pyb*rotInv(4) + trasInv(1) +
zproy*(ps0b*rotInv(3) + ps1b*rotInv(4) + rotInv(5)));
ress0 = ps0a - ((rotInv(0)*ps0b + rotInv(1)*ps1b + rotInv(2)) /
(rotInv(6)*ps0b + rotInv(7)*ps1b + rotInv(8)));
ress1 = ps1a - ((rotInv(3)*ps0b + rotInv(4)*ps1b + rotInv(5)) /
(rotInv(6)*ps0b + rotInv(7)*ps1b + rotInv(8)));
if(A_DEBUG >4){
cout << " ++++++++ VALUES IN fcnalign() +++++++++ " << endl;
cout << "HITA: " << pxa << ", " << pya << ", "
<< ps0a << ", " << ps1a << endl;
cout << "HITB: " << pxb << ", " << pyb << ", "
<< ps0b << ", " << ps1b << endl;
cout << "Dist: " << resx << ", " << resy << ", "
<< ress0 << ", " << ress1 << endl;
}
if(strategy==1||strategy==3) chisq += ress0*ress0/weights[2]
+ ress1*ress1/weights[3];
if(strategy==4) chisq += resx*resx/weights[0] + resy*resy/weights[1];
if(strategy==5) chisq += resx*resx/weights[0] + resy*resy/weights[1]
+ ress0*ress0/weights[2] + ress1*ress1/weights[3];
}
f = chisq;
if(A_DEBUG>2){
cout << "chisqr= " << chisq << " out of "
<< entries << " combinations."<< endl;
}
}
void fcnalign34(Int_t &npar, Double_t *gin, Double_t &f,
Double_t *par, Int_t iflag){
Double_t chisq = 0.;
HGeomRotation rotmat[3];
HGeomVector transla[3];
HGeomVector a,b,c,d;
HGeomVector transf[4];
Float_t errorx[4];
Float_t errory[4];
HMdcAligner* pAlign = (HMdcAligner*)(gMinuit->GetObjectFit());
TClonesArray* theHits;
pAlign = (HMdcAligner*)(gMinuit->GetObjectFit());
TTree* pData= pAlign->getTree();
Stat_t entries = pData->GetEntries();
Int_t strategy = pAlign->getStrategy();
Float_t* weights;
weights = new Float_t[4];
weights = pAlign->getWeights();
Float_t* errors;
errors = new Float_t[8];
errors = pAlign->getErrors();
Int_t numMods = pAlign->getNumMods();
Bool_t UseUnitErrors = pAlign->getUseUnitErrors();
Bool_t UseModErrors = pAlign->getUseModErrors();
rotmat[0].setEulerAngles(par[0]*180./TMath::Pi(),
par[1]*180./TMath::Pi(),
par[2]*180./TMath::Pi());
transla[0].setX(par[3]);
transla[0].setY(par[4]);
transla[0].setZ(par[5]);
rotmat[1].setEulerAngles(par[6]*180./TMath::Pi(),
par[7]*180./TMath::Pi(),
par[8]*180./TMath::Pi());
transla[1].setX(par[9]);
transla[1].setY(par[10]);
transla[1].setZ(par[11]);
if(numMods>3){
rotmat[2].setEulerAngles(par[12]*180./TMath::Pi(),
par[13]*180./TMath::Pi(),
par[14]*180./TMath::Pi());
transla[2].setX(par[15]);
transla[2].setY(par[16]);
transla[2].setZ(par[17]);
}
cout << "HMdcAligner::fcnalign() Parameters: "
<< par[0] << "," << par[1] << "," << par[2] << ","
<< par[3] << "," << par[4] << "," << par[5] << ","
<< par[6] << "," << par[7] << "," << par[8] << ","
<< par[9] << "," << par[10] << "," << par[11] ;
if(numMods>3)
cout << par[12] << "," << par[13] << "," << par[14] << ","
<< par[15] << "," << par[16] << "," << par[17] ;
cout << endl;
HMdcHit *hitA;
HMdcHit *hitB;
HMdcHit *hitC;
HMdcHit *hitD=NULL;
for (Int_t i=0;i<entries;i++) {
pData->GetEntry(i);
theHits = pAlign->getHits();
hitA = (HMdcHit*) theHits->At(0);
hitB = (HMdcHit*) theHits->At(1);
hitC = (HMdcHit*) theHits->At(2);
if(numMods>3) hitD = (HMdcHit*) theHits->At(3);
if(numMods>3){
d.setX(hitD->getX());
d.setY(hitD->getY());
d.setZ(0.);
}
c.setX(hitC->getX());
c.setY(hitC->getY());
c.setZ(0.);
b.setX(hitB->getX());
b.setY(hitB->getY());
b.setZ(0.);
a.setX(hitA->getX());
a.setY(hitA->getY());
a.setZ(0.);
if(UseUnitErrors==kFALSE && UseModErrors==kFALSE ){
errorx[0] = (hitA->getErrX()<0.01)? hitA->getErrX() : 0.2;
errorx[1] = (hitB->getErrX()<0.01)? hitB->getErrX() : 0.2;
errorx[2] = (hitC->getErrX()<0.01)? hitC->getErrX() : 0.2;
if(numMods>3) errorx[3] = (hitD->getErrX()<0.01)? hitD->getErrX():0.2;
errory[0] = (hitA->getErrY()<0.01)? hitA->getErrY() : 0.1;
errory[1] = (hitB->getErrY()<0.01)? hitB->getErrY() : 0.1;
errory[2] = (hitC->getErrY()<0.01)? hitC->getErrY() : 0.1;
if(numMods>3) errory[3] = (hitD->getErrY()<0.01)? hitD->getErrY():0.1;
}
else if(UseModErrors==kTRUE){
errorx[0]=errors[0];errory[0]=errors[1];
errorx[1]=errors[2];errory[1]=errors[3];
errorx[2]=errors[4];errory[2]=errors[5];
if(numMods>3){errorx[3]=errors[6];errory[3]=errors[7];}
}
else
for(Int_t i=0;i<numMods;i++){
errorx[i]=1.0;
errory[i]=1.0;
}
if(A_DEBUG>4){
for(Int_t i=0;i<numMods;i++){
cout << "errorx[" << i <<"] = " << errorx[i] << endl;
cout << "errory[" << i <<"] = " << errory[i] << endl;
}
}
if(numMods>3){
transf[3] = d;
transf[2] = rotmat[0] * c + transla[0];
transf[1] = rotmat[1] * b + transla[1];
transf[0] = rotmat[2] * a + transla[2];
}
else{
transf[2] = c;
transf[1] = rotmat[0] * b + transla[0];
transf[0] = rotmat[1] * a + transla[1];
}
if(A_DEBUG>4){
for(Int_t i=0;i<numMods;i++){
cout << "transf[" << i <<"] ";
transf[i].print();
}
}
if(strategy == 105){
HGeomVector vecA(transf[0].getX()-transf[2].getX(),
transf[0].getY()-transf[2].getY(),
transf[0].getZ());
HGeomVector vecB(transf[1].getX()-transf[2].getX(),
transf[1].getY()-transf[2].getY(),
transf[1].getZ());
HGeomVector vecAxVecB = vecA.vectorProduct(vecB);
Float_t mod2VecA = vecA.scalarProduct(vecA);
Float_t mod2VecB = vecB.scalarProduct(vecB);
Float_t mod2VecAxVecB = vecAxVecB.scalarProduct(vecAxVecB);
Float_t sincua = mod2VecAxVecB / (mod2VecA*mod2VecB);
Float_t partialx_a = (2/(mod2VecA*mod2VecA*mod2VecB*mod2VecB)) *
( ( vecAxVecB.getX()*(rotmat[1](3)*vecB.getZ()-
rotmat[1](6)*vecB.getY()) +
vecAxVecB.getY()*(rotmat[1](6)*vecB.getX()-
rotmat[1](0)*vecB.getZ()) +
vecAxVecB.getZ()*(rotmat[1](0)*vecB.getY()-
rotmat[1](3)*vecB.getX()) ) *
(mod2VecA*mod2VecB) - mod2VecB * (rotmat[1](0)*vecA.getX() +
rotmat[1](3)*vecA.getY() +
rotmat[1](6)*vecA.getZ() ) *
mod2VecAxVecB );
Float_t partialy_a = (2/(mod2VecA*mod2VecA*mod2VecB*mod2VecB)) *
( ( vecAxVecB.getX()*(rotmat[1](4)*vecB.getZ()-
rotmat[1](7)*vecB.getY()) +
vecAxVecB.getY()*(rotmat[1](7)*vecB.getX()-
rotmat[1](1)*vecB.getZ()) +
vecAxVecB.getZ()*(rotmat[1](1)*vecB.getY()-
rotmat[1](4)*vecB.getX()) ) *
(mod2VecA*mod2VecB) - mod2VecB * (rotmat[1](1)*vecA.getX() +
rotmat[1](4)*vecA.getY() +
rotmat[1](7)*vecA.getZ() ) *
mod2VecAxVecB );
Float_t partialx_b = (2/(mod2VecA*mod2VecA*mod2VecB*mod2VecB)) *
( ( vecAxVecB.getY()*(vecB.getZ()-vecA.getZ()) +
vecAxVecB.getZ()*(vecA.getY()-vecB.getY()) ) *
(mod2VecA*mod2VecB) + ( vecA.getX()*mod2VecB +
vecB.getX()*mod2VecA ) *
mod2VecAxVecB );
Float_t partialy_b = (2/(mod2VecA*mod2VecA*mod2VecB*mod2VecB)) *
( ( vecAxVecB.getX()*(vecA.getZ()-vecB.getZ()) +
vecAxVecB.getY()*(vecB.getX()-vecA.getX()) ) *
(mod2VecA*mod2VecB) + ( vecA.getY()*mod2VecB +
vecB.getY()*mod2VecA ) *
mod2VecAxVecB );
Float_t partialx_c = (2/(mod2VecA*mod2VecA*mod2VecB*mod2VecB)) *
( ( vecAxVecB.getX()*(-rotmat[0](3)*vecA.getZ()+
rotmat[0](6)*vecA.getY()) +
vecAxVecB.getY()*(-rotmat[0](6)*vecA.getX()+
rotmat[0](0)*vecA.getZ()) +
vecAxVecB.getZ()*(-rotmat[0](0)*vecA.getY()+
rotmat[0](3)*vecA.getX()) ) *
(mod2VecA*mod2VecB) - mod2VecA * (rotmat[0](0)*vecB.getX() +
rotmat[0](3)*vecB.getY() +
rotmat[0](6)*vecB.getZ() ) *
mod2VecAxVecB );
Float_t partialy_c = (2/(mod2VecA*mod2VecA*mod2VecB*mod2VecB)) *
( ( vecAxVecB.getX()*(-rotmat[0](4)*vecA.getZ()+
rotmat[0](7)*vecA.getY()) +
vecAxVecB.getY()*(-rotmat[0](7)*vecA.getX()+
rotmat[0](1)*vecA.getZ()) +
vecAxVecB.getZ()*(-rotmat[0](1)*vecA.getY()+
rotmat[0](4)*vecA.getX()) ) *
(mod2VecA*mod2VecB) - mod2VecA * (rotmat[0](1)*vecB.getX() +
rotmat[0](4)*vecB.getY() +
rotmat[0](7)*vecB.getZ() ) *
mod2VecAxVecB);
Float_t varianzainsincua = (partialx_a*partialx_a*errorx[0]*errorx[0] +
partialy_a*partialy_a*errory[0]*errory[0] +
partialx_b*partialx_b*errorx[1]*errorx[1] +
partialy_b*partialy_b*errory[1]*errory[1] +
partialx_c*partialx_c*errorx[2]*errorx[2] +
partialy_c*partialy_c*errory[2]*errorx[2]);
chisq += (sincua*sincua)/varianzainsincua;
}
else{
Float_t ax=0.0, ay=0.0, bx=0.0, by=0.0;
Float_t sigax=0.0, sigay=0.0, sigbx=0.0, sigby=0.0;
Float_t Xwt, Xt, Xsxoss, Xsx=0.0, Xsy=0.0, Xst2=0.0, Xss=0.0;
Float_t Ywt, Yt, Ysxoss, Ysx=0.0, Ysy=0.0, Yst2=0.0, Yss=0.0;
Float_t XChi2=0.0, YChi2=0.0, chipar=0.0;
for(Int_t i=0;i<numMods;i++){
Xwt = 1.0/(errorx[i]*errorx[i]);
Xss += Xwt;
Xsx += transf[i].getZ()*Xwt;
Xsy += transf[i].getX()*Xwt;
Ywt = 1.0/(errory[i]*errory[i]);
Yss += Ywt;
Ysx += transf[i].getZ()*Ywt;
Ysy += transf[i].getY()*Ywt;
if(A_DEBUG>4)
cout << "Xwt=" << Xwt << " Xss=" << Xss
<< " Xsx=" << Xsx << " Xsy=" << Xsy
<< "Ywt=" << Ywt << " Yss=" << Yss
<< " Ysx=" << Ysx << " Ysy=" << Ysy << endl;
}
Xsxoss = Xsx/Xss;
Ysxoss = Ysx/Yss;
if(A_DEBUG>4)
cout << "Xsxoss=" << Xsxoss << " Ysxoss="
<< Ysxoss << endl;
for(Int_t i=0;i<numMods;i++){
Xt = (transf[i].getZ()-Xsxoss)/errorx[i];
Xst2 += Xt * Xt;
bx += Xt * transf[i].getX()/errorx[i];
Yt = (transf[i].getZ()-Ysxoss)/errory[i];
Yst2 += Yt * Yt;
by += Yt * transf[i].getY()/errory[i];
if(A_DEBUG>4)
cout << "Xt=" << Xt << " Xst2=" << Xst2
<< " bx (partial)=" << bx << "Yt=" << Yt
<< " Yst2=" << Yst2
<< " by (partial)=" << by << endl;
}
bx /= Xst2;
ax = (Xsy-(Xsx*bx))/Xss;
by /= Yst2;
ay = (Ysy-(Ysx*by))/Yss;
if(A_DEBUG>4)
cout << "bx=" << bx << " ax=" << ax
<< "by=" << by << " ay=" << ay << endl;
sigax = sqrt((1.0+Xsx*Xsx/(Xss*Xst2))/Xss);
sigbx = sqrt(1.0/Xst2);
sigay = sqrt((1.0+Ysx*Ysx/(Yss*Yst2))/Yss);
sigby = sqrt(1.0/Yst2);
if(A_DEBUG>4)
cout << "sigbx=" << sigbx << " sigax=" << sigax
<< "sigby=" << sigby << " sigay=" << sigay << endl;
for(Int_t i=0;i<numMods;i++){
chipar = (transf[i].getX()-ax-bx*transf[i].getZ())/errorx[i];
XChi2 += chipar*chipar;
chipar = (transf[i].getY()-ay-by*transf[i].getZ())/errory[i];
YChi2 += chipar*chipar;
if(A_DEBUG>4) {
cout << "DiffX: " << transf[i].getX()-ax-bx*transf[i].getZ()
<< "DiffY: " << transf[i].getY()-ay-by*transf[i].getZ() << endl;
cout << "chiparX" << (transf[i].getX()-ax-bx*transf[i].getZ())/errorx[i]
<< "chiparY" << (transf[i].getY()-ay-by*transf[i].getZ())/errory[i] << endl;
cout << "XChi2=" << XChi2 << " YChi2=" << YChi2 << endl;
}
}
Float_t part1=0,part2=0,part3=0,sdistance=0;
for(Int_t i=0;i<numMods;i++){
part1 = ( (transf[i].getX()-ax)*by ) - ( (transf[i].getY()-ay)*bx );
part2 = ( (transf[i].getY()-ay) ) - ( (transf[i].getZ() )*by );
part3 = ( (transf[i].getZ() )*bx ) - ( (transf[i].getX()-ax) );
sdistance += (part1*part1 + part2*part2 + part3*part3)
/(1+bx*bx+by*by);
if(A_DEBUG>4) cout << "Square Distance point " << i << " - line: "
<< sdistance << endl;
if(strategy==101) chisq += sdistance;
}
if(strategy==100) chisq += XChi2+YChi2;
}
}
f = chisq;
cout << "chisqr= " << chisq << " out of "
<< entries << " combinations."<< endl;
}
void fcnRot(Int_t &npar, Double_t *gin, Double_t &f,
Double_t *par, Int_t iflag){
Double_t chisq = 0.;
Double_t phi,theta;
phi = par[0];
theta = par[1];
Float_t *xpzon=new Float_t[9];
Float_t *ypzon=new Float_t[9];
Float_t *xcen=new Float_t[9];
Float_t *ycen=new Float_t[9];
HGeomVector tran;
HGeomRotation rot;
HGeomVector Target;
HMdcAligner* pAlign = (HMdcAligner*)(gMinuit->GetObjectFit());
pAlign = (HMdcAligner*)(gMinuit->GetObjectFit());
xcen = pAlign->getZonesX();
ycen = pAlign->getZonesY();
xpzon = pAlign->getResZonX();
ypzon = pAlign->getResZonY();
rot = pAlign->getRotMatrix(0);
tran = pAlign->getTranslation(0);
Target = pAlign->getLocalTarget(rot,tran);
Float_t A=0,B=0,C=0;
Float_t a=0,b=0,c=0;
Float_t xTar = Target.getX();
Float_t yTar = Target.getY();
Float_t zTar = Target.getZ();
Float_t term1,term2,term3,term4,total;
if(A_DEBUG>4) {
cout << endl <<"######## New call to fcnZ() #######" << endl;
cout << "phi=" << phi << " theta=" << theta;
cout << "Target in:" << xTar << ", " << yTar << ", " << zTar<< endl;
}
for (Int_t i=0; i<9;i++) {
if(A_DEBUG>4)
cout << "## Loop " << i << " ##" << endl;
a = xpzon[i]-xTar;
b = ypzon[i]-yTar;
c = -zTar;
A = b*xpzon[i]-a*ypzon[i];
B = c*xpzon[i] ;
C = c*ypzon[i] ;
if(A_DEBUG>4) {
cout << "a = " << a << " b = " << b << " c = " << c <<endl;
cout << "A = " << A << " B = " << B << " C = " << C <<endl;
cout << "xcen[i] = " << xcen[i] <<" ycen[i] = " << ycen[i] <<endl;
}
term1 = -A*sin(theta)-B*sin(phi)*cos(theta)+C*cos(phi)*cos(theta);
term2 = B*cos(phi) + C*sin(phi);
term3 = xcen[i]*xcen[i] + ycen[i]*ycen[i];
term4 = a*sin(theta)*cos(phi)+b*sin(theta)*sin(phi)+c*cos(theta);
total = term1*term1 + term2*term2 - term3*term4*term4;
if(A_DEBUG>4) {
cout << "term1 = " << term1 << " term2 = " << term2 << " term3 = "
<< term3 << " term4 = " << term4 << endl;
cout << "total = " << total << endl;
}
chisq += total*total;
if(A_DEBUG>4)
cout << "chisq = " << chisq << endl;
}
f = chisq;
if(A_DEBUG>4)
cout << " funcional = "<< f << endl;
}
Last change: Sat May 22 12:59:37 2010
Last generated: 2010-05-22 12:59
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.