///////////////////////////////////////////////////////////////////////////// // SmearingClass.cxx -- ATLAS Experiment Software // //////////////////////////////////////////////////////////////////////////// /// /// class providing corrections to the simulated muon pT to match pT in data. /// Resolution smearing and scale shift numbers are preliminary /// /// Version for simulation and data from /// PLHC 2011 (1st round, preliminary numbers, an update will be provided). /// /// responsible: atlas-perf-muons-conveners (at) cern.ch /// #include #include #include #include "SmearingClass.h" using namespace MuonSmear; SmearingClass::SmearingClass(){ gRand = NULL; CallSetClass=false; } SmearingClass::SmearingClass(std::string Data, std::string Algo, std::string SmearType, std::string Rel, std::string Dir) { CallSetClass=true; Initialize(Data,Algo,SmearType,Rel,Dir); } SmearingClass::SmearingClass(const SmearingClass& _rhs){ const std::string SmearType = _rhs.Tsmear==SMEAR_QPT ? "q_pT" : "pT"; Initialize(_rhs.DataYear,_rhs.Algorithm,SmearType,_rhs.Release,_rhs.Fdir); } SmearingClass::~SmearingClass(){ Finalize(); } void SmearingClass::Initialize(std::string data, std::string algo, std::string smearType, std::string rel, std::string dir) { detType=""; GeV=1000; pTmax=100000000; gRand = new TRandom3(); gRand->SetSeed(0); useTan2=true; useScale=false; restrictCurvCorrSigma=0.0; apply_to_data=false; useImprovedCombine=false; ptms=0; ptid=0; ptcb=0; eta=0; charge=0; if(CallSetClass){ Tscale = SCALE_DEFAULT; SetAlgoSmearRelDir(data,algo,smearType,rel,dir); } } void SmearingClass::Finalize(){ gRand->Delete(); scale_CB.clear(); scaleSyst_CB.clear(); p1_ID.clear(); p2_ID.clear(); p2_ID_TAN.clear(); p1_MS.clear(); p2_MS.clear(); E_p1_ID.clear(); E_p2_ID.clear(); E_p2_ID_TAN.clear(); E_p1_MS.clear(); E_p2_MS.clear(); S_p1_ID.clear(); S_p2_ID.clear(); S_p2_ID_TAN.clear(); S_p1_MS.clear(); S_p2_MS.clear(); MC_p1_ID.clear(); MC_p2_ID.clear(); MC_p2_ID_TAN.clear(); MC_p0_MS.clear(); MC_p1_MS.clear(); MC_p2_MS.clear(); CorrMatC0.clear(); CorrMatC1.clear(); CorrMatC2.clear(); CorrMatC3.clear(); CorrMatC4.clear(); CorrMatC5.clear(); CorrMatTanC0.clear(); CorrMatTanC1.clear(); CorrMatTanC2.clear(); CorrMatTanC3.clear(); CorrMatTanC4.clear(); CorrMatTanC5.clear(); InValues.clear(); } void SmearingClass::CleanScales(){ apply_to_data = false; Tscale = SCALE_DEFAULT; scaleBins.clear(); S1_ID.clear(); S2_ID.clear(); S1_MS.clear(); S2_MS.clear(); S1_CB.clear(); S2_CB.clear(); S1Corr_ID.clear(); S2Corr_ID.clear(); S1Corr_MS.clear(); S2Corr_MS.clear(); S1Corr_CB.clear(); S2Corr_CB.clear(); S1ACorr_ID.clear(); S2ACorr_ID.clear(); S1ACorr_MS.clear(); S2ACorr_MS.clear(); S1ACorr_CB.clear(); S2ACorr_CB.clear(); } void SmearingClass::Clean(){ scale_CB.clear(); scaleSyst_CB.clear(); CleanScales(); p1_ID.clear(); p2_ID.clear(); p2_ID_TAN.clear(); p1_MS.clear(); p2_MS.clear(); E_p1_ID.clear(); E_p2_ID.clear(); E_p2_ID_TAN.clear(); E_p1_MS.clear(); E_p2_MS.clear(); S_p1_ID.clear(); S_p2_ID.clear(); S_p2_ID_TAN.clear(); S_p1_MS.clear(); S_p2_MS.clear(); MC_p1_ID.clear(); MC_p2_ID.clear(); MC_p2_ID_TAN.clear(); MC_p0_MS.clear(); MC_p1_MS.clear(); MC_p2_MS.clear(); CorrMatC0.clear(); CorrMatC1.clear(); CorrMatC2.clear(); CorrMatC3.clear(); CorrMatC4.clear(); CorrMatC5.clear(); CorrMatTanC0.clear(); CorrMatTanC1.clear(); CorrMatTanC2.clear(); CorrMatTanC3.clear(); CorrMatTanC4.clear(); CorrMatTanC5.clear(); InValues.clear(); } void SmearingClass::SetAlgoSmearRelDir(std::string Data, std::string Algo, std::string SmearType, std::string Rel, std::string Dir) { if(!CallSetClass){ Initialize(Data,Algo,SmearType,Rel,Dir); } /*Checking DataType*/ DataYear=Data; std::cout<<"SmearingClass INFO:: using " << DataYear <>tmpval; scale_CB.push_back(tmpval); InValues>>tmpval; scaleSyst_CB.push_back(tmpval); i++; } } InValues.close(); InValues.clear(); /* filling data vectors*/ InValues.open(data_val.c_str()); i=0; if(!InValues.good()){ std::cout<<"SmearingClass ERROR:: File "<>tmpval; p1_ID.push_back(tmpval); InValues>>tmpval; p2_ID.push_back(tmpval); InValues>>tmpval; p2_ID_TAN.push_back(tmpval); InValues>>tmpval; p1_MS.push_back(tmpval); InValues>>tmpval; p2_MS.push_back(tmpval); /*errors*/ InValues>>tmpval; E_p1_ID.push_back(tmpval); InValues>>tmpval; E_p2_ID.push_back(tmpval); InValues>>tmpval; E_p2_ID_TAN.push_back(tmpval); InValues>>tmpval; E_p1_MS.push_back(tmpval); InValues>>tmpval; E_p2_MS.push_back(tmpval); /*systematic*/ InValues>>tmpval; S_p1_ID.push_back(tmpval); InValues>>tmpval; S_p2_ID.push_back(tmpval); InValues>>tmpval; S_p2_ID_TAN.push_back(tmpval); InValues>>tmpval; S_p1_MS.push_back(tmpval); InValues>>tmpval; S_p2_MS.push_back(tmpval); } } InValues.close(); InValues.clear(); /* filling mc vectors*/ InValues.open(mc_val.c_str()); i=0; if(!InValues.good()){ std::cout<<"SmearingClass ERROR:: File "<>tmpval; MC_p1_ID.push_back(tmpval); InValues>>tmpval; MC_p2_ID.push_back(tmpval); InValues>>tmpval; MC_p2_ID_TAN.push_back(tmpval); InValues>>tmpval; MC_p0_MS.push_back(tmpval); InValues>>tmpval; MC_p1_MS.push_back(tmpval); InValues>>tmpval; MC_p2_MS.push_back(tmpval); } } InValues.close(); InValues.clear(); /* filling correlation vectors*/ InValues.open(corr_val.c_str()); i=0; if(!InValues.good()){ std::cout<<"SmearingClass ERROR:: File "<>tmpval; CorrMatC0.push_back(tmpval); CorrMatTanC0.push_back(tmpval); InValues>>tmpval; CorrMatC1.push_back(tmpval); CorrMatTanC1.push_back(tmpval); InValues>>tmpval; CorrMatC2.push_back(tmpval); CorrMatTanC2.push_back(tmpval); InValues>>tmpval; CorrMatC3.push_back(tmpval); CorrMatTanC3.push_back(tmpval); InValues>>tmpval; CorrMatC4.push_back(tmpval); CorrMatTanC4.push_back(tmpval); InValues>>tmpval; CorrMatC5.push_back(tmpval); CorrMatTanC5.push_back(tmpval); } } InValues.close(); InValues.clear(); } void SmearingClass::PrintValues(){ std::cout<<"SmearingClass INFO:: Checking if all variables are filled ... "<=_max ) { return scaleBins.size() - 1; } std::vector::iterator lb = std::lower_bound(scaleBins.begin(),scaleBins.end(),eta+1e-9); // [first,last) return( std::min( static_cast( std::distance(scaleBins.begin(),lb) ) , static_cast(scaleBins.size()-1) ) ); } void SmearingClass::FillScales(std::string ScaleType, bool ApplyScalesToData){ /*Checking momentum scaling type*/ if(ScaleType=="" || ScaleType=="default" || ScaleType=="kpkm" || ScaleType=="KC" || ScaleType=="K" || ScaleType=="C"){ std::cout<<"SmearingClass INFO:: using " << ScaleType << " Scaling "<> tmpname; // skip lower bound of first bin (since it won't be used) copy(std::istream_iterator(iss), std::istream_iterator(), back_inserter(scaleBins)); std::cout << "Loading muon momentum scales in " << scaleBins.size() << " bins" << std::endl; std::string curname = "cmb"; double v1,v2,v3,w1,w2,w3; int ibin=0; while( getline(InValues,tmpname) ) { if(tmpname=="cmb" || tmpname=="exms" || tmpname=="id") { curname=tmpname; continue; } std::istringstream iss(tmpname); iss >> v1 >> v2 >> v3 >> w1 >> w2 >> w3; const double ss = restrictCurvCorrSigma; if(curname=="cmb") { S1_CB.push_back(v1); S1Corr_CB.push_back(v2); S1ACorr_CB.push_back(v3); // special handling is user requested to restrict curvature // corrections to bins where they are significant if(Tscale>=SCALE_KC && ss>0) { S2_CB.push_back(fabs(w1)>=w2*ss ? w1 : 0.0); } else S2_CB.push_back(w1); S2Corr_CB.push_back(w2); S2ACorr_CB.push_back(w3); } if(curname=="id") { S1_ID.push_back(v1); S1Corr_ID.push_back(v2); S1ACorr_ID.push_back(v3); // special handling is user requested to restrict curvature // corrections to bins where they are significant if(Tscale>=SCALE_KC && ss>0) { S2_ID.push_back(fabs(w1)>=w2*ss ? w1 : 0.0); } else S2_ID.push_back(w1); S2Corr_ID.push_back(w2); S2ACorr_ID.push_back(w3); } if(curname=="exms") { S1_MS.push_back(v1); S1Corr_MS.push_back(v2); S1ACorr_MS.push_back(v3); // special handling is user requested to restrict curvature // corrections to bins where they are significant if(Tscale>=SCALE_KC && ss>0) { S2_MS.push_back(fabs(w1)>=w2*ss ? w1 : 0.0); } else S2_MS.push_back(w1); S2Corr_MS.push_back(w2); S2ACorr_MS.push_back(w3); } ibin++; } assert(S1_MS.size() == S1_ID.size()); assert(S1_MS.size() == S1_CB.size()); assert(S1_MS.size() == scaleBins.size()); InValues.close(); InValues.clear(); } void SmearingClass::SetSeed(int seed) { gRand->SetSeed(seed); } void SmearingClass::SetSeed(int evtnum, int muon_index, int offset) { gRand->SetSeed(offset + evtnum + muon_index*100); } void SmearingClass::UseTan2(bool U) { /* use pT/tan(theta)^2 parameterization for CSC region */ useTan2=U; } void SmearingClass::UseGeV() { /* if input momenta are in GeV */ GeV=1; } void SmearingClass::UseScale(bool applyScale) { /* also use momentum scale, set as default */ useScale=applyScale; } void SmearingClass::RestrictCurvatureCorrections(double nsigma) { /* if "KC" or "C" scale corrections are used, the curvature shift correction is applied only in bins where the correction has a >2.5 sigma effect */ assert(scaleBins.empty() && "ERROR: RestrictCurvatureCorrections() must be called BEFORE FillScales()"); restrictCurvCorrSigma=nsigma; } void SmearingClass::UseImprovedCombine() { /* also use improved combine */ useImprovedCombine=true; } void SmearingClass::ApplyToData(bool U) { /* use pT/tan(theta)^2 parameterization for CSC region */ apply_to_data=U; } void SmearingClass::Event(double Pt, double Eta, std::string DetType, double Charge) { /* MS or ID smearing only. DetType="MS","ID"*/ ptms=0; ptid=0; ptcb=0; if (DetType=="MS") { ptms = Pt; } else if (DetType=="ID") { ptid = Pt; } else std::cout<<"SmearingClass ERROR: wrong DetType in input "<Gaus(0,1); g2 = gRand->Gaus(0,1); g3 = gRand->Gaus(0,1); g4 = gRand->Gaus(0,1); /** Definition: pT'=pT(1+smear) **/ smearMS=Smearing("MS"); smearID=Smearing("ID"); if (detType=="All") { smearCB=ICombine(smearMS,smearID); } ErrorMatrix(); } double SmearingClass::Smearing(std::string DetType) { if (detRegion<0 || detRegion>3) { return 0; } if (DetType=="MS"){ return (p1_MS[detRegion]*g1+p2_MS[detRegion]*g2*ptms/GeV); } else if(DetType=="ID"){ if (useTan2&&detRegion==3){ return (p1_ID[detRegion]*g3+p2_ID_TAN[detRegion]*g4*ptid/GeV*sinh(eta)*sinh(eta)); } else{ return (p1_ID[detRegion]*g3+p2_ID[detRegion]*g4*ptid/GeV); } } else{ std::cout<<"SmearingClass ERROR:: DetType not defined "<3) {return 0; } if (ptcb==0) { std::cout<<"SmearingClass WARNING:: ptcb==0"<3) {return 0; } if (ptcb==0) { std::cout<<"SmearingClass WARNING:: ptcb==0"<fabs(ptcb-ptid)) { R=(ptid-ptcb)/(ptcb-ptms);//R~wMS/wID double rplus=1+R; if (rplus!=0) SmearCB=(SmearID+R*SmearMS)/rplus; else SmearCB=Combine(SmearMS,SmearID); } else if (fabs(ptcb-ptid)!=0&&fabs(ptcb-ptms)3) return; if (!useTan2||detRegion!=3) { double s1=pow(E_p1_MS[detRegion]*E_p1_MS[detRegion]+S_p1_MS[detRegion]*S_p1_MS[detRegion],0.5); double s2=pow(E_p2_MS[detRegion]*E_p2_MS[detRegion]+S_p2_MS[detRegion]*S_p2_MS[detRegion],0.5); double s3=pow(E_p1_ID[detRegion]*E_p1_ID[detRegion]+S_p1_ID[detRegion]*S_p1_ID[detRegion],0.5); double s4=pow(E_p2_ID[detRegion]*E_p2_ID[detRegion]+S_p2_ID[detRegion]*S_p2_ID[detRegion],0.5); vms=g1*g1*s1*s1+ g2*g2*s2*s2*ptms/GeV*ptms/GeV+ 2.0*g1*g2*ptms/GeV*s1*s2*CorrMatC0[detRegion]; vms=pow(fabs(vms),0.5); vid=g3*g3*s3*s3+g4*g4*s4*s4*ptid/GeV*ptid/GeV+2.0*g3*g4*s3*s4*ptid/GeV*CorrMatC5[detRegion]; vid=pow(fabs(vid),0.5); if (vms*vid!=0) { corr=(g1*s1*(g3*s3*CorrMatC1[detRegion]+g4*s4*ptid/GeV*CorrMatC2[detRegion])+ g2*s2*ptms/GeV*(g3*s3*CorrMatC3[detRegion]+g4*s4*ptid/GeV*CorrMatC4[detRegion]))/vms/vid; } } else { double s1=pow(E_p1_MS[detRegion]*E_p1_MS[detRegion]+S_p1_MS[detRegion]*S_p1_MS[detRegion],0.5); double s2=pow(E_p2_MS[detRegion]*E_p2_MS[detRegion]+S_p2_MS[detRegion]*S_p2_MS[detRegion],0.5); double s3=pow(E_p1_ID[detRegion]*E_p1_ID[detRegion]+S_p1_ID[detRegion]*S_p1_ID[detRegion],0.5); double s4=pow(E_p2_ID_TAN[detRegion]*E_p2_ID_TAN[detRegion]+S_p2_ID_TAN[detRegion]*S_p2_ID_TAN[detRegion],0.5); vms=g1*g1*s1*s1+ g2*g2*s2*s2*ptms/GeV*ptms/GeV+ 2.0*g1*g2*ptms/GeV*s1*s2*CorrMatTanC0[detRegion]; vms=pow(fabs(vms),0.5); vid=g3*g3*s3*s3+g4*g4*s4*s4*ptid/GeV*ptid/GeV*sinh(eta)*sinh(eta)*sinh(eta)*sinh(eta) +2.0*g3*g4*s3*s4*ptid/GeV*sinh(eta)*sinh(eta)*CorrMatTanC5[detRegion]; vid=pow(fabs(vid),0.5); if (vms*vid!=0) { corr=(g1*s1*(g3*s3*CorrMatTanC1[detRegion]+g4*s4*ptid/GeV*sinh(eta)*sinh(eta)*CorrMatTanC2[detRegion])+ g2*s2*ptms/GeV*(g3*s3*CorrMatTanC3[detRegion]+g4*s4*ptid/GeV*sinh(eta)*sinh(eta)*CorrMatTanC4[detRegion]))/vms/vid; } } } double SmearingClass::pTMS() { /* smeared muon spectrometer pT */ return pTMS(smearMS); } double SmearingClass::pTMS(double SmearMS) { /* smeared muon spectrometer pT */ if(Tsmear==SMEAR_PT){ return ScaleMS(ptms*(1+SmearMS)); } else if(Tsmear==SMEAR_QPT){ double tmp=1-SmearMS; if(tmp!=0) return ScaleMS(fabs(ptms/tmp)); else return pTmax; } return ptms; } double SmearingClass::pTID() { /* smeared inner detector pT */ return pTID(smearID); } double SmearingClass::pTID(double SmearID) { /* smeared inner detector pT */ if(Tsmear==SMEAR_PT){ return ScaleID(ptid*(1+SmearID)); } else if(Tsmear==SMEAR_QPT){ double tmp=1-SmearID; if(tmp!=0) return ScaleID(fabs(ptid/tmp)); else return pTmax; } return ptid; } double SmearingClass::pTCB() { /* smeared combined pT*/ return pTCB(smearCB); } double SmearingClass::pTCB(double SmearCB) { /* smeared combined pT*/ if(Tsmear==SMEAR_PT){ return ScaleCB(ptcb*(1+SmearCB)); } else if(Tsmear==SMEAR_QPT){ double tmp=1-SmearCB; if(tmp!=0) return ScaleCB(fabs(ptcb/tmp)); else return pTmax; } return ScaleCB(ptcb); } double SmearingClass::ScaleApply(double pt, double S1, double S2, double S) const { /* general-purpose function to apply scale/curvature corrections */ if(!useScale) return pt; // default momentum scale (using Oliver's original values) if(Tscale==SCALE_DEFAULT) { return apply_to_data ? pt/S : pt*S; } // charge-dependent scales: kp,km == pt(data)/pt(mc) if(Tscale==SCALE_KPKM) { if(charge==0) { std::cout << "ERROR: must provide muon charge via Event() to use advanced pT scaling" << std::endl; return pt; } const double kpkm = (charge>0 ? S1 : S2)/100.0; return apply_to_data ? pt/kpkm : pt*kpkm; } // overall scale: K == pt(data)/pt(mc) and curvature split: 2*C == 1/pt+ - 1/pt- // both corrections can be applied one after another or one at a time if(Tscale>=SCALE_KC) { if(charge==0) { std::cout << "ERROR: must provide muon charge via Event() to use advanced pT scaling" << std::endl; return pt; } const double K = S1/100.0; const double C = S2/GeV/1e6; // scale pt (unless only curvature splitting is requested) const double ptsc = (Tscale==SCALE_C) ? pt : (apply_to_data ? pt/K : pt*K); // calculate curvature and apply a correction, if needed: double curv=1/ptsc; if(Tscale!=SCALE_K) { // if correcting a curvature offset in data: if(apply_to_data) curv += charge<0 ? C : -C; // if putting a curvature offset into MC to better match the data else curv += charge<0 ? -C : +C; } return curv==0 ? pTmax : fabs(1.0/curv); } return pt; } double SmearingClass::ChargeFlip(double Smear){ if(Tsmear==SMEAR_PT){ return 1; } else if (Tsmear==SMEAR_QPT){ return Sign(1-Smear); } return 1; } double SmearingClass::ChargeFlipMS(){ return ChargeFlip(smearMS); } double SmearingClass::ChargeFlipID(){ return ChargeFlip(smearID); } double SmearingClass::ChargeFlipCB(){ return ChargeFlip(smearCB); } double SmearingClass::SMS() { return smearMS; } double SmearingClass::SID() { return smearID; } double SmearingClass::SCB() { return smearCB; } double SmearingClass::VMS() { /* error smearMS */ return vms; } double SmearingClass::VID() { /* error smearID */ return vid; } double SmearingClass::Corr() { /* correlation between smearMS and smearID */ return corr; } void SmearingClass::MSUP(double &PtMS) { double SmearMS=smearMS+Sign(smearMS)*vms; PtMS=pTMS(SmearMS); } void SmearingClass::MSUP(double &PtMS, double &PtID, double &PtCB) { double SmearMS=smearMS+Sign(smearMS)*vms; double SmearID=smearID+Sign(smearMS)*vid*corr; PtMS=pTMS(SmearMS); PtID=pTID(SmearID); if (detType=="All") { double SmearCB=ICombine(SmearMS,SmearID); PtCB=pTCB(SmearCB); } } void SmearingClass::MSLOW(double &PtMS) { double SmearMS=smearMS-Sign(smearMS)*vms; PtMS=pTMS(SmearMS); } void SmearingClass::MSLOW(double &PtMS, double &PtID, double &PtCB) { double SmearMS=smearMS-Sign(smearMS)*vms; double SmearID=smearID-Sign(smearMS)*vid*corr; PtMS=pTMS(SmearMS); PtID=pTID(SmearID); if (detType=="All") { double SmearCB=ICombine(SmearMS,SmearID); PtCB=pTCB(SmearCB); } } void SmearingClass::IDUP(double &PtID) { double SmearID=smearID+Sign(smearID)*vid; PtID=pTID(SmearID); } void SmearingClass::IDUP(double &PtMS, double &PtID, double &PtCB) { double SmearMS=smearMS+Sign(smearID)*vms*corr; double SmearID=smearID+Sign(smearID)*vid; PtMS=pTMS(SmearMS); PtID=pTID(SmearID); if (detType=="All") { double SmearCB=ICombine(SmearMS,SmearID); PtCB=pTCB(SmearCB); } } void SmearingClass::IDLOW(double &PtID) { double SmearID=smearID-Sign(smearID)*vid; PtID=pTID(SmearID); } void SmearingClass::IDLOW(double &PtMS, double &PtID, double &PtCB) { double SmearMS=smearMS-Sign(smearID)*vms*corr; double SmearID=smearID-Sign(smearID)*vid; PtMS=pTMS(SmearMS); PtID=pTID(SmearID); if (detType=="All") { double SmearCB=ICombine(SmearMS,SmearID); PtCB=pTCB(SmearCB); } } void SmearingClass::PTVar(double &Pt, std::string fun) { if (fun=="IDUP") { IDUP(Pt); } else if (fun=="IDLOW") { IDLOW(Pt); } else if (fun=="MSUP") { MSUP(Pt); } else if (fun=="MSLOW") { MSLOW(Pt); } } void SmearingClass::PTVar(double &PtMS, double &PtID, double &PtCB, std::string fun) { if (fun=="IDUP") { IDUP(PtMS,PtID,PtCB); return; } else if (fun=="IDLOW") { IDLOW(PtMS,PtID,PtCB); return; } else if (fun=="MSUP") { MSUP(PtMS,PtID,PtCB); return; } else if (fun=="MSLOW") { MSLOW(PtMS,PtID,PtCB); return; } else if (fun=="SCALEKUP" || fun=="SCALEKDOWN") { const double s = (fun=="SCALEKUP") ? 1.0 : -1.0; if(Tscale==SCALE_KC || Tscale==SCALE_K) { // here, we scale up or down the overall pT scale PtMS = ScaleApply(pTMS(),S1_MS[scaleRegion] + s*S1Corr_MS[scaleRegion],S2_MS[scaleRegion]); PtID = ScaleApply(pTID(),S1_ID[scaleRegion] + s*S1Corr_ID[scaleRegion],S2_ID[scaleRegion]); PtCB = ScaleApply(pTCB(),S1_CB[scaleRegion] + s*S1Corr_CB[scaleRegion],S2_CB[scaleRegion]); return; } else if(Tscale==SCALE_KPKM) { // here, we scale up or down the component of kp/km error from Z mass fit PtMS = ScaleApply(pTMS(),S1_MS[scaleRegion] + s*S1Corr_MS[scaleRegion],S2_MS[scaleRegion] - s*S2Corr_MS[scaleRegion]); PtID = ScaleApply(pTID(),S1_ID[scaleRegion] + s*S1Corr_ID[scaleRegion],S2_ID[scaleRegion] - s*S2Corr_ID[scaleRegion]); PtCB = ScaleApply(pTCB(),S1_CB[scaleRegion] + s*S1Corr_CB[scaleRegion],S2_CB[scaleRegion] - s*S2Corr_CB[scaleRegion]); return; } else if(Tscale==SCALE_DEFAULT) { const double SCB = (detRegion<0 || detRegion>3) ? 1.0 : scale_CB[detRegion] + s*scaleSyst_CB[detRegion]; PtCB = ScaleApply(pTCB(),0,0,SCB); return; } // do nothing if SCALEKUP and SCALEKDOWN don't apply return; } else if (fun=="SCALECUP" || fun=="SCALECDOWN") { const double s = (fun=="SCALECUP") ? 1.0 : -1.0; if(Tscale==SCALE_KC || Tscale==SCALE_K) { // here, we scale up or down the curvature offset PtMS = ScaleApply(pTMS(),S1_MS[scaleRegion],S2_MS[scaleRegion] + s*S2Corr_MS[scaleRegion]); PtID = ScaleApply(pTID(),S1_ID[scaleRegion],S2_ID[scaleRegion] + s*S2Corr_ID[scaleRegion]); PtCB = ScaleApply(pTCB(),S1_CB[scaleRegion],S2_CB[scaleRegion] + s*S2Corr_CB[scaleRegion]); return; } else if(Tscale==SCALE_KPKM) { // here, we scale up or down the component of kp/km error from R0 fit PtMS = ScaleApply(pTMS(),S1_MS[scaleRegion] + s*S1ACorr_MS[scaleRegion],S2_MS[scaleRegion] + s*S2ACorr_MS[scaleRegion]); PtID = ScaleApply(pTID(),S1_ID[scaleRegion] + s*S1ACorr_ID[scaleRegion],S2_ID[scaleRegion] + s*S2ACorr_ID[scaleRegion]); PtCB = ScaleApply(pTCB(),S1_CB[scaleRegion] + s*S1ACorr_CB[scaleRegion],S2_CB[scaleRegion] + s*S2ACorr_CB[scaleRegion]); return; } // do nothing if SCALECUP and SCALECDOWN don't apply return; } } double SmearingClass::Sign(double x){ return (x<0? -1 : 1); } double SmearingClass::ptms_orig() { return ptms; } double SmearingClass::ptid_orig() { return ptid; } double SmearingClass::ptcb_orig() { return ptcb; } double SmearingClass::ETA() { return eta; } int SmearingClass::DetRegion() { return detRegion; } std::vector SmearingClass::getScale_CB() { return scale_CB; } std::vector SmearingClass::getScaleSyst_CB(){ return scaleSyst_CB; } std::vector SmearingClass::getp1_ID(){ return p1_ID; } std::vector SmearingClass::getp2_ID(){ return p2_ID; } std::vector SmearingClass::getp2_ID_TAN(){ return p2_ID_TAN; } std::vector SmearingClass::getp1_MS(){ return p1_MS; } std::vector SmearingClass::getp2_MS(){ return p2_MS; } std::vector SmearingClass::getE_p1_ID(){ return E_p1_ID; } std::vector SmearingClass::getE_p2_ID(){ return E_p2_ID; } std::vector SmearingClass::getE_p2_ID_TAN(){ return E_p2_ID_TAN; } std::vector SmearingClass::getE_p1_MS(){ return E_p1_MS; } std::vector SmearingClass::getE_p2_MS(){ return E_p2_MS; } std::vector SmearingClass::getS_p1_ID(){ return S_p1_ID; } std::vector SmearingClass::getS_p2_ID(){ return S_p2_ID; } std::vector SmearingClass::getS_p2_ID_TAN(){ return S_p2_ID_TAN; } std::vector SmearingClass::getS_p1_MS(){ return S_p1_MS; } std::vector SmearingClass::getS_p2_MS(){ return S_p2_MS; } std::vector SmearingClass::getMC_p1_ID(){ return MC_p1_ID; } std::vector SmearingClass::getMC_p2_ID(){ return MC_p2_ID; } std::vector SmearingClass::getMC_p2_ID_TAN(){ return MC_p2_ID_TAN; } std::vector SmearingClass::getMC_p0_MS(){ return MC_p0_MS; } std::vector SmearingClass::getMC_p1_MS(){ return MC_p1_MS; } std::vector SmearingClass::getMC_p2_MS(){ return MC_p2_MS; } std::vector SmearingClass::getCorrMatC0(){ return CorrMatC0; } std::vector SmearingClass::getCorrMatC1(){ return CorrMatC1; } std::vector SmearingClass::getCorrMatC2(){ return CorrMatC2; } std::vector SmearingClass::getCorrMatC3(){ return CorrMatC3; } std::vector SmearingClass::getCorrMatC4(){ return CorrMatC4; } std::vector SmearingClass::getCorrMatC5(){ return CorrMatC5; } std::vector SmearingClass::getCorrMatTanC0(){ return CorrMatTanC0; } std::vector SmearingClass::getCorrMatTanC1(){ return CorrMatTanC1; } std::vector SmearingClass::getCorrMatTanC2(){ return CorrMatTanC2; } std::vector SmearingClass::getCorrMatTanC3(){ return CorrMatTanC3; } std::vector SmearingClass::getCorrMatTanC4(){ return CorrMatTanC4; } std::vector SmearingClass::getCorrMatTanC5(){ return CorrMatTanC5; }