Bool_t FakedSeeding::Process(Long64_t entry) { fChain->GetTree()->GetEntry(entry); //Map float zref = (float)m_zReference; PrSeedTrack *Track = new PrSeedTrack(zref); Track->setZref(zref); Track->setdRatio((float)m_dRatio); PrSeedTrack *Track_All = new PrSeedTrack(zref); Track_All->setZref(zref); Track_All->setdRatio((float)m_dRatio); double Z1 = 7855.6; double Z2 = 8040.4; double Z3 = 8537.6; const float dxDy = (5./360.00000)*2.*TMath::Pi(); double Z4 = 8722.4; double Z5 = 9222.6; double Z6 = 9407.4; double ZU1 = 7917.2; double ZV1 = 7978.8; double ZU2 = 8599.2; double ZV2 = 8660.8; double ZU3 = 9284.8; double ZV3 = 9345.8; double X1 = X1st; double X2 = X2nd; double X3 = X3rd; double X4 = X4th; double X5 = X5th; double X6 = X6th; double XU1 = Ux1st; double XU2 = Ux2nd; double XU3 = Ux3rd; double XV1 = Vx1st; double XV2 = Vx2nd; double XV3 = Vx3rd; Hit hit1 =Hit(X1,Y1st,Z1); Hit hit2 =Hit(XU1,Uy1st,ZU1); hit2.SetDxDy(dxDy); Hit hit3 =Hit(XV1,Vy1st,ZV1); hit3.SetDxDy(-dxDy); Hit hit4 =Hit(X2,Y2nd,Z2); Hit hit5 =Hit(X3,Y3rd,Z3); Hit hit6 =Hit(XU2,Uy2nd,ZU2); hit6.SetDxDy(dxDy); Hit hit7 =Hit(XV2,Vy2nd,ZV2); hit7.SetDxDy(-dxDy); Hit hit8 =Hit(X4,Y4th,Z4); Hit hit9 =Hit(X5,Y5th,Z5); Hit hit10 =Hit(XU3,Uy3rd,ZU3); hit10.SetDxDy(-dxDy); Hit hit11 =Hit(XV3,Vy3rd,ZV3); hit11.SetDxDy(dxDy); Hit hit12 =Hit(X6,Y6th,Z6); std::vector<Hit> AllHits; std::random_device rd_1; std::mt19937 gen_1(rd_1()); std::discrete_distribution<> d_1({4, 24, 33, 39}); hit1.SetSize((double)d_1(gen_1)); hit2.SetSize((double)d_1(gen_1)); hit3.SetSize((double)d_1(gen_1)); hit4.SetSize((double)d_1(gen_1)); hit5.SetSize((double)d_1(gen_1)); hit6.SetSize((double)d_1(gen_1)); hit7.SetSize((double)d_1(gen_1)); hit8.SetSize((double)d_1(gen_1)); hit9.SetSize((double)d_1(gen_1)); hit10.SetSize((double)d_1(gen_1)); hit11.SetSize((double)d_1(gen_1)); hit12.SetSize((double)d_1(gen_1)); AllHits.push_back(hit1); AllHits.push_back(hit2); AllHits.push_back(hit3); AllHits.push_back(hit4); AllHits.push_back(hit5); AllHits.push_back(hit6); AllHits.push_back(hit7); AllHits.push_back(hit8); AllHits.push_back(hit9); AllHits.push_back(hit10); AllHits.push_back(hit11); AllHits.push_back(hit12); Track_All->addHits(AllHits); //Track_All->printHits(); //in a for loop Size = (double)d_1(gen_1); //FITTA(Track_All); std::vector<Hit> Hitss = Track_All->hits(); double solutions[4]; double solutions_y[3]; std::vector<double> dsolution; std::vector<double> dsolution_y; std::fill(solutions,solutions+4,0.); std::fill(solutions_y,solutions_y+3,0.); double res = 0.; double resy = 0.; double dz = 0; // if(P<5000) return kTRUE; // if(OVTX_Z>4000) return kTRUE; // if( std::abs(PID)==11 || (std::abs(PID)!=211 && std::abs(PID)!=2212 && std::abs(PID)!=321 && std::abs(PID)!=13)) // return kTRUE; // if ((Y1st>=0 && Y6th<=0)||(Y1st>=0 && Y6th<=0)) // return kTRUE; // if(P<500) // return kTRUE; int regionT1= -1; int regionT3 = -1; if(std::fabs(Y1st)>500){ if(std::fabs(X1st)>500) regionT1 = 3; if(std::fabs(X1st)<=500) regionT1 = 2; } if(std::fabs(Y1st)<500){ if(std::fabs(X1st>500)) regionT1 = 1; if(std::fabs(X1st<500)) regionT1 = 0; } if(std::fabs(Y6th)>500){ if(std::fabs(X6thx)>500) regionT3 = 3; if(std::fabs(X6th)<=500) regionT3 = 2; } if(std::fabs(Y6th)<500){ if(std::fabs(X6th>500)) regionT3 = 1; if(std::fabs(X1st<500)) regionT3 = 0; } XYType=-1; XZType=-1; //Region motion With Y info, without Y info //2 / 3 0-->0 XYType = 0 0/2 --> 0/2 XZType = 0 2*regionT1%2 + regionT3%2 //0 / 1 0-->1 XYType = 1 0/2 --> 1/3 XZType = 1 // 0-->2 XYType = 2 1/3 --> 0/2 XZType = 2 // 0-->3 XYType = 3 1/3 --> 1/3 XYType = 3 // 1-->0 XYType = 4 // 1-->1 XYType = 5 // 1-->2 XYType = 6 // 1-->3 XYType = 7 // 2-->0 XYtype = 8 // 2-->1 XYType = 9 // 2-->2 XYType = 10 // 2-->3 XYType = 11 // 3-->0 XYType = 12 // 3-->1 XYType = 13 // 3-->2 XYType = 14 // 3-->3 XYType = 15 XYType = regionT1*4+regionT3; XZType = 2*regionT2%2+regionT3%2; if(doFit){ for(int j=0;j<3;j++){//loop //std::fill(dsolutions,dsolutions+4,0.); LinParFit<double> fit(4); LinParFit<double> fit_y(3); for (int i = 0;i<Hitss.size();i++){ dz =(double)(Hitss[i].GetZ()-m_zReference); res=(double)(Hitss[i].GetX() - (solutions[0]+solutions[1]*dz+solutions[2]*dz*dz+solutions[3]*dz*dz*dz));//*dz*dz*dz+solutions[4]*dz*dz*dz*dz)); resy = (double)(Hitss[i].GetY()-(solutions_y[0]+solutions_y[1]*dz + solutions_y[2]*dz*dz)); //std::cout<<"Loop\t"<<j<<"\t Residual \t"<<res<<std::endl; fit_y.accumulate(resy,0.100,dz); fit.accumulate(res,0.100,dz); } //std::vector<double> solution; dsolution_y= fit_y.solution(); dsolution=fit.solution(); for (int k=0;k<4;k++){ if(k<3){ solutions_y[k]+=dsolution_y[k]; } solutions[k]+=dsolution[k]; } } //Fit for y(z) = [0]+[1]*(z-zRef) //So y(zRef) = [0] double ay = solutions_y[0];// - m_zReference*solutions_y[1]; double by = solutions_y[1]; double cy = solutions_y[2]; //std::cout<<"Par \t Value "<<std::endl; double a = solutions[0]; double b = solutions[1]; double c = solutions[2]; double e = solutions[3]/solutions[2]; double Constant_C; ay_0=ay; by_0=by; cy_0=cy; ax_0=a; bx_0=b; cx_0=c; dx_0=e; xFirst=X1st; xLast=X6th; yFirst=Y1st; yLast=Y6th; t1->Fill(); // double f = solutions[4]/(solutions[3]*solutions[2]); // std::cout<<" a \t"<<a // <<"\n b \t"<<b // <<"\n c \t"<<c // <<"\n e \t"<<e<<std::endl; for (int i = 0;i<Hitss.size();i++){ dz = (double)(Hitss[i].GetZ()-m_zReference); res = (double)(Hitss[i].GetX() - (a+b*dz+c*dz*dz*(1.+e*dz)));//+solutions[3]));//*dz*dz*dz+solutions[4]*dz*dz*dz*dz)); // std::d::cout<<"Hit Index\t Residual"<<"\n "<<i<<"\t"<<res<<std::endl; } // <<"\n f \t"<<f // <<std::endl; double dRatioy = solutions_y[2]/solutions_y[1]; //std::cout<<"Fitted dRatio y " <<solutions_y[2]/solutions_y[1]<<std::endl; Fitted_dRatioy->Fill(dRatioy*10e6); Fitted_dRatioyVsC->Fill(dRatioy*10e6,c); Fitted_dRatioyVsP->Fill(dRatioy*10e6,P); Fitted_dRatioyVsXFirst->Fill(dRatioy*10e6,a); Constant_C =( b * m_zReference - a)/c; C_Constant->Fill(Constant_C); Fitted_dRatio->Fill((double)e); Fitted_dRatio_Vs_p->Fill((double)P,(double)e); Fitted_dRatio_VsXAtZ->Fill((double)a,(double)e); //Vs aY Fitted_dRatio_VsYatZ->Fill((double)(ay),(double)e); Fitted_dRatio_VsbyatZ->Fill((double)by,(double)e); Fitted_dRatio_VsbyOveray->Fill((double)(ay/by),(double)e); // std::cout<<"ay = "<<ay // <<"by = "<<by // <<"by/ay ="<<ay/by<<std::endl; C_Constant_Vs_P->Fill((double)P,(double)Constant_C); if(P>1000 && OVTX_Z<9000 && std::abs(PID)!=11) { //Vs y Fitted_dRatio_VsYatZSel->Fill((double)(ay),(double)e); Fitted_dRatio_VsbyatZSel->Fill((double)(by),(double)e); Fitted_dRatio_VsbyOveraySel->Fill((double)(ay/by),(double)e); Fitted_dRatio_Sel->Fill((double)e); Fitted_dRatio_Vs_p_Sel->Fill((double)P,(double)e); C_Constant_Vs_P_Sel->Fill((double)P,(double)Constant_C); C_Constant_Sel->Fill(Constant_C); C_Constant_Vs_a->Fill(Constant_C,std::abs(a)); C_Constant_Vs_b->Fill(Constant_C,b); C_Constant_Vs_c->Fill(Constant_C,c); } } //---------------- // Only X Layers //---------------- std::vector<double> Z; Z.push_back((float)Z1); Z.push_back((float)Z2); Z.push_back((float)Z3); Z.push_back((float)Z4); Z.push_back((float)Z5); Z.push_back((float)Z6); //-------------- //Remove Electrons , Keep Muon(13), Pions(211), Protons(2212),Kaons(321) if(P<500) return kTRUE; if(OVTX_Z>9000) return kTRUE; if( std::abs(PID)==11 || (std::abs(PID)!=211 && std::abs(PID)!=2212 && std::abs(PID)!=321 && std::abs(PID)!=13)) return kTRUE; if ((Y1st>=0 && Y6th<=0)||(Y1st>=0 && Y6th<=0)) return kTRUE; //Fit result plotted for this selection m_Total++; std::vector<double> X_true; std::vector<double> X_smear; X_true.push_back(X1st); X_true.push_back(X2nd); X_true.push_back(X3rd); X_true.push_back(X4th); X_true.push_back(X5th); X_true.push_back(X6th); Int_t Case=0; double X_T3_2 = X6th +gRandom->Gaus(0,m_sigmaSmearing); // X in last Layer double X_T1_1 = X1st +gRandom->Gaus(0,m_sigmaSmearing); // X in first Layer double Z_T3_2 = Z6; // Z of last Layer double Z_T1_1 = Z1; // Z of first Layer double X_T1_2 = X2nd +gRandom->Gaus(0,m_sigmaSmearing); double Z_T1_2 = Z2; double X_T2_1 = X3rd +gRandom->Gaus(0,m_sigmaSmearing); // X of 1st Layer in T2 double Z_T2_1 = Z3; // Z of 1st Layer in T2 double X_T2_2 = X4th+gRandom->Gaus(0,m_sigmaSmearing); // X of 2nd Layer in T2 double Z_T2_2 = Z4; // Z of 2nd Layer in T2 double X_T3_1 = X5th+gRandom->Gaus(0,m_sigmaSmearing); double Z_T3_1 = Z5th; if(Case==0){ Xlast= X_T3_2; Zlast= Z_T3_2; Xfirst= X_T1_2; Zfirst= Z_T1_2; } if(Case==1){ Xfirst=X_T1_1; Zfirst=Z_T1_1; Xlast=X_T3_1; Zlast=Z_T3_1; } if(Case==2){ Xfirst =X_T1_2; Xlast =X_T3_2; Zfirst =Z_T1_1; Xlast =Z_T3_2; } if(Case==0){ X_smear.push_back((float)Xfirst); X_smear.push_back((float)X_T1_2); X_smear.push_back((float)X_T2_1); X_smear.push_back((float)X_T2_2); X_smear.push_back((float)X_T3_1); X_smear.push_back((float)Xlast); } if(Case==1){ X_smear.push_back((float)Xfirst); X_smear.push_back((float)X_T1_2); X_smear.push_back((float)X_T2_1); X_smear.push_back((float)X_T2_2); X_smear.push_back((float)Xlast); X_smear.push_back((float)X_T3_2); } if(Case==1){ X_smear.push_back((float)XT1_1); X_smear.push_back((float)Xfirst); X_smear.push_back((float)X_T2_1); X_smear.push_back((float)X_T2_2); X_smear.push_back((float)X_T3_1); X_smear.push_back((float)Xlast); } for (int i =0;i<6;i++) { Hit_res->Fill(X_smear[i]-X_true[i]); } std::vector<Hit> Hits; double t_inf = Xfirst/Zfirst; double X_last_Projected = Xfirst/Zfirst*Zlast; double Distance_LastToInfProjected = Xlast-X_last_Projected; //LastInf //LastInfDistance = Xlast-X_last_Projected double Correction = m_alphaCorrection*(t_inf); double Distance_LastToInfProjected_Corrected = Distance_LastToInfProjected - Correction; // Xlast -(m_alphaCoorection*t_inf+Xfirst/Zfirst*Zlast) L0_Corrected_1d->Fill(Distance_LastToInfProjected_Corrected); L0_1d->Fill(Distance_LastToInfProjected); //---------- //L0 Plots (selection for last layer dependengly on first layer picked position) //L0_1d->Write(); //--------- L0_0->Fill(X_last_Projected,Distance_LastToInfProjected); L0_1->Fill(t_inf,Distance_LastToInfProjected); L0_Corrected->Fill(t_inf,Distance_LastToInfProjected_Corrected); //To D0 : check for cases different from this and if one can gain from selecting only hits in central region applying another rotation (diagonal one) //-----------------L1 step Do the selection if( std::abs(Distance_LastToInfProjected_Corrected) > L0_Up) return kTRUE; m_L0Selected++; double tx_picked = (Xlast-Xfirst)/(Zlast-Zfirst) ; double X_projected_3rd = Xfirst + tx_picked *(Z3-Zfirst); double Deltatx = tx_picked - t_inf; double Delta = X_T2_1 - X_projected_3rd; double x0 = -1*(tx_picked)*Zfirst + Xfirst; double CorrX0 = m_x0Corr*x0; double DeltaCorr = Delta - CorrX0 ; x0vsTxInf->Fill(x0,t_inf); L1_0->Fill(x0,Delta); L1_0_corr->Fill(x0,DeltaCorr); L1_0_1D ->Fill(Delta); L1_0_1D_Corr->Fill(DeltaCorr); if(x0>0) { L1_0_x0pos->Fill(tx_picked,Delta); L1_1_x0pos->Fill(Deltatx,Delta); L1_2_x0pos->Fill(x0,Delta); L1_0_x0posCorr->Fill(tx_picked,DeltaCorr); L1_1_x0posCorr->Fill(Deltatx,DeltaCorr); L1_2_x0posCorr->Fill(x0,DeltaCorr); } if(x0<0) { L1_0_x0neg->Fill(tx_picked,Delta); L1_1_x0neg->Fill(Deltatx,Delta); L1_2_x0neg->Fill(x0,Delta); L1_0_x0negCorr->Fill(tx_picked,DeltaCorr); L1_1_x0negCorr->Fill(Deltatx,DeltaCorr); L1_2_x0negCorr->Fill(x0,DeltaCorr); } //Do L1 Selection: //x0<0 : res_Corr < m_m1(x+m_x0Offset) +m_yOff1 //Upper // res_Corr > m_m2(x+m_x0Offset) +m_yOff2 //Lower //x0>0 : res_Corr > m_m2(x-m_x0Offset) -m_yOff2 // res_Corr < m_m1(x+m_x0Offset) -m_yOff1 if(x0<0.) { double upperBound = m_m1*(x0+m_x0Offset)+m_yOff1; double lowerBound = m_m2*(x0+m_x0Offset)+m_yOff2; if(DeltaCorr> upperBound || DeltaCorr<lowerBound) return kTRUE; } if(x0>0.) { double lowerBound = m_m1*(x0-m_x0Offset)-m_yOff1; double upperBound = m_m2*(x0-m_x0Offset)-m_yOff2; if(DeltaCorr> upperBound || DeltaCorr<lowerBound) return kTRUE; } m_L1Selected++; //Be carefull in real Life these parameters has to be optimised and look to occupancy (1Hit /8mm expected) //================================ //Selection L2 In this step we will have a 3 Hit Combination (case0_1) 1st,3rd,6th station //=============================== //We Fit the parabola with 3 hits (or we compute the parabola) //2 Methods : //Compute Parabola in 2 ways //Parabola simple //Parabola with 3rd order correction //Create Method SolveParabola(Hit1,Hit2,Hit3,a,b,c); //Create Method SolveParabola2(Hit1,Hit2,Hit3,a,b,c); //Try to plot the q/p vs c with SolveParabola1 and SolveParabola2 //Look to Delta ParabolaExtrapolated Hit_X2, Hit_X4,Hit_X5 Hit *Hit1 = new Hit(Xfirst,0,Zfirst); Hit *Hit2 = new Hit(X_T2_1,0,Z3); Hit *Hit3 = new Hit(Xlast,0,Zlast); double a_par1=0; double b_par1=0; double c_par1=0; double a_par2=0; double b_par2=0; double c_par2=0; SolveParabola(Hit1,Hit2,Hit3,a_par1,b_par1,c_par1); //std::cout<<"a \t "<<a_par1<<"\t b \t "<<b_par1<<"\t c \t "<<c_par1<<std::endl; SolveParabola2(Hit1,Hit2,Hit3,a_par2,b_par2,c_par2); //std::cout<<"a \t "<<a<<"\t b \t "<<b<<"\t c \t "<<c<<std::endl; //std::cout<<"Next Track"<<std::endl; Hit *HitT1 = new Hit(X_T1_2,0.,Z_T1_2 ); Hit *HitT2 = new Hit(X_T2_2,0.,Z_T2_2 ); Hit *HitT3 = new Hit(X_T3_1,0.,Z_T3_1 ); //Compute distance from Parabola 1: //Extrapolate Hit double ExtrapolX_T1_par1 = Extrapol(HitT1->GetZ(),a_par1,b_par1,c_par1); double ExtrapolX_T2_par1 = Extrapol(HitT2->GetZ(),a_par1,b_par1,c_par1); double ExtrapolX_T3_par1 = Extrapol(HitT3->GetZ(),a_par1,b_par1,c_par1); double DeltaX_T1_par1 = HitT1->GetX()-ExtrapolX_T1_par1; double DeltaX_T2_par1 = HitT2->GetX()-ExtrapolX_T2_par1; double DeltaX_T3_par1 = HitT3->GetX()-ExtrapolX_T3_par1; // //Compute distance from Parabola 2: double ExtrapolX_T1_par2 = Extrapol2(HitT1->GetZ(),a_par2,b_par2,c_par2); double ExtrapolX_T2_par2 = Extrapol2(HitT2->GetZ(),a_par2,b_par2,c_par2); double ExtrapolX_T3_par2 = Extrapol2(HitT3->GetZ(),a_par2,b_par2,c_par2); double DeltaX_T1_par2 = HitT1->GetX()-ExtrapolX_T1_par2; double DeltaX_T2_par2 = HitT2->GetX()-ExtrapolX_T2_par2; double DeltaX_T3_par2 = HitT3->GetX()-ExtrapolX_T3_par2; L2_0_T1_par1->Fill(DeltaX_T1_par1); L2_0_T2_par1->Fill(DeltaX_T2_par1); L2_0_T3_par1->Fill(DeltaX_T3_par1); L2_0_T1_par2->Fill(DeltaX_T1_par2); L2_0_T2_par2->Fill(DeltaX_T2_par2); L2_0_T3_par2->Fill(DeltaX_T3_par2); // std::cout<<DeltaX_T1_par1<<"\t"<<DeltaX_T2_par1<<"\t"<<DeltaX_T3_par1<<std::endl; // std::cout<<DeltaX_T1_par2<<"\t"<<DeltaX_T2_par2<<"\t"<<DeltaX_T3_par2<<std::endl; if( std::abs(DeltaX_T1_par1) < maxDelta_par1 && std::abs(DeltaX_T2_par1) < maxDelta_par1 && std::abs(DeltaX_T3_par1) < maxDelta_par1) m_L2_Par1_Selected ++; if( std::abs(DeltaX_T1_par2) < maxDelta_par2 && std::abs(DeltaX_T2_par2) < maxDelta_par2 && std::abs(DeltaX_T3_par2) < maxDelta_par2) m_L2_Par2_Selected ++; //--------------------- //L2//Parabola 1 Selection //--------------------- if( std::abs(DeltaX_T1_par1) > maxDelta_par1 && std::abs(DeltaX_T2_par1) < maxDelta_par1 && std::abs(DeltaX_T3_par1) > maxDelta_par1) return kTRUE; //LinParFit<double> fit_quartic(5); LinParFit<double> fit_parabola(3); std::vector<double> x,errx,z; //Create the vector of Hits // double Xlast = X6th; // X in last Layer // double Xfirst = X1st; // X in first Layer // double Zlast = Z6; // Z of last Layer // double Zfirst = Z1; // Z of first Layer // double X_T1_2 = X2nd; // double Z_T1_2 = Z2; // double X_T2_1 = X3rd; // X of 1st Layer in T2 // double Z_T2_1 = Z3; // Z of 1st Layer in T2 // double X_T2_2 = X4th; // X of 2nd Layer in T2 // double Z_T2_2 = Z4; // Z of 2nd Layer in T2 // double X_T3_1 = X5th; // double Z_T3_1 = Z5; x.push_back(Xfirst); x.push_back(X_T1_2); x.push_back(X_T2_1); x.push_back(X_T2_2); x.push_back(X_T3_1); x.push_back(Xlast); z.push_back(Zfirst-m_zReference); z.push_back(Z2-m_zReference); z.push_back(Z3-m_zReference); z.push_back(Z4-m_zReference); z.push_back(Z5-m_zReference); z.push_back(Zlast-m_zReference); std::random_device rd; std::mt19937 gen(rd()); std::discrete_distribution<> d({4, 24, 33, 39}); // for (int i=0;i<6;i++) // { // Hit Hit(X_smear[i],0.,Z[i]); // Hits.push_back(Hit); // } // Track->addHits(Hits); // Track->printTrack(); double ClSize = 0; for (int i=0;i<6;i++) { Hit Hit(X_smear[i],0.,Z[i]); ClSize = (double)d(gen); ClSize_1->Fill(ClSize+1); //GeneratedSize->Fill(ClSize+1.); errx.push_back(0.05 + 0.03*(ClSize+1.)); Hit.SetSize((int)(ClSize+1)); Hits.push_back(Hit); } Track->addHits(Hits); for (auto ity = std::begin(x), its = std::begin(errx), itx = std::begin(z); std::end(x) != ity; ++ity, ++its, ++itx) { fit_parabola.accumulate(*ity, *its, *itx); } std::vector<double> solution; solution = fit_parabola.solution(); double Chi2 = 0; for (auto ity = std::begin(x), its = std::begin(errx), itx = std::begin(z); std::end(x) != ity; ++ity, ++its, ++itx) { Chi2+=std::pow(*ity - (solution[0]+solution[1]*(*itx)+solution[2]*(*itx)*(*itx)),2)/((*its)*(*its)); } Chi2_par1->Fill(Chi2); bool Ok = fitXProjection(Track); if(Ok) { float C = (Track->b() * m_zReference - Track->a())/(Track->c()); float X0 = Track->a() - Track->b()*m_zReference +Track->c()*m_ConstC; C_par->Fill(C); XBackProj->Fill(X0); Chi2_par2->Fill(Track->chi2()); } if(Ok) { m_L2_Selection_ParCubic++; //std::cout<<"C\t"<<C<<std::endl; //Track->printTrack(); } //Track->printTrack(); // std::cout<<"Chi2 = \t "<<Chi2<<std::endl; //std::cout<<fit_parabola<<std::endl; return kTRUE; }
static void sizepolicy_free_snap(WSizePolicy *szplcy, WRegion *reg, WRectangle *rq_geom, int rq_flags, WFitParams *fp) { WRectangle max_geom=fp->g; bool fullw=((rq_flags®ION_RQGEOM_WEAK_W) && (*szplcy&SIZEPOLICY_HORIZ_MASK)==SIZEPOLICY_HORIZ_CENTER); bool fullh=((rq_flags®ION_RQGEOM_WEAK_H) && (*szplcy&SIZEPOLICY_VERT_MASK)==SIZEPOLICY_VERT_CENTER); int w=(fullw ? max_geom.w : minof(rq_geom->w, max_geom.w)); int h=(fullh ? max_geom.h : minof(rq_geom->h, max_geom.h)); int x_=0, y_=0; if(!(rq_flags®ION_RQGEOM_WEAK_X) && rq_flags®ION_RQGEOM_WEAK_W){ x_=fit_x(rq_geom->x, 1, &max_geom); if(((*szplcy)&SIZEPOLICY_HORIZ_MASK)==SIZEPOLICY_HORIZ_RIGHT) w=max_geom.x+max_geom.w-x_; else w=minof(w, max_geom.x+max_geom.w-x_); } if(!(rq_flags®ION_RQGEOM_WEAK_Y) && rq_flags®ION_RQGEOM_WEAK_H){ y_=fit_x(rq_geom->y, 1, &max_geom); if(((*szplcy)&SIZEPOLICY_VERT_MASK)==SIZEPOLICY_VERT_BOTTOM) h=max_geom.y+max_geom.h-y_; else h=minof(h, max_geom.y+max_geom.h-y_); } if(reg!=NULL) region_size_hints_correct(reg, &w, &h, FALSE); fp->g.w=w; fp->g.h=h; if(!(rq_flags®ION_RQGEOM_WEAK_X) && rq_flags®ION_RQGEOM_WEAK_W){ fp->g.x=x_; }else if(rq_flags®ION_RQGEOM_WEAK_X){ switch((*szplcy)&SIZEPOLICY_HORIZ_MASK){ case SIZEPOLICY_HORIZ_CENTER: fp->g.x=max_geom.x+(max_geom.w-w)/2; break; case SIZEPOLICY_HORIZ_LEFT: fp->g.x=max_geom.x; break; case SIZEPOLICY_HORIZ_RIGHT: fp->g.x=max_geom.x+max_geom.w-w; break; default: fp->g.x=fit_x(rq_geom->x, w, &max_geom); break; } }else{ fp->g.x=fit_x(rq_geom->x, w, &max_geom); } if(!(rq_flags®ION_RQGEOM_WEAK_Y) && rq_flags®ION_RQGEOM_WEAK_H){ fp->g.y=y_; }else if(rq_flags®ION_RQGEOM_WEAK_Y){ switch((*szplcy)&SIZEPOLICY_VERT_MASK){ case SIZEPOLICY_VERT_CENTER: fp->g.y=max_geom.y+(max_geom.h-h)/2; break; case SIZEPOLICY_VERT_TOP: fp->g.y=max_geom.y; break; case SIZEPOLICY_VERT_BOTTOM: fp->g.y=max_geom.y+max_geom.h-h; break; default: fp->g.y=fit_y(rq_geom->y, h, &max_geom); break; } }else{ fp->g.y=fit_y(rq_geom->y, h, &max_geom); } (*szplcy)&=~(SIZEPOLICY_VERT_MASK|SIZEPOLICY_HORIZ_MASK); *szplcy|=( (fullw || fp->g.x<=max_geom.x ? SIZEPOLICY_HORIZ_LEFT : 0) |(fullw || fp->g.x+fp->g.w>=max_geom.x+max_geom.w ? SIZEPOLICY_HORIZ_RIGHT : 0) |(fullh || fp->g.y<=max_geom.y ? SIZEPOLICY_VERT_TOP : 0) |(fullh || fp->g.y+fp->g.h>=max_geom.y+max_geom.h ? SIZEPOLICY_VERT_BOTTOM : 0)); }