void getKinematics(TLorentzVector& b,double const mass) { float const pt = gRandom->Uniform(momentumRange.first,momentumRange.second); float const eta = gRandom->Uniform(-acceptanceEta,acceptanceEta); float const phi = TMath::TwoPi() * gRandom->Rndm(); b.SetXYZM(pt * cos(phi),pt * sin(phi),pt * sinh(eta), mass); }
TLorentzVector leptonic_fitter_algebraic::lv_with_mass( const TMatrixD& mat, double mass ) { assert( mat.GetNcols() == 1 || mat.GetNrows() == 1 ); TLorentzVector lv; const double *array = mat.GetMatrixArray(); lv.SetXYZM( array[0], array[1], array[2], mass ); return lv; }
TLorentzVector smearMom(TLorentzVector const& b,TF1 const * const fMomResolution) { float const pt = b.Perp(); float const sPt = gRandom->Gaus(pt,pt*fMomResolution->Eval(pt)); TLorentzVector sMom; sMom.SetXYZM(sPt*cos(b.Phi()),sPt*sin(b.Phi()),sPt*sinh(b.PseudoRapidity()),b.M()); return sMom; }
// Reset all private to false/zwwDefault/null vector/etc. void ZWW::reset(){ // For checker isAllOk_ = false; isLepOk_ = false; isJetOk_ = false; isMETOk_ = false; // For setter lepPt_. clear(); lepEta_.clear(); lepPhi_.clear(); lepFl_. clear(); lepCh_. clear(); lepId_. clear(); jetPt_. clear(); jetEta_.clear(); jetPhi_.clear(); jetM_. clear(); jetTag_.clear(); met_ = zwwDefault; metPhi_ = zwwDefault; njet_ = zwwDefault; nbjet_ = zwwDefault; st_ = zwwDefault; minMt_ = zwwDefault; minDeltaPhi_ = zwwDefault; // Buffer lepVec_.clear(); jetVec_.clear(); // TLorentzVector metVec_.SetXYZM(0.,0.,0.,0.); metVec_.SetXYZM(0.,0.,0.,0.); z0LepIdx_[0] = zwwDefault; z0LepIdx_[1] = zwwDefault; z1LepIdx_[0] = zwwDefault; z1LepIdx_[1] = zwwDefault; zaLepIdx_[0] = zwwDefault; zaLepIdx_[1] = zwwDefault; zbLepIdx_[0] = zwwDefault; zbLepIdx_[1] = zwwDefault; flagZ1SF_ = zwwDefault; // All other variables outPreSelection_ = false; }
int main(int argc, char * argv[]) { // first argument - config file // second argument - filelist using namespace std; // **** configuration Config cfg(argv[1]); // vertex cuts const float ndofVertexCut = cfg.get<float>("NdofVertexCut"); const float zVertexCut = cfg.get<float>("ZVertexCut"); const float dVertexCut = cfg.get<float>("DVertexCut"); // electron cuta const float ptElectronLowCut = cfg.get<float>("ptElectronLowCut"); const float ptElectronHighCut = cfg.get<float>("ptElectronHighCut"); const float etaElectronCut = cfg.get<float>("etaElectronCut"); const float dxyElectronCut = cfg.get<float>("dxyElectronCut"); const float dzElectronCut = cfg.get<float>("dzElectronCut"); const float isoElectronLowCut = cfg.get<float>("isoElectronLowCut"); const float isoElectronHighCut = cfg.get<float>("isoElectronHighCut"); const bool applyElectronId = cfg.get<bool>("ApplyElectronId"); // tau cuts const float ptTauLowCut = cfg.get<float>("ptTauLowCut"); const float ptTauHighCut = cfg.get<float>("ptTauHighCut"); const float etaTauCut = cfg.get<float>("etaTauCut"); const bool applyTauId = cfg.get<bool>("ApplyTauId"); // pair selection const float dRleptonsCut = cfg.get<float>("dRleptonsCut"); // additional lepton veto const float ptDiElectronVeto = cfg.get<float>("ptDiElectronVeto"); const float etaDiElectronVeto = cfg.get<float>("etaDiElectronVeto"); // topological cuts const float dZetaCut = cfg.get<float>("dZetaCut"); const bool oppositeSign = cfg.get<bool>("oppositeSign"); const float deltaRTrigMatch = cfg.get<float>("DRTrigMatch"); const bool isIsoR03 = cfg.get<bool>("IsIsoR03"); const float jetEtaCut = cfg.get<float>("JetEtaCut"); const float jetPtLowCut = cfg.get<float>("JetPtLowCut"); const float jetPtHighCut = cfg.get<float>("JetPtHighCut"); const float dRJetLeptonCut = cfg.get<float>("dRJetLeptonCut"); const bool applyJetPfId = cfg.get<bool>("ApplyJetPfId"); const bool applyJetPuId = cfg.get<bool>("ApplyJetPuId"); const float bJetEtaCut = cfg.get<float>("bJetEtaCut"); const float btagCut = cfg.get<float>("btagCut"); // check overlap const bool checkOverlap = cfg.get<bool>("CheckOverlap"); const bool debug = cfg.get<bool>("debug"); // **** end of configuration // file name and tree name TString rootFileName(argv[2]); std::ifstream fileList(argv[2]); std::ifstream fileList0(argv[2]); std::string ntupleName("makeroottree/AC1B"); rootFileName += "_et_Sync.root"; std::cout <<rootFileName <<std::endl; // output fileName with histograms TFile * file = new TFile( rootFileName ,"recreate"); file->cd(""); TH1F * inputEventsH = new TH1F("inputEventsH","",1,-0.5,0.5); TTree * tree = new TTree("TauCheck","TauCheck"); Spring15Tree *otree = new Spring15Tree(tree); int nTotalFiles = 0; std::string dummy; // count number of files ---> while (fileList0 >> dummy) nTotalFiles++; int nEvents = 0; int selEvents = 0; int nFiles = 0; vector<int> runList; runList.clear(); vector<int> eventList; eventList.clear(); int nonOverlap = 0; std::ifstream fileEvents("overlap.txt"); int Run, Event, Lumi; if (checkOverlap) { std::cout << "Non-overlapping events ->" << std::endl; while (fileEvents >> Run >> Event >> Lumi) { runList.push_back(Run); eventList.push_back(Event); std::cout << Run << ":" << Event << std::endl; } std::cout << std::endl; } std::ofstream fileOutput("overlap.out"); for (int iF=0; iF<nTotalFiles; ++iF) { std::string filen; fileList >> filen; std::cout << "file " << iF+1 << " out of " << nTotalFiles << " filename : " << filen << std::endl; TFile * file_ = TFile::Open(TString(filen)); TTree * _tree = NULL; _tree = (TTree*)file_->Get(TString(ntupleName)); if (_tree==NULL) continue; TH1D * histoInputEvents = NULL; histoInputEvents = (TH1D*)file_->Get("makeroottree/nEvents"); if (histoInputEvents==NULL) continue; int NE = int(histoInputEvents->GetEntries()); std::cout << " number of input events = " << NE << std::endl; for (int iE=0;iE<NE;++iE) inputEventsH->Fill(0.); AC1B analysisTree(_tree); Long64_t numberOfEntries = analysisTree.GetEntries(); std::cout << " number of entries in Tree = " << numberOfEntries << std::endl; for (Long64_t iEntry=0; iEntry<numberOfEntries; iEntry++) { analysisTree.GetEntry(iEntry); nEvents++; if (nEvents%10000==0) cout << " processed " << nEvents << " events" << endl; otree->run = int(analysisTree.event_run); otree->lumi = int(analysisTree.event_luminosityblock); otree->evt = int(analysisTree.event_nr); bool overlapEvent = true; for (unsigned int iEvent=0; iEvent<runList.size(); ++iEvent) { if (runList.at(iEvent)==otree->run && eventList.at(iEvent)==otree->evt) { overlapEvent = false; } } if (overlapEvent&&checkOverlap) continue; nonOverlap++; if (debug) { fileOutput << std::endl; fileOutput << "Run = " << otree->run << " Event = " << otree->evt << std::endl; } // weights otree->mcweight = 0; otree->puweight = 0; otree->trigweight_1 = 0; otree->trigweight_2 = 0; otree->idweight_1 = 0; otree->idweight_2 = 0; otree->isoweight_1 = 0; otree->isoweight_2 = 0; otree->effweight = 0; otree->fakeweight = 0; otree->embeddedWeight = 0; otree->signalWeight = 0; otree->weight = 1; otree->npv = analysisTree.primvertex_count; otree->npu = analysisTree.numpileupinteractions; otree->rho = analysisTree.rho; // vertex cuts if (fabs(analysisTree.primvertex_z)>zVertexCut) continue; if (analysisTree.primvertex_ndof<=ndofVertexCut) continue; float dVertex = sqrt(analysisTree.primvertex_x*analysisTree.primvertex_x+ analysisTree.primvertex_y*analysisTree.primvertex_y); if (dVertex>dVertexCut) continue; if (debug) fileOutput << "Vertex cuts are passed " << std::endl; // electron selection vector<int> electrons; electrons.clear(); if (debug) fileOutput << "# electrons = " << analysisTree.electron_count << std::endl; for (unsigned int ie = 0; ie<analysisTree.electron_count; ++ie) { bool electronMvaId = electronMvaIdTight(analysisTree.electron_superclusterEta[ie], analysisTree.electron_mva_id_nontrigPhys14[ie]); if (checkOverlap) fileOutput << " " << ie << " pt = " << analysisTree.electron_pt[ie] << " eta = " << analysisTree.electron_eta[ie] << " dxy = " << analysisTree.electron_dxy[ie] << " dz = " << analysisTree.electron_dz[ie] << " passConv = " << analysisTree.electron_pass_conversion[ie] << " nmisshits = " << int(analysisTree.electron_nmissinginnerhits[ie]) << " mvaTight = " << electronMvaId << std::endl; if (analysisTree.electron_pt[ie]<ptElectronLowCut) continue; if (fabs(analysisTree.electron_eta[ie])>etaElectronCut) continue; if (fabs(analysisTree.electron_dxy[ie])>dxyElectronCut) continue; if (fabs(analysisTree.electron_dz[ie])>dzElectronCut) continue; if (!electronMvaId&&applyElectronId) continue; if (!analysisTree.electron_pass_conversion[ie]&&applyElectronId) continue; if (analysisTree.electron_nmissinginnerhits[ie]!=0&&applyElectronId) continue; electrons.push_back(ie); } // tau selection if (debug) fileOutput << "# taus = " << analysisTree.tau_count << std::endl; vector<int> taus; taus.clear(); for (unsigned int it = 0; it<analysisTree.tau_count; ++it) { if (debug) fileOutput << " " << it << " pt = " << analysisTree.tau_pt[it] << " eta = " << analysisTree.tau_eta[it] << " decayModeFinding = " << analysisTree.tau_decayModeFinding[it] << " decayModeFindingNewDMs = " << analysisTree.tau_decayModeFindingNewDMs[it] << " tau_vertexz = " << analysisTree.tau_vertexz[it] <<std::endl; if (analysisTree.tau_pt[it]<ptTauLowCut) continue; if (fabs(analysisTree.tau_eta[it])>etaTauCut) continue; if (applyTauId && analysisTree.tau_decayModeFinding[it] < 0.5 && analysisTree.tau_decayModeFindingNewDMs[it] < 0.5) continue; float ctgTheta = analysisTree.tau_pz[it] / sqrt(analysisTree.tau_px[it]*analysisTree.tau_px[it] + analysisTree.tau_py[it]*analysisTree.tau_py[it]); float zImpact = analysisTree.tau_vertexz[it] + 130. * ctgTheta; if ( zImpact > -1.5 && zImpact < 0.5) continue; if (analysisTree.tau_vertexz[it]!=analysisTree.primvertex_z) continue; taus.push_back(it); } if (debug) { fileOutput << " # selected electron = " << electrons.size() << std::endl; fileOutput << " # selected taus = " << taus.size() << std::endl; } if (electrons.size()==0) continue; if (taus.size()==0) continue; // selecting muon and tau pair (OS or SS); int electronIndex = -1; int tauIndex = -1; float isoEleMin = 1e+10; float isoTauMin = 1e+10; for (unsigned int ie=0; ie<electrons.size(); ++ie) { bool isTrigEle22 = false; bool isTrigEle32 = false; unsigned int eIndex = electrons.at(ie); float neutralHadIsoEle = analysisTree.electron_neutralHadIso[ie]; float photonIsoEle = analysisTree.electron_photonIso[ie]; float chargedHadIsoEle = analysisTree.electron_chargedHadIso[ie]; float puIsoEle = analysisTree.electron_puIso[ie]; if (isIsoR03) { neutralHadIsoEle = analysisTree.electron_r03_sumNeutralHadronEt[ie]; photonIsoEle = analysisTree.electron_r03_sumPhotonEt[ie]; chargedHadIsoEle = analysisTree.electron_r03_sumChargedHadronPt[ie]; puIsoEle = analysisTree.electron_r03_sumPUPt[ie]; } float neutralIsoEle = neutralHadIsoEle + photonIsoEle - 0.5*puIsoEle; neutralIsoEle = TMath::Max(float(0),neutralIsoEle); float absIsoEle = chargedHadIsoEle + neutralIsoEle; float relIsoEle = absIsoEle/analysisTree.electron_pt[ie]; if (debug) fileOutput << "Electron " << eIndex << " -> relIso = "<<relIsoEle<<" absIso = "<<absIsoEle<<std::endl; for (unsigned int iT=0; iT<analysisTree.trigobject_count; ++iT) { /*if (analysisTree.trigobject_isElectron[iT] || !analysisTree.trigobject_isMuon[iT] || analysisTree.trigobject_isTau[iT]) continue;*/ float dRtrig = deltaR(analysisTree.electron_eta[eIndex],analysisTree.electron_phi[eIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig < deltaRTrigMatch){ if (analysisTree.trigobject_filters[iT][7] && analysisTree.trigobject_filters[iT][8]) // Ele22 Leg isTrigEle22 = true; if (analysisTree.trigobject_filters[iT][10]) // Ele32 Leg isTrigEle32 = true; } } if (debug) fileOutput << "Electron " << eIndex << " -> isTrigEle22 = " << isTrigEle22 << " ; isTrigEle32 = " << isTrigEle32 << std::endl; if ((!isTrigEle22) && (!isTrigEle32)) continue; for (unsigned int it=0; it<taus.size(); ++it) { unsigned int tIndex = taus.at(it); float absIsoTau = analysisTree.tau_byCombinedIsolationDeltaBetaCorrRaw3Hits[tIndex]; float relIsoTau = absIsoTau / analysisTree.tau_pt[tIndex]; if (debug) fileOutput << "tau" << tIndex << " -> relIso = "<<relIsoTau<<" absIso = "<<absIsoTau<<std::endl; float dR = deltaR(analysisTree.tau_eta[tIndex],analysisTree.tau_phi[tIndex], analysisTree.electron_eta[eIndex],analysisTree.electron_phi[eIndex]); if (debug) fileOutput << "dR(ele,tau) = " << dR << std::endl; if (dR<dRleptonsCut) continue; bool isTrigTau = false; float dRtrig_min = 9999.; for (unsigned int iT=0; iT<analysisTree.trigobject_count; ++iT) { if (debug){ if (analysisTree.trigobject_isElectron[iT] && analysisTree.trigobject_isMuon[iT]) fileOutput<<" trigObj "<<iT<<" both e and mu"<<std::endl; if (analysisTree.trigobject_isMuon[iT] && analysisTree.trigobject_isTau[iT]) fileOutput<<" trigObj "<<iT<<" both mu and tau"<<std::endl; if (analysisTree.trigobject_isElectron[iT] && analysisTree.trigobject_isTau[iT]) fileOutput<<" trigObj "<<iT<<" both e and tau"<<std::endl; } if (analysisTree.trigobject_isElectron[iT] || analysisTree.trigobject_isMuon[iT] || !analysisTree.trigobject_isTau[iT]) continue; float dRtrig = deltaR(analysisTree.tau_eta[tIndex],analysisTree.tau_phi[tIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig < deltaRTrigMatch){ if (analysisTree.trigobject_filters[iT][7] && analysisTree.trigobject_filters[iT][8]){ isTrigTau = true; if (dRtrig < dRtrig_min) dRtrig_min = dRtrig; } } } if (debug) fileOutput << "Tau " << it << " -> isTrigTau = " << isTrigTau << " DR="<<dRtrig_min<<std::endl; bool trigMatch = isTrigEle32 || (isTrigEle22 && isTrigTau); if (isTrigEle32 && analysisTree.hltriggerresults_second[4]==false) if (debug) std::cout<<"IsoEle32 Trigger Mismatch"<<std::endl; if (isTrigEle22 && isTrigTau && analysisTree.hltriggerresults_second[1]==false) if (debug) std::cout<<"xEleTau Trigger Mismatch"<<std::endl; if (!trigMatch) continue; bool isKinematicMatch = false; if (isTrigEle32) { if (analysisTree.electron_pt[eIndex]>ptElectronHighCut) isKinematicMatch = true; } if (isTrigEle22 && isTrigTau) { if (analysisTree.electron_pt[eIndex]>ptElectronLowCut && analysisTree.tau_pt[tIndex]>ptTauHighCut) isKinematicMatch = true; } if (!isKinematicMatch) continue; bool changePair = false; if (relIsoEle<isoEleMin) { changePair = true; } else if (fabs(relIsoEle - isoEleMin) < 1.e-5) { if (analysisTree.electron_pt[eIndex] > analysisTree.electron_pt[electronIndex]) { changePair = true; } else if (fabs(analysisTree.electron_pt[eIndex] - analysisTree.electron_pt[electronIndex]) < 1.e-5) { if (absIsoTau < isoTauMin) { changePair = true; } else if ((absIsoTau - isoTauMin) < 1.e-5){ if (analysisTree.tau_pt[tIndex] > analysisTree.tau_pt[tauIndex]) { changePair = true; } } } } if (changePair){ isoEleMin = relIsoEle; electronIndex = eIndex; isoTauMin = absIsoTau; tauIndex = tIndex; } } } if (electronIndex<0) continue; if (tauIndex<0) continue; // filling electron variables otree->pt_1 = analysisTree.electron_pt[electronIndex]; otree->eta_1 = analysisTree.electron_eta[electronIndex]; otree->phi_1 = analysisTree.electron_phi[electronIndex]; otree->m_1 = electronMass; otree->q_1 = -1; if (analysisTree.electron_charge[electronIndex]>0) otree->q_1 = 1; otree->iso_1 = isoEleMin; otree->mva_1 = analysisTree.electron_mva_id_nontrigPhys14[electronIndex]; otree->d0_1 = analysisTree.electron_dxy[electronIndex]; otree->dZ_1 = analysisTree.electron_dz[electronIndex]; otree->byCombinedIsolationDeltaBetaCorrRaw3Hits_1 = 0; otree->againstElectronLooseMVA5_1 = 0; otree->againstElectronMediumMVA5_1 = 0; otree->againstElectronTightMVA5_1 = 0; otree->againstElectronVLooseMVA5_1 = 0; otree->againstElectronVTightMVA5_1 = 0; otree->againstMuonLoose3_1 = 0; otree->againstMuonTight3_1 = 0; // filling tau variables otree->pt_2 = analysisTree.tau_pt[tauIndex]; otree->eta_2 = analysisTree.tau_eta[tauIndex]; otree->phi_2 = analysisTree.tau_phi[tauIndex]; otree->q_2 = -1; if (analysisTree.tau_charge[tauIndex]>0) otree->q_2 = 1; otree->mva_2 = log(0); otree->d0_2 = analysisTree.tau_dxy[tauIndex]; otree->dZ_2 = analysisTree.tau_dz[tauIndex]; otree->iso_2 = analysisTree.tau_byCombinedIsolationDeltaBetaCorrRaw3Hits[tauIndex]; otree->m_2 = analysisTree.tau_mass[tauIndex]; otree->byCombinedIsolationDeltaBetaCorrRaw3Hits_2 = analysisTree.tau_byCombinedIsolationDeltaBetaCorrRaw3Hits[tauIndex]; otree->againstElectronLooseMVA5_2 = analysisTree.tau_againstElectronLooseMVA5[tauIndex]; otree->againstElectronMediumMVA5_2 = analysisTree.tau_againstElectronMediumMVA5[tauIndex]; otree->againstElectronTightMVA5_2 = analysisTree.tau_againstElectronTightMVA5[tauIndex]; otree->againstElectronVLooseMVA5_2 = analysisTree.tau_againstElectronVLooseMVA5[tauIndex]; otree->againstElectronVTightMVA5_2 = analysisTree.tau_againstElectronVTightMVA5[tauIndex]; otree->againstMuonLoose3_2 = analysisTree.tau_againstMuonLoose3[tauIndex]; otree->againstMuonTight3_2 = analysisTree.tau_againstMuonTight3[tauIndex]; // ditau system TLorentzVector electronLV; electronLV.SetXYZM(analysisTree.electron_px[electronIndex], analysisTree.electron_py[electronIndex], analysisTree.electron_pz[electronIndex], electronMass); TLorentzVector tauLV; tauLV.SetXYZM(analysisTree.tau_px[tauIndex], analysisTree.tau_py[tauIndex], analysisTree.tau_pz[tauIndex], tauMass); TLorentzVector dileptonLV = electronLV + tauLV; otree->m_vis = dileptonLV.M(); otree->pt_tt = dileptonLV.Pt(); // opposite charge otree->os = (otree->q_1 * otree->q_2) < 0.; // dimuon veto otree->dilepton_veto = 0; for (unsigned int ie = 0; ie<analysisTree.electron_count; ++ie) { if (analysisTree.electron_pt[ie]<ptDiElectronVeto) continue; if (fabs(analysisTree.electron_eta[ie])>etaDiElectronVeto) continue; if (fabs(analysisTree.electron_dxy[ie])>dxyElectronCut) continue; if (fabs(analysisTree.electron_dz[ie])>dzElectronCut) continue; if (otree->q_1 * analysisTree.electron_charge[ie] > 0.) continue; float neutralHadIsoEle = analysisTree.electron_neutralHadIso[ie]; float photonIsoEle = analysisTree.electron_photonIso[ie]; float chargedHadIsoEle = analysisTree.electron_chargedHadIso[ie]; float puIsoEle = analysisTree.electron_puIso[ie]; if (isIsoR03) { neutralHadIsoEle = analysisTree.electron_r03_sumNeutralHadronEt[ie]; photonIsoEle = analysisTree.electron_r03_sumPhotonEt[ie]; chargedHadIsoEle = analysisTree.electron_r03_sumChargedHadronPt[ie]; puIsoEle = analysisTree.electron_r03_sumPUPt[ie]; } float neutralIsoEle = neutralHadIsoEle + photonIsoEle - 0.5*puIsoEle; neutralIsoEle = TMath::Max(float(0),neutralIsoEle); float absIsoEle = chargedHadIsoEle + neutralIsoEle; float relIsoEle = absIsoEle/analysisTree.electron_pt[ie]; if(relIsoEle > 0.3) continue; float dr = deltaR(analysisTree.electron_eta[ie],analysisTree.electron_phi[ie], otree->eta_1,otree->phi_1); if(dr<0.15) continue; otree->dilepton_veto = 1; } // extra electron veto otree->extraelec_veto = 0; // extra muon veto otree->extramuon_veto = 0; // svfit variables otree->m_sv = -9999; otree->pt_sv = -9999; otree->eta_sv = -9999; otree->phi_sv = -9999; // pfmet variables otree->met = TMath::Sqrt(analysisTree.pfmet_ex*analysisTree.pfmet_ex + analysisTree.pfmet_ey*analysisTree.pfmet_ey); otree->metphi = TMath::ATan2(analysisTree.pfmet_ey,analysisTree.pfmet_ex); otree->metcov00 = analysisTree.pfmet_sigxx; otree->metcov01 = analysisTree.pfmet_sigxy; otree->metcov10 = analysisTree.pfmet_sigyx; otree->metcov11 = analysisTree.pfmet_sigyy; // bisector of muon and tau transverse momenta float electronUnitX = electronLV.Px()/electronLV.Pt(); float electronUnitY = electronLV.Py()/electronLV.Pt(); float tauUnitX = tauLV.Px()/tauLV.Pt(); float tauUnitY = tauLV.Py()/tauLV.Pt(); float zetaX = electronUnitX + tauUnitX; float zetaY = electronUnitY + tauUnitY; float normZeta = TMath::Sqrt(zetaX*zetaX+zetaY*zetaY); zetaX = zetaX/normZeta; zetaY = zetaY/normZeta; float vectorVisX = electronLV.Px() + tauLV.Px(); float vectorVisY = electronLV.Py() + tauLV.Py(); otree->pzetavis = vectorVisX*zetaX + vectorVisY*zetaY; // choosing mva met unsigned int iMet = 0; for (; iMet<analysisTree.mvamet_count; ++iMet) { if ((int)analysisTree.mvamet_channel[iMet]==2) break; } if (iMet>=analysisTree.mvamet_count){ if(debug) fileOutput<<"MVA MET channel ploblems.."<<std::endl; otree->mvamet = log(0); otree->mvametphi = log(0); otree->mvacov00 = log(0); otree->mvacov01 = log(0); otree->mvacov10 = log(0); otree->mvacov11 = log(0); otree->mt_1 = log(0); otree->mt_2 = log(0); otree->pzetamiss = log(0); } else { float mvamet_x = analysisTree.mvamet_ex[iMet]; float mvamet_y = analysisTree.mvamet_ey[iMet]; float mvamet_x2 = mvamet_x * mvamet_x; float mvamet_y2 = mvamet_y * mvamet_y; otree->mvamet = TMath::Sqrt(mvamet_x2+mvamet_y2); otree->mvametphi = TMath::ATan2(mvamet_y,mvamet_x); otree->mvacov00 = analysisTree.mvamet_sigxx[iMet]; otree->mvacov01 = analysisTree.mvamet_sigxy[iMet]; otree->mvacov10 = analysisTree.mvamet_sigyx[iMet]; otree->mvacov11 = analysisTree.mvamet_sigyy[iMet]; // computation of mt otree->mt_1 = sqrt(2*otree->pt_1*otree->mvamet*(1.-cos(otree->phi_1-otree->mvametphi))); otree->mt_2 = sqrt(2*otree->pt_2*otree->mvamet*(1.-cos(otree->phi_2-otree->mvametphi))); // computation of DZeta variable otree->pzetamiss = analysisTree.pfmet_ex*zetaX + analysisTree.pfmet_ey*zetaY; } // counting jets vector<unsigned int> jets; jets.clear(); vector<unsigned int> jetspt20; jetspt20.clear(); vector<unsigned int> bjets; bjets.clear(); int indexLeadingJet = -1; float ptLeadingJet = -1; int indexSubLeadingJet = -1; float ptSubLeadingJet = -1; int indexLeadingBJet = -1; float ptLeadingBJet = -1; for (unsigned int jet=0; jet<analysisTree.pfjet_count; ++jet) { float absJetEta = fabs(analysisTree.pfjet_eta[jet]); if (absJetEta>jetEtaCut) continue; float jetPt = analysisTree.pfjet_pt[jet]; if (jetPt<jetPtLowCut) continue; float dR1 = deltaR(analysisTree.pfjet_eta[jet],analysisTree.pfjet_phi[jet], otree->eta_1,otree->phi_1); float dR2 = deltaR(analysisTree.pfjet_eta[jet],analysisTree.pfjet_phi[jet], otree->eta_2,otree->phi_2); // pf jet Id float energy = analysisTree.pfjet_e[jet]; float chf = analysisTree.pfjet_chargedhadronicenergy[jet]/energy; float nhf = analysisTree.pfjet_neutralhadronicenergy[jet]/energy; float phf = analysisTree.pfjet_neutralemenergy[jet]/energy; float elf = analysisTree.pfjet_chargedemenergy[jet]/energy; float chm = analysisTree.pfjet_chargedmulti[jet]; float npr = analysisTree.pfjet_chargedmulti[jet] + analysisTree.pfjet_neutralmulti[jet]; bool isPFJetId = (npr>1 && phf<0.99 && nhf<0.99) && (absJetEta>2.4 || (elf<0.99 && chf>0 && chm>0)); // muon fraction missing if(debug) fileOutput<<" jet "<<jet<<": pt="<<analysisTree.pfjet_pt[jet]<<" eta="<<analysisTree.pfjet_eta[jet] <<" dr1="<<dR1<<" dr2="<<dR2<<" npr="<<npr<<" phf="<<phf<<" nhf="<<nhf<<std::endl; // apply dR cut if (dR1<dRJetLeptonCut) continue; if (dR2<dRJetLeptonCut) continue; // apply pf jet Id if (applyJetPfId&&!isPFJetId) continue; // pu jet Id if (applyJetPuId&&!puJetIdLoose(analysisTree.pfjet_eta[jet],analysisTree.pfjet_pu_jet_full_mva[jet])) continue; jetspt20.push_back(jet); if (absJetEta<bJetEtaCut && analysisTree.pfjet_btag[jet][6]>btagCut) { // b-jet bjets.push_back(jet); if (jetPt>ptLeadingBJet) { ptLeadingBJet = jetPt; indexLeadingBJet = jet; } } if (jetPt<jetPtHighCut) continue; jets.push_back(jet); if(jetPt>ptLeadingJet){ ptSubLeadingJet = ptLeadingJet; indexSubLeadingJet = indexLeadingJet; ptLeadingJet = jetPt; indexLeadingJet = jet; } else if(jetPt>ptSubLeadingJet){ ptSubLeadingJet = jetPt; indexSubLeadingJet = jet; } } otree->njets = jets.size(); otree->njetspt20 = jetspt20.size(); otree->nbtag = bjets.size(); otree->bpt = -9999; otree->beta = -9999; otree->bphi = -9999; if (indexLeadingBJet>=0) { otree->bpt = analysisTree.pfjet_pt[indexLeadingBJet]; otree->beta = analysisTree.pfjet_eta[indexLeadingBJet]; otree->bphi = analysisTree.pfjet_phi[indexLeadingBJet]; } otree->jpt_1 = -9999; otree->jeta_1 = -9999; otree->jphi_1 = -9999; otree->jptraw_1 = -9999; otree->jptunc_1 = -9999; otree->jmva_1 = -9999; otree->jlrm_1 = -9999; otree->jctm_1 = -9999; if (indexLeadingJet>=0&&indexSubLeadingJet>=0&&indexLeadingJet==indexSubLeadingJet) cout << "warning : indexLeadingJet ==indexSubLeadingJet = " << indexSubLeadingJet << endl; if (indexLeadingJet>=0) { otree->jpt_1 = analysisTree.pfjet_pt[indexLeadingJet]; otree->jeta_1 = analysisTree.pfjet_eta[indexLeadingJet]; otree->jphi_1 = analysisTree.pfjet_phi[indexLeadingJet]; otree->jptraw_1 = analysisTree.pfjet_pt[indexLeadingJet]*analysisTree.pfjet_energycorr[indexLeadingJet]; otree->jmva_1 = analysisTree.pfjet_pu_jet_full_mva[indexLeadingJet]; } otree->jpt_2 = -9999; otree->jeta_2 = -9999; otree->jphi_2 = -9999; otree->jptraw_2 = -9999; otree->jptunc_2 = -9999; otree->jmva_2 = -9999; otree->jlrm_2 = -9999; otree->jctm_2 = -9999; if (indexSubLeadingJet>=0) { otree->jpt_2 = analysisTree.pfjet_pt[indexSubLeadingJet]; otree->jeta_2 = analysisTree.pfjet_eta[indexSubLeadingJet]; otree->jphi_2 = analysisTree.pfjet_phi[indexSubLeadingJet]; otree->jptraw_2 = analysisTree.pfjet_pt[indexSubLeadingJet]*analysisTree.pfjet_energycorr[indexSubLeadingJet]; otree->jmva_2 = analysisTree.pfjet_pu_jet_full_mva[indexSubLeadingJet]; } otree->mjj = -9999; otree->jdeta = -9999; otree->njetingap = 0; if (indexLeadingJet>=0 && indexSubLeadingJet>=0) { TLorentzVector jet1; jet1.SetPxPyPzE(analysisTree.pfjet_px[indexLeadingJet], analysisTree.pfjet_py[indexLeadingJet], analysisTree.pfjet_pz[indexLeadingJet], analysisTree.pfjet_e[indexLeadingJet]); TLorentzVector jet2; jet2.SetPxPyPzE(analysisTree.pfjet_px[indexSubLeadingJet], analysisTree.pfjet_py[indexSubLeadingJet], analysisTree.pfjet_pz[indexSubLeadingJet], analysisTree.pfjet_e[indexSubLeadingJet]); otree->mjj = (jet1+jet2).M(); otree->jdeta = abs(analysisTree.pfjet_eta[indexLeadingJet]- analysisTree.pfjet_eta[indexSubLeadingJet]); float etamax = analysisTree.pfjet_eta[indexLeadingJet]; float etamin = analysisTree.pfjet_eta[indexSubLeadingJet]; if (etamax<etamin) { float tmp = etamax; etamax = etamin; etamin = tmp; } for (unsigned int jet=0; jet<jetspt20.size(); ++jet) { int index = jetspt20.at(jet); float etaX = analysisTree.pfjet_eta[index]; if (index!=indexLeadingJet&&index!=indexSubLeadingJet&&etaX>etamin&&etaX<etamax) otree->njetingap++; } } otree->Fill(); selEvents++; } // end of file processing (loop over events in one file) nFiles++; delete _tree; file_->Close(); delete file_; } std::cout << std::endl; int allEvents = int(inputEventsH->GetEntries()); std::cout << "Total number of input events = " << allEvents << std::endl; std::cout << "Total number of events in Tree = " << nEvents << std::endl; std::cout << "Total number of selected events = " << selEvents << std::endl; std::cout << std::endl; file->cd(""); file->Write(); file->Close(); delete file; }
void polGen(double rapdilepton_min = 1, double rapdilepton_max = 1, double pTdilepton_min = 1, double pTdilepton_max = 1, double mass_signal_peak = 1, double mass_signal_sigma = 1, double n_sigmas_signal = 1, int n_events = 50000, double f_BG = 0.5, double lambda_theta_sig=1, double lambda_phi_sig=1, double lambda_thetaphi_sig=1, double lambda_theta_bkg=1, double lambda_phi_bkg=1, double lambda_thetaphi_bkg=1, int frameSig=1,//CS...1, HX...2, PX...3 int frameBkg=1,//CS...1, HX...2, PX...3 int nGen=1, Char_t *dirstruct = "ToyDirectory_Default" ){ char frameSigName[200]; if(frameSig==1)sprintf(frameSigName,"CS"); if(frameSig==2)sprintf(frameSigName,"HX"); if(frameSig==3)sprintf(frameSigName,"PX"); char frameBkgName[200]; if(frameBkg==1)sprintf(frameBkgName,"CS"); if(frameBkg==2)sprintf(frameBkgName,"HX"); if(frameBkg==3)sprintf(frameBkgName,"PX"); if(frameSig==2) HX_is_natural_sig=true; if(frameSig==3) PX_is_natural_sig=true; //else CS is the natural frame by default if(frameBkg==2) HX_is_natural_bkg=true; if(frameBkg==3) PX_is_natural_bkg=true; //else CS is the natural frame by default cout<<"Number of Events to be generated ........... "<<n_events<<endl; cout<<"pT min ..................................... "<<pTdilepton_min<<endl; cout<<"pT max ..................................... "<<pTdilepton_max<<endl; cout<<"Rapidity min ............................... "<<rapdilepton_min<<endl; cout<<"Rapidity max ............................... "<<rapdilepton_max<<endl; cout<<"Background Fraction ........................ "<<f_BG<<endl; cout<<"Injected lambda_theta Signal ............... "<<lambda_theta_sig<<" , in the "<<frameSigName<<" frame"<<endl; cout<<"Injected lambda_phi Signal ................. "<<lambda_phi_sig<<" , in the "<<frameSigName<<" frame"<<endl; cout<<"Injected lambda_thetaphi Signal ............ "<<lambda_thetaphi_sig<<" , in the "<<frameSigName<<" frame"<<endl; cout<<"Injected lambda_theta Background............ "<<lambda_theta_bkg<<" , in the "<<frameBkgName<<" frame"<<endl; cout<<"Injected lambda_phi Background ............. "<<lambda_phi_bkg<<" , in the "<<frameBkgName<<" frame"<<endl; cout<<"Injected lambda_thetaphi Background ........ "<<lambda_thetaphi_bkg<<" , in the "<<frameBkgName<<" frame"<<endl; cout<<"Number of Generation ....................... "<<nGen<<endl; cout<<"Directory Structure of Output .............. "<<dirstruct<<endl; double mass_min = mass_signal_peak - n_sigmas_signal*mass_signal_sigma; double mass_max = mass_signal_peak + n_sigmas_signal*mass_signal_sigma; char outfilename [500]; sprintf(outfilename,"%s/genData.root",dirstruct); gROOT->Reset(); delete gRandom; gRandom = new TRandom3(0); TF1* pT_distr = new TF1("pT_distr",func_pT_gen,pTdilepton_min,pTdilepton_max,0); TF1* rap_distr = new TF1("rap_distr",func_rap_gen,rapdilepton_min,rapdilepton_max,0); TFile* hfileout = new TFile(outfilename, "RECREATE", "genData"); TTree* genData = new TTree("genData","genData"); // Structure of output ntuple TLorentzVector* lepP = new TLorentzVector(0.,0.,0.,0.); genData->Branch("lepP","TLorentzVector",&lepP); TLorentzVector* lepN = new TLorentzVector(0.,0.,0.,0.); genData->Branch("lepN","TLorentzVector",&lepN); double costh_CS; genData->Branch("costh_CS", &costh_CS, "costh_CS/D"); double phi_CS; genData->Branch("phi_CS", &phi_CS, "phi_CS/D" ); double phith_CS; genData->Branch("phith_CS", &phith_CS, "phith_CS/D"); double costh_HX; genData->Branch("costh_HX", &costh_HX, "costh_HX/D"); double phi_HX; genData->Branch("phi_HX", &phi_HX, "phi_HX/D" ); double phith_HX; genData->Branch("phith_HX", &phith_HX, "phith_HX/D"); double costh_PX; genData->Branch("costh_PX", &costh_PX, "costh_PX/D"); double phi_PX; genData->Branch("phi_PX", &phi_PX, "phi_PX/D" ); double phith_PX; genData->Branch("phith_PX", &phith_PX, "phith_PX/D"); double cosalpha; genData->Branch("cosalpha", &cosalpha, "cosalpha/D"); double pT; genData->Branch("pT", &pT, "pT/D" ); double rap; genData->Branch("rap", &rap, "rap/D" ); double mass; genData->Branch("mass", &mass, "mass/D"); double deltaHXCS; genData->Branch("deltaHXCS", &deltaHXCS, "deltaHXCS/D"); int isBG; genData->Branch("isBG", &isBG, "isBG/I"); // extremes and binning of lambda_gen extraction histos const double l_min = -1; const double l_max = 1; const double l_step_1D = 0.02; TH1D* h_costh2_CS = new TH1D( "h_costh2_CS", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_cos2ph_CS = new TH1D( "h_cos2ph_CS", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_sin2thcosph_CS = new TH1D( "h_sin2thcosph_CS", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_costh2_HX = new TH1D( "h_costh2_HX", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_cos2ph_HX = new TH1D( "h_cos2ph_HX", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_sin2thcosph_HX = new TH1D( "h_sin2thcosph_HX", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_costh2_PX = new TH1D( "h_costh2_PX", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_cos2ph_PX = new TH1D( "h_cos2ph_PX", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); TH1D* h_sin2thcosph_PX = new TH1D( "h_sin2thcosph_PX", "", int((l_max-l_min)/l_step_1D), l_min, l_max ); double costh2; double cos2ph; double sin2thcosph; double Phi; const int n_step = n_events/5; int n_step_=1; cout << endl; cout << "Generating " << n_events << " dilepton events"<< endl; cout << "------------------------------------------------------------" << endl; cout << "Progress: "<<endl; /////////////////// CYCLE OF EVENTS //////////////////////// for(int i_event = 1; i_event <= n_events; i_event++){ if (i_event%n_step == 0) {cout << n_step_*20 <<" % "<<endl; n_step_++;} // generation of dilepton in the pp event in the pp CM // mass isBG = 0; if ( gRandom->Uniform() < f_BG ) { mass = gRandom->Uniform(mass_min, mass_max); isBG = 1; } else { do { mass = gRandom->Gaus(mass_signal_peak, mass_signal_sigma); } while ( mass < mass_min || mass > mass_max ); } // pT: pT = pT_distr->GetRandom(); // pL: double rap_sign = gRandom->Uniform(-1., 1.); rap_sign /= TMath::Abs(rap_sign); rap = rap_distr->GetRandom() * rap_sign; double mT = sqrt( mass*mass + pT*pT ); double pL1 = 0.5 *mT * exp(rap); double pL2 = - 0.5 *mT * exp(-rap); double pL = pL1 + pL2; // Phi: double Phi = 2. * gPI * gRandom->Uniform(1.); // 4-vector: TLorentzVector dilepton; dilepton.SetXYZM( pT * cos(Phi) , pT * sin(Phi), pL, mass ); // generation of polarization (generic reference frame) double lambda_theta = lambda_theta_sig; double lambda_phi = lambda_phi_sig; double lambda_thetaphi = lambda_thetaphi_sig; bool HX_is_natural = HX_is_natural_sig; bool PX_is_natural = PX_is_natural_sig; if ( isBG ) { lambda_theta = lambda_theta_bkg; lambda_phi = lambda_phi_bkg; lambda_thetaphi = lambda_thetaphi_bkg; HX_is_natural = HX_is_natural_bkg; PX_is_natural = PX_is_natural_bkg; } double costhphidistr_max = 1. + TMath::Abs(lambda_phi) + TMath::Abs(lambda_thetaphi); double costhphidistr_rnd; double costhphidistr; double costh_gen; double sinth_gen; double phi_gen; if ( lambda_theta > 0. ) costhphidistr_max += lambda_theta; do { costh_gen = -1. + 2. * gRandom->Uniform(1.); phi_gen = 2. * gPI * gRandom->Uniform(1.); sinth_gen = sqrt( 1. - costh_gen*costh_gen ); costhphidistr_rnd = costhphidistr_max * gRandom->Uniform(1.); costhphidistr = 1. + lambda_theta * costh_gen*costh_gen + lambda_phi * sinth_gen*sinth_gen * cos(2.*phi_gen) + lambda_thetaphi * 2.* sinth_gen*costh_gen * cos(phi_gen); } while ( costhphidistr_rnd > costhphidistr ); // lepton momentum in the dilepton rest frame: double p_lepton_DILEP = sqrt( 0.25*mass*mass - Mlepton*Mlepton ); TLorentzVector lepton_DILEP; lepton_DILEP.SetXYZM( p_lepton_DILEP * sinth_gen * cos(phi_gen), p_lepton_DILEP * sinth_gen * sin(phi_gen), p_lepton_DILEP * costh_gen, Mlepton ); // reference directions to calculate angles: TVector3 lab_to_dilep = -dilepton.BoostVector(); TLorentzVector beam1_DILEP = beam1_LAB; beam1_DILEP.Boost(lab_to_dilep); // beam1 in the dilepton rest frame TLorentzVector beam2_DILEP = beam2_LAB; beam2_DILEP.Boost(lab_to_dilep); // beam2 in the dilepton rest frame TVector3 beam1_direction = beam1_DILEP.Vect().Unit(); TVector3 beam2_direction = beam2_DILEP.Vect().Unit(); TVector3 dilep_direction = dilepton.Vect().Unit(); TVector3 beam1_beam2_bisect = ( beam1_direction - beam2_direction ).Unit(); deltaHXCS = dilep_direction.Angle(beam1_beam2_bisect) * 180./gPI; // all polarization frames have the same Y axis = the normal to the plane formed by // the directions of the colliding hadrons TVector3 Yaxis = ( beam1_direction.Cross( beam2_direction ) ).Unit(); // flip of y axis with rapidity if ( rap < 0 ) Yaxis = - Yaxis; TVector3 perpendicular_to_beam = ( beam1_beam2_bisect.Cross( Yaxis ) ).Unit(); // step 1: transform (rotation) lepton momentum components from generation frame // to the frame with x,y,z axes as in the laboratory TVector3 oldZaxis = beam1_beam2_bisect; if ( HX_is_natural ) oldZaxis = dilep_direction; if ( PX_is_natural ) oldZaxis = perpendicular_to_beam; TVector3 oldYaxis = Yaxis; TVector3 oldXaxis = oldYaxis.Cross(oldZaxis); TRotation rotation; rotation.RotateAxes(oldXaxis, oldYaxis, oldZaxis); // transforms coordinates from the "old" frame to the "xyz" frame TLorentzVector lepton_DILEP_xyz = lepton_DILEP; lepton_DILEP_xyz.Transform(rotation); // lepton_DILEP_xyz is the lepton in the dilepton rest frame // wrt to the lab axes // lepton 4-vectors in the LAB frame: TVector3 dilep_to_lab = dilepton.BoostVector(); *lepP = lepton_DILEP_xyz; lepP->Boost(dilep_to_lab); lepN->SetPxPyPzE(-lepton_DILEP_xyz.Px(),-lepton_DILEP_xyz.Py(),-lepton_DILEP_xyz.Pz(),lepton_DILEP_xyz.E()); lepN->Boost(dilep_to_lab); ///////////////////////////////////////////////////////////////////// // CS frame TVector3 newZaxis = beam1_beam2_bisect; TVector3 newYaxis = Yaxis; TVector3 newXaxis = newYaxis.Cross( newZaxis ); rotation.SetToIdentity(); rotation.RotateAxes( newXaxis, newYaxis, newZaxis ); rotation.Invert(); // transforms coordinates from the "xyz" frame to the new frame TVector3 lepton_DILEP_rotated = lepton_DILEP_xyz.Vect(); lepton_DILEP_rotated.Transform(rotation); costh_CS = lepton_DILEP_rotated.CosTheta(); phi_CS = lepton_DILEP_rotated.Phi() * 180. / gPI; if ( costh_CS < 0. ) phith_CS = phi_CS - 135.; if ( costh_CS > 0. ) phith_CS = phi_CS - 45.; if ( phith_CS < -180. ) phith_CS = 360. + phith_CS; ///////////////////////////////////////////////////////////////////// // HELICITY frame newZaxis = dilep_direction; newYaxis = Yaxis; newXaxis = newYaxis.Cross( newZaxis ); rotation.SetToIdentity(); rotation.RotateAxes( newXaxis, newYaxis, newZaxis ); rotation.Invert(); lepton_DILEP_rotated = lepton_DILEP_xyz.Vect(); lepton_DILEP_rotated.Transform(rotation); costh_HX = lepton_DILEP_rotated.CosTheta(); phi_HX = lepton_DILEP_rotated.Phi() * 180. / gPI; if ( costh_HX < 0. ) phith_HX = phi_HX - 135.; if ( costh_HX > 0. ) phith_HX = phi_HX - 45.; if ( phith_HX < -180. ) phith_HX = 360. + phith_HX; ///////////////////////////////////////////////////////////////////// // PERPENDICULAR HELICITY frame newZaxis = perpendicular_to_beam; newYaxis = Yaxis; newXaxis = newYaxis.Cross( newZaxis ); rotation.SetToIdentity(); rotation.RotateAxes( newXaxis, newYaxis, newZaxis ); rotation.Invert(); lepton_DILEP_rotated = lepton_DILEP_xyz.Vect(); lepton_DILEP_rotated.Transform(rotation); costh_PX = lepton_DILEP_rotated.CosTheta(); phi_PX = lepton_DILEP_rotated.Phi() * 180. / gPI; if ( costh_PX < 0. ) phith_PX = phi_PX - 135.; if ( costh_PX > 0. ) phith_PX = phi_PX - 45.; if ( phith_PX < -180. ) phith_PX = 360. + phith_PX; ///////////////////////////////////////////////////////////////////// // invariant polarization angle cosalpha = sqrt( 1. - pow(costh_PX, 2.) ) * sin( lepton_DILEP_rotated.Phi() ); ////// Filling Histograms of costh2, cos2ph and sin2thcosph for the extraction of the actual generated polarization if ( !isBG ){ costh2=pow(costh_CS,2.); Phi = phi_CS/180. * gPI ; cos2ph = cos(2.*Phi); sin2thcosph= sin(2.*acos(costh_CS))*cos(Phi); h_costh2_CS->Fill( costh2 ); h_cos2ph_CS->Fill( cos2ph ); h_sin2thcosph_CS->Fill( sin2thcosph ); costh2=pow(costh_HX,2.); Phi = phi_HX/180. * gPI ; cos2ph = cos(2.*Phi); sin2thcosph= sin(2.*acos(costh_HX))*cos(Phi); h_costh2_HX->Fill( costh2 ); h_cos2ph_HX->Fill( cos2ph ); h_sin2thcosph_HX->Fill( sin2thcosph ); costh2=pow(costh_PX,2.); Phi = phi_PX/180. * gPI ; cos2ph = cos(2.*Phi); sin2thcosph= sin(2.*acos(costh_PX))*cos(Phi); h_costh2_PX->Fill( costh2 ); h_cos2ph_PX->Fill( cos2ph ); h_sin2thcosph_PX->Fill( sin2thcosph ); } // filling of the ntuple: genData->Fill(); } // end of external loop (generated events) cout << endl; double lamth_CS; double lamph_CS; double lamtp_CS; costh2=h_costh2_CS->GetMean(); lamth_CS = (1. - 3. * costh2 ) / ( costh2 - 3./5. ); cos2ph=h_cos2ph_CS->GetMean(); lamph_CS = cos2ph * (3. + lamth_CS); sin2thcosph=h_sin2thcosph_CS->GetMean(); lamtp_CS = sin2thcosph * 5./4. * (3. + lamth_CS); double lamth_HX; double lamph_HX; double lamtp_HX; costh2=h_costh2_HX->GetMean(); lamth_HX = (1. - 3. * costh2 ) / ( costh2 - 3./5. ); cos2ph=h_cos2ph_HX->GetMean(); lamph_HX = cos2ph * (3. + lamth_HX); sin2thcosph=h_sin2thcosph_HX->GetMean(); lamtp_HX = sin2thcosph * 5./4. * (3. + lamth_HX); double lamth_PX; double lamph_PX; double lamtp_PX; costh2=h_costh2_PX->GetMean(); lamth_PX = (1. - 3. * costh2 ) / ( costh2 - 3./5. ); cos2ph=h_cos2ph_PX->GetMean(); lamph_PX = cos2ph * (3. + lamth_PX); sin2thcosph=h_sin2thcosph_PX->GetMean(); lamtp_PX = sin2thcosph * 5./4. * (3. + lamth_PX); char resfilename[200]; sprintf(resfilename,"%s/GenResults.root",dirstruct); TFile* GenResultFile = new TFile(resfilename, "RECREATE", "GenResultFile"); TTree* GenResults = new TTree("GenResults","GenResults"); GenResults->Branch("lthCS", &lamth_CS, "lthCS/D"); GenResults->Branch("lphCS", &lamph_CS, "lphCS/D"); GenResults->Branch("ltpCS", &lamtp_CS, "ltpCS/D"); GenResults->Branch("lthHX", &lamth_HX, "lthHX/D"); GenResults->Branch("lphHX", &lamph_HX, "lphHX/D"); GenResults->Branch("ltpHX", &lamtp_HX, "ltpHX/D"); GenResults->Branch("lthPX", &lamth_PX, "lthPX/D"); GenResults->Branch("lphPX", &lamph_PX, "lphPX/D"); GenResults->Branch("ltpPX", &lamtp_PX, "ltpPX/D"); GenResults->Fill(); GenResultFile->Write(); GenResultFile->Close(); hfileout->Write(); hfileout->Close(); } // end of main
void leptonic_fitter_algebraic::update_nu_and_decay_chain( double nu_px, double nu_py, double nu_pz ) { TLorentzVector nu; nu.SetXYZM( nu_px, nu_py, nu_pz, 0. ); update_nu_and_decay_chain( nu ); }
int main(int argc, char * argv[]) { // first argument - config file // second argument - filelist using namespace std; // **** configuration Config cfg(argv[1]); // kinematic cuts on electrons const float ptTauCut = cfg.get<float>("ptTauCut"); const float etaTauCut = cfg.get<float>("etaTauCut"); const float dzTauCut = cfg.get<float>("dzTauCut"); // veto electrons const float ptVetoElectronCut = cfg.get<float>("ptVetoElectronCut"); const float etaVetoElectronCut = cfg.get<float>("etaVetoElectronCut"); const float dxyVetoElectronCut = cfg.get<float>("dxyVetoElectronCut"); const float dzVetoElectronCut = cfg.get<float>("dzVetoElectronCut"); const float isoVetoElectronCut = cfg.get<float>("isoVetoElectronCut"); const bool applyVetoElectronId = cfg.get<bool>("ApplyVetoElectronId"); // kinematic cuts on muons const float ptMuonCut = cfg.get<float>("ptMuonCut"); const float ptMuonHighCut = cfg.get<float>("ptMuonHighCut"); const float etaMuonCut = cfg.get<float>("etaMuonCut"); const float dxyMuonCut = cfg.get<float>("dxyMuonCut"); const float dzMuonCut = cfg.get<float>("dzMuonCut"); const float isoMuonLowCut = cfg.get<float>("isoMuonLowCut"); const float isoMuonHighCut = cfg.get<float>("isoMuonHighCut"); const bool applyMuonId = cfg.get<bool>("ApplyMuonId"); // HLT filters const string isoMuon24Leg = cfg.get<string>("IsoMuon24Leg"); const string muonTauMuonLeg = cfg.get<string>("MuonTauMuonLeg"); const string muonTauOverlap = cfg.get<string>("MuonTauOverlap"); const string muonTauTauLeg = cfg.get<string>("MuonTauTauLeg"); // veto muons const float ptVetoMuonCut = cfg.get<float>("ptVetoMuonCut"); const float etaVetoMuonCut = cfg.get<float>("etaVetoMuonCut"); const float dxyVetoMuonCut = cfg.get<float>("dxyVetoMuonCut"); const float dzVetoMuonCut = cfg.get<float>("dzVetoMuonCut"); const float isoVetoMuonCut = cfg.get<float>("isoVetoMuonCut"); const bool applyVetoMuonId = cfg.get<bool>("ApplyVetoMuonId"); // dileptopn veto const float ptDilepVeto = cfg.get<float>("ptDilepVeto"); const float etaDilepVeto = cfg.get<float>("etaDilepVeto"); const float dxyDilepVeto = cfg.get<float>("dxyDilepVeto"); const float dzDilepVeto = cfg.get<float>("dzDilepVeto"); const float isoDilepVeto = cfg.get<float>("isoDilepVeto"); const float dRDilepVeto = cfg.get<float>("dRDilepVeto"); // vertex cuts const float ndofVertexCut = cfg.get<float>("NdofVertexCut"); const float zVertexCut = cfg.get<float>("ZVertexCut"); const float dVertexCut = cfg.get<float>("DVertexCut"); // topological cuts const float dRleptonsCut = cfg.get<float>("dRleptonsCut"); const bool isIsoR03 = cfg.get<bool>("IsIsoR03"); const bool applyTriggerMatch = cfg.get<bool>("ApplyTriggerMatch"); const float deltaRTrigMatch = cfg.get<float>("DRTrigMatch"); // jets const float jetEtaCut = cfg.get<float>("JetEtaCut"); const float jetPtLowCut = cfg.get<float>("JetPtLowCut"); const float jetPtHighCut = cfg.get<float>("JetPtHighCut"); const float dRJetLeptonCut = cfg.get<float>("dRJetLeptonCut"); const float bJetEtaCut = cfg.get<float>("bJetEtaCut"); const float btagCut = cfg.get<float>("btagCut"); const bool applyJetPfId = cfg.get<bool>("ApplyJetPfId"); const bool applyJetPuId = cfg.get<bool>("ApplyJetPuId"); // check overlap const bool checkOverlap = cfg.get<bool>("CheckOverlap"); TString IsoMuon24Leg(isoMuon24Leg); TString MuonTauMuonLeg(muonTauMuonLeg); TString MuonTauOverlap(muonTauOverlap); TString MuonTauTauLeg(muonTauTauLeg); // **** end of configuration // file name and tree name std::string rootFileName(argv[2]); std::ifstream fileList(argv[2]); std::ifstream fileList0(argv[2]); std::string ntupleName("makeroottree/AC1B"); TString TStrName(rootFileName); std::cout <<TStrName <<std::endl; // output fileName with histograms TFile * file = new TFile(TStrName+TString(".root"),"recreate"); file->cd(""); TH1F * inputEventsH = new TH1F("inputEventsH","",1,-0.5,0.5); TTree * tree = new TTree("TauCheck","TauCheck"); // Declaration of leaf types Int_t run; Int_t lumi; Int_t evt; Int_t npv; Int_t npu; Float_t rho; Float_t mcweight; Float_t puweight; Float_t trigweight_1; Float_t trigweight_2; Float_t idweight_1; Float_t idweight_2; Float_t isoweight_1; Float_t isoweight_2; Float_t effweight; Float_t fakeweight; Float_t embeddedWeight; Float_t signalWeight; Float_t weight; Float_t m_vis; Float_t m_sv; Float_t pt_sv; Float_t eta_sv; Float_t phi_sv; Float_t pt_1; Float_t phi_1; Float_t eta_1; Float_t m_1; Int_t q_1; Float_t iso_1; Float_t mva_1; Float_t d0_1; Float_t dZ_1; Float_t mt_1; Float_t pt_2; Float_t phi_2; Float_t eta_2; Float_t m_2; Int_t q_2; Float_t iso_2; Float_t d0_2; Float_t dZ_2; Float_t mva_2; Float_t mt_2; Bool_t os; Bool_t dilepton_veto; Bool_t extraelec_veto; Bool_t extramuon_veto; Float_t byCombinedIsolationDeltaBetaCorrRaw3Hits_1; Float_t againstElectronLooseMVA5_1; Float_t againstElectronMediumMVA5_1; Float_t againstElectronTightMVA5_1; Float_t againstElectronVLooseMVA5_1; Float_t againstElectronVTightMVA5_1; Float_t againstMuonLoose3_1; Float_t againstMuonTight3_1; Float_t byCombinedIsolationDeltaBetaCorrRaw3Hits_2; Float_t againstElectronLooseMVA5_2; Float_t againstElectronMediumMVA5_2; Float_t againstElectronTightMVA5_2; Float_t againstElectronVLooseMVA5_2; Float_t againstElectronVTightMVA5_2; Float_t againstMuonLoose3_2; Float_t againstMuonTight3_2; Float_t met; Float_t metphi; Float_t metcov00; Float_t metcov01; Float_t metcov10; Float_t metcov11; Float_t mvamet; Float_t mvametphi; Float_t mvacov00; Float_t mvacov01; Float_t mvacov10; Float_t mvacov11; Float_t pt_tt; Float_t pzetavis; Float_t pzetamiss; Float_t mva_gf; Int_t njets; Int_t njetspt20; Float_t jpt_1; Float_t jeta_1; Float_t jphi_1; Float_t jptraw_1; Float_t jptunc_1; Float_t jmva_1; Float_t jlrm_1; Int_t jctm_1; Float_t jpt_2; Float_t jeta_2; Float_t jphi_2; Float_t jptraw_2; Float_t jptunc_2; Float_t jmva_2; Float_t jlrm_2; Int_t jctm_2; Float_t mjj; Float_t jdeta; Int_t njetingap; Int_t nbtag; Float_t bpt; Float_t beta; Float_t bphi; tree->Branch("run", &run, "run/I"); tree->Branch("lumi", &lumi, "lumi/I"); tree->Branch("evt", &evt, "evt/I"); tree->Branch("npv", &npv, "npv/I"); tree->Branch("npu", &npu, "npu/I"); tree->Branch("rho", &rho, "rho/F"); tree->Branch("mcweight", &mcweight, "mcweight/F"); tree->Branch("puweight", &puweight, "puweight/F"); tree->Branch("trigweight_1", &trigweight_1, "trigweight_1/F"); tree->Branch("trigweight_2", &trigweight_2, "trigweight_2/F"); tree->Branch("idweight_1", &idweight_1, "idweight_1/F"); tree->Branch("idweight_2", &idweight_2, "idweight_2/F"); tree->Branch("isoweight_1", &isoweight_1, "isoweight_1/F"); tree->Branch("isoweight_2", &isoweight_2, "isoweight_2/F"); tree->Branch("effweight", &effweight, "effweight/F"); tree->Branch("fakeweight", &fakeweight, "fakeweight/F"); tree->Branch("embeddedWeight", &embeddedWeight, "embeddedWeight/F"); tree->Branch("signalWeight", &signalWeight, "signalWeight/F"); tree->Branch("weight", &weight, "weight/F"); tree->Branch("m_vis", &m_vis, "m_vis/F"); tree->Branch("m_sv", &m_sv, "m_sv/F"); tree->Branch("pt_sv", &pt_sv, "pt_sv/F"); tree->Branch("eta_sv", &eta_sv, "eta_sv/F"); tree->Branch("phi_sv", &phi_sv, "phi_sv/F"); tree->Branch("pt_1", &pt_1, "pt_1/F"); tree->Branch("phi_1", &phi_1, "phi_1/F"); tree->Branch("eta_1", &eta_1, "eta_1/F"); tree->Branch("m_1", &m_1, "m_1/F"); tree->Branch("q_1", &q_1, "q_1/I"); tree->Branch("iso_1", &iso_1, "iso_1/F"); tree->Branch("mva_1", &mva_1, "mva_1/F"); tree->Branch("d0_1", &d0_1, "d0_1/F"); tree->Branch("dZ_1", &dZ_1, "dZ_1/F"); tree->Branch("mt_1", &mt_1, "mt_1/F"); tree->Branch("pt_2", &pt_2, "pt_2/F"); tree->Branch("phi_2", &phi_2, "phi_2/F"); tree->Branch("eta_2", &eta_2, "eta_2/F"); tree->Branch("m_2", &m_2, "m_2/F"); tree->Branch("q_2", &q_2, "q_2/I"); tree->Branch("iso_2", &iso_2, "iso_2/F"); tree->Branch("d0_2", &d0_2, "d0_2/F"); tree->Branch("dZ_2", &dZ_2, "dZ_2/F"); tree->Branch("mva_2", &mva_2, "mva_2/F"); tree->Branch("mt_2", &mt_2, "mt_2/F"); tree->Branch("os", &os, "os/O"); tree->Branch("dilepton_veto", &dilepton_veto, "dilepton_veto/O"); tree->Branch("extraelec_veto", &extraelec_veto, "extraelec_veto/O"); tree->Branch("extramuon_veto", &extramuon_veto, "extramuon_veto/O"); tree->Branch("byCombinedIsolationDeltaBetaCorrRaw3Hits_1", &byCombinedIsolationDeltaBetaCorrRaw3Hits_1, "byCombinedIsolationDeltaBetaCorrRaw3Hits_1/F"); tree->Branch("againstElectronLooseMVA5_1", &againstElectronLooseMVA5_1, "againstElectronLooseMVA5_1/F"); tree->Branch("againstElectronMediumMVA5_1", &againstElectronMediumMVA5_1, "againstElectronMediumMVA5_1/F"); tree->Branch("againstElectronTightMVA5_1", &againstElectronTightMVA5_1, "againstElectronTightMVA5_1/F"); tree->Branch("againstElectronVLooseMVA5_1", &againstElectronVLooseMVA5_1, "againstElectronVLooseMVA5_1/F"); tree->Branch("againstElectronVTightMVA5_1", &againstElectronVTightMVA5_1, "againstElectronVTightMVA5_1/F"); tree->Branch("againstMuonLoose3_1", &againstMuonLoose3_1, "againstMuonLoose3_1/F"); tree->Branch("againstMuonTight3_1", &againstMuonTight3_1, "againstMuonTight3_1/F"); tree->Branch("byCombinedIsolationDeltaBetaCorrRaw3Hits_2", &byCombinedIsolationDeltaBetaCorrRaw3Hits_2, "byCombinedIsolationDeltaBetaCorrRaw3Hits_2/F"); tree->Branch("againstElectronLooseMVA5_2", &againstElectronLooseMVA5_2, "againstElectronLooseMVA5_2/F"); tree->Branch("againstElectronMediumMVA5_2", &againstElectronMediumMVA5_2, "againstElectronMediumMVA5_2/F"); tree->Branch("againstElectronTightMVA5_2", &againstElectronTightMVA5_2, "againstElectronTightMVA5_2/F"); tree->Branch("againstElectronVLooseMVA5_2", &againstElectronVLooseMVA5_2, "againstElectronVLooseMVA5_2/F"); tree->Branch("againstElectronVTightMVA5_2", &againstElectronVTightMVA5_2, "againstElectronVTightMVA5_2/F"); tree->Branch("againstMuonLoose3_2", &againstMuonLoose3_2, "againstMuonLoose3_2/F"); tree->Branch("againstMuonTight3_2", &againstMuonTight3_2, "againstMuonTight3_2/F"); tree->Branch("met", &met, "met/F"); tree->Branch("metphi", &metphi, "metphi/F"); tree->Branch("metcov00", &metcov00, "metcov00/F"); tree->Branch("metcov01", &metcov01, "metcov01/F"); tree->Branch("metcov10", &metcov10, "metcov10/F"); tree->Branch("metcov11", &metcov11, "metcov11/F"); tree->Branch("mvamet", &mvamet, "mvamet/F"); tree->Branch("mvametphi", &mvametphi, "mvametphi/F"); tree->Branch("mvacov00", &mvacov00, "mvacov00/F"); tree->Branch("mvacov01", &mvacov01, "mvacov01/F"); tree->Branch("mvacov10", &mvacov10, "mvacov10/F"); tree->Branch("mvacov11", &mvacov11, "mvacov11/F"); tree->Branch("pt_tt", &pt_tt, "pt_tt/F"); tree->Branch("pzetavis", &pzetavis, "pzetavis/F"); tree->Branch("pzetamiss", &pzetamiss, "pzetamiss/F"); tree->Branch("mva_gf", &mva_gf, "mva_gf/F"); tree->Branch("njets", &njets, "njets/I"); tree->Branch("njetspt20", &njetspt20, "njetspt20/I"); tree->Branch("jpt_1", &jpt_1, "jpt_1/F"); tree->Branch("jeta_1", &jeta_1, "jeta_1/F"); tree->Branch("jphi_1", &jphi_1, "jphi_1/F"); tree->Branch("jptraw_1", &jptraw_1, "jptraw_1/F"); tree->Branch("jptunc_1", &jptunc_1, "jptunc_1/F"); tree->Branch("jmva_1", &jmva_1, "jmva_1/F"); tree->Branch("jlrm_1", &jlrm_1, "jlrm_1/F"); tree->Branch("jctm_1", &jctm_1, "jctm_1/I"); tree->Branch("jpt_2", &jpt_2, "jpt_2/F"); tree->Branch("jeta_2", &jeta_2, "jeta_2/F"); tree->Branch("jphi_2", &jphi_2, "jphi_2/F"); tree->Branch("jptraw_2", &jptraw_2, "jptraw_2/F"); tree->Branch("jptunc_2", &jptunc_2, "jptunc_2/F"); tree->Branch("jmva_2", &jmva_2, "jlrm_2/F"); tree->Branch("jlrm_2", &jlrm_2, "jlrm_2/F"); tree->Branch("jctm_2", &jctm_2, "jctm_2/I"); tree->Branch("mjj", &mjj, "mjj/F"); tree->Branch("jdeta", &jdeta, "jdeta/F"); tree->Branch("njetingap", &njetingap, "njetingap/I"); tree->Branch("nbtag", &nbtag, "nbtag/I"); tree->Branch("bpt", &bpt, "bpt/F"); tree->Branch("beta", &beta, "beta/F"); tree->Branch("bphi", &bphi, "bphi/F"); int nTotalFiles = 0; std::string dummy; // count number of files ---> while (fileList0 >> dummy) nTotalFiles++; int nEvents = 0; int selEvents = 0; int nFiles = 0; int nonOverlap = 0; vector<int> runList; runList.clear(); vector<int> eventList; eventList.clear(); if (checkOverlap) { std::ifstream fileEvents("overlap.txt"); int Run, Event, Lumi; std::cout << "Non-overlapping events ->" << std::endl; while (fileEvents >> Run >> Event >> Lumi) { runList.push_back(Run); eventList.push_back(Event); std::cout << Run << ":" << Event << std::endl; } std::cout << std::endl; } std::ofstream fileOutput("overlap.out"); for (int iF=0; iF<nTotalFiles; ++iF) { std::string filen; fileList >> filen; std::cout << "file " << iF+1 << " out of " << nTotalFiles << " filename : " << filen << std::endl; TFile * file_ = TFile::Open(TString(filen)); TTree * _tree = NULL; _tree = (TTree*)file_->Get(TString(ntupleName)); if (_tree==NULL) continue; TH1D * histoInputEvents = NULL; histoInputEvents = (TH1D*)file_->Get("makeroottree/nEvents"); if (histoInputEvents==NULL) continue; int NE = int(histoInputEvents->GetEntries()); std::cout << " number of input events = " << NE << std::endl; for (int iE=0;iE<NE;++iE) inputEventsH->Fill(0.); AC1B analysisTree(_tree); Long64_t numberOfEntries = analysisTree.GetEntries(); std::cout << " number of entries in Tree = " << numberOfEntries << std::endl; for (Long64_t iEntry=0; iEntry<numberOfEntries; iEntry++) { analysisTree.GetEntry(iEntry); nEvents++; if (nEvents%10000==0) cout << " processed " << nEvents << " events" << endl; run = int(analysisTree.event_run); lumi = int(analysisTree.event_luminosityblock); evt = int(analysisTree.event_nr); // weights mcweight = analysisTree.genweight; puweight = 0; trigweight_1 = 0; trigweight_2 = 0; idweight_1 = 0; idweight_2 = 0; isoweight_1 = 0; isoweight_2 = 0; effweight = 0; fakeweight = 0; embeddedWeight = 0; signalWeight = 0; weight = 1; npv = analysisTree.primvertex_count; npu = analysisTree.numtruepileupinteractions;// numpileupinteractions; rho = analysisTree.rho; unsigned int nIsoMuon24Leg = 0; bool isIsoMuon24Leg = false; unsigned int nMuonTauMuonLeg = 0; bool isMuonTauMuonLeg = false; unsigned int nMuonTauOverlap = 0; bool isMuonTauOverlap = false; unsigned int nMuonTauTauLeg = 0; bool isMuonTauTauLeg = false; unsigned int nfilters = analysisTree.run_hltfilters->size(); // std::cout << "nfiltres = " << nfilters << std::endl; for (unsigned int i=0; i<nfilters; ++i) { // std::cout << "HLT Filter : " << i << " = " << analysisTree.run_hltfilters->at(i) << std::endl; TString HLTFilter(analysisTree.run_hltfilters->at(i)); if (HLTFilter==IsoMuon24Leg) { nIsoMuon24Leg = i; isIsoMuon24Leg = true; } if (HLTFilter==MuonTauMuonLeg) { nMuonTauMuonLeg = i; isMuonTauMuonLeg = true; } if (HLTFilter==MuonTauOverlap) { nMuonTauOverlap = i; isMuonTauOverlap = true; } if (HLTFilter==MuonTauTauLeg) { nMuonTauTauLeg = i; isMuonTauTauLeg = true; } } if (!isIsoMuon24Leg) { std::cout << "HLT filter " << IsoMuon24Leg << " not found" << std::endl; exit(-1); } if (!isMuonTauMuonLeg) { std::cout << "HLT filter " << MuonTauMuonLeg << " not found" << std::endl; exit(-1); } if (!isMuonTauOverlap) { std::cout << "HLT filter " << MuonTauOverlap << " not found" << std::endl; exit(-1); } if (!isMuonTauTauLeg) { std::cout << "HLT filter " << MuonTauTauLeg << " not found" << std::endl; exit(-1); } // std::cout << "IsoMu24 : " << IsoMuon24Leg << " : " << nIsoMuon24Leg << std::endl; // std::cout << "MuTauMuLeg : " << MuonTauMuonLeg << " : " << nMuonTauMuonLeg << std::endl; // std::cout << "MuTauTauLeg : " << MuonTauTauLeg << " : " << nMuonTauTauLeg << std::endl; // std::cout << "MuTauOverlap : " << MuonTauOverlap << " : " << nMuonTauOverlap << std::endl; // std::cout << std::endl; // continue; // vertex cuts //if (fabs(analysisTree.primvertex_z)>zVertexCut) continue; //if (analysisTree.primvertex_ndof<ndofVertexCut) continue; float dVertex = (analysisTree.primvertex_x*analysisTree.primvertex_x+ analysisTree.primvertex_y*analysisTree.primvertex_y); //if (dVertex>dVertexCut) continue; // tau selection vector<int> taus; taus.clear(); for (unsigned int it = 0; it<analysisTree.tau_count; ++it) { if (analysisTree.tau_decayModeFindingNewDMs[it]<=0.5) continue; if (analysisTree.tau_pt[it]<=ptTauCut) continue; if (fabs(analysisTree.tau_eta[it])>=etaTauCut) continue; if (fabs(analysisTree.tau_leadchargedhadrcand_dz[it])>=dzTauCut) continue; if (fabs(analysisTree.tau_charge[it])<0.999|| fabs(analysisTree.tau_charge[it])>1.001) continue; taus.push_back(it); } // muon selection vector<int> muons; muons.clear(); for (unsigned int im = 0; im<analysisTree.muon_count; ++im) { if (analysisTree.muon_pt[im]<=ptMuonCut) continue; if (fabs(analysisTree.muon_eta[im])>=etaMuonCut) continue; if (fabs(analysisTree.muon_dxy[im])>=dxyMuonCut) continue; if (fabs(analysisTree.muon_dz[im])>=dzMuonCut) continue; bool goodGlb = analysisTree.muon_isGlobal[im] && analysisTree.muon_normChi2[im] < 3 && analysisTree.muon_combQ_chi2LocalPosition[im] < 12 && analysisTree.muon_combQ_trkKink[im] < 20; bool isMed = analysisTree.muon_isLoose[im] && analysisTree.muon_validFraction[im] > 0.8 && analysisTree.muon_segmentComp[im] > (goodGlb ? 0.303 : 0.451); if (applyMuonId && !isMed) continue; //if (applyMuonId && !analysisTree.muon_isMedium[im]) continue; muons.push_back(im); } if (taus.size()==0) continue; if (muons.size()==0) continue; // selecting muon and electron pair (OS or SS); int tauIndex = -1; int muonIndex = -1; float isoMuMin = 1e+10; float isoTauMin = 1e+10; float ptMu = 0; float ptTau = 0; // if (muons.size()>1||electrons.size()>1) // std::cout << "muons = " << muons.size() << " taus = " << taus.size() << std::endl; for (unsigned int im=0; im<muons.size(); ++im) { bool isIsoMuon24LegMatch = false; bool isMuonTauMuonLegMatch = false; bool isMuonTauOverlapMuonMatch = false; unsigned int mIndex = muons.at(im); float neutralHadIsoMu = analysisTree.muon_neutralHadIso[mIndex]; float photonIsoMu = analysisTree.muon_photonIso[mIndex]; float chargedHadIsoMu = analysisTree.muon_chargedHadIso[mIndex]; float puIsoMu = analysisTree.muon_puIso[mIndex]; if (isIsoR03) { neutralHadIsoMu = analysisTree.muon_r03_sumNeutralHadronEt[mIndex]; photonIsoMu = analysisTree.muon_r03_sumPhotonEt[mIndex]; chargedHadIsoMu = analysisTree.muon_r03_sumChargedHadronPt[mIndex]; puIsoMu = analysisTree.muon_r03_sumPUPt[mIndex]; } float neutralIsoMu = neutralHadIsoMu + photonIsoMu - 0.5*puIsoMu; neutralIsoMu = TMath::Max(float(0),neutralIsoMu); float absIsoMu = chargedHadIsoMu + neutralIsoMu; float relIsoMu = absIsoMu/analysisTree.muon_pt[mIndex]; for (unsigned int iT=0; iT<analysisTree.trigobject_count; ++iT) { if (analysisTree.trigobject_filters[iT][nIsoMuon24Leg]&&analysisTree.muon_pt[mIndex]>ptMuonHighCut) { // IsoMu24 Leg float dRtrig = deltaR(analysisTree.muon_eta[mIndex],analysisTree.muon_phi[mIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig<deltaRTrigMatch) { isIsoMuon24LegMatch = true; } } if (analysisTree.trigobject_filters[iT][nMuonTauMuonLeg]) { // MuonTau Muon Leg float dRtrig = deltaR(analysisTree.muon_eta[mIndex],analysisTree.muon_phi[mIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig<deltaRTrigMatch) { isMuonTauMuonLegMatch = true; } } if (analysisTree.trigobject_filters[iT][nMuonTauOverlap]&&analysisTree.trigobject_isMuon[iT]) { // MuonTau Overlap Muon float dRtrig = deltaR(analysisTree.muon_eta[mIndex],analysisTree.muon_phi[mIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig<deltaRTrigMatch) { isMuonTauOverlapMuonMatch = true; } } } for (unsigned int it=0; it<taus.size(); ++it) { unsigned int tIndex = taus.at(it); float dR = deltaR(analysisTree.tau_eta[tIndex],analysisTree.tau_phi[tIndex], analysisTree.muon_eta[mIndex],analysisTree.muon_phi[mIndex]); if (dR<dRleptonsCut) continue; bool isMuonTauOverlapTauMatch = false; bool isMuonTauTauLegMatch = false; for (unsigned int iT=0; iT<analysisTree.trigobject_count; ++iT) { if (analysisTree.trigobject_filters[iT][nMuonTauOverlap]&&analysisTree.trigobject_isTau[iT]) { // MuonTau Overlap Tau float dRtrig = deltaR(analysisTree.tau_eta[tIndex],analysisTree.tau_phi[tIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig<deltaRTrigMatch) { isMuonTauOverlapTauMatch = true; } } if (analysisTree.trigobject_filters[iT][nMuonTauTauLeg]) { // MuonTau Tau Leg float dRtrig = deltaR(analysisTree.tau_eta[tIndex],analysisTree.tau_phi[tIndex], analysisTree.trigobject_eta[iT],analysisTree.trigobject_phi[iT]); if (dRtrig<deltaRTrigMatch) { isMuonTauTauLegMatch = true; } } } bool trigMatch = (isIsoMuon24LegMatch) || (isMuonTauOverlapMuonMatch&&isMuonTauMuonLegMatch&&isMuonTauOverlapTauMatch&&isMuonTauTauLegMatch); // std::cout << "Trigger match = " << trigMatch << std::endl; if (applyTriggerMatch && !trigMatch) continue; // bool isKinematicMatch = false; // if (isMu23&&isEle12) { // if (analysisTree.muon_pt[mIndex]>ptMuonHighCut&&analysisTree.electron_pt[eIndex]>ptElectronLowCut) // isKinematicMatch = true; // } // if (isMu8&&isEle23) { // if (analysisTree.muon_pt[mIndex]>ptMuonLowCut&&analysisTree.electron_pt[eIndex]>ptElectronHighCut) // isKinematicMatch = true; // } // if (!isKinematicMatch) continue; float isoTau = analysisTree.tau_byCombinedIsolationDeltaBetaCorrRaw3Hits[tIndex]; if (int(mIndex)!=muonIndex) { if (relIsoMu==isoMuMin) { if (analysisTree.muon_pt[mIndex]>ptMu) { isoMuMin = relIsoMu; ptMu = analysisTree.muon_pt[mIndex]; muonIndex = int(mIndex); isoTauMin = isoTau; ptTau = analysisTree.tau_pt[tIndex]; tauIndex = int(tIndex); } } else if (relIsoMu<isoMuMin) { isoMuMin = relIsoMu; ptMu = analysisTree.muon_pt[mIndex]; muonIndex = int(mIndex); isoTauMin = isoTau; ptTau = analysisTree.tau_pt[tIndex]; tauIndex = int(tIndex); } } else { if (isoTau==isoTauMin) { if (analysisTree.tau_pt[tIndex]>ptTau) { ptTau = analysisTree.tau_pt[tIndex]; isoTauMin = isoTau; tauIndex = int(tIndex); } } else if (isoTau<isoTauMin) { ptTau = analysisTree.tau_pt[tIndex]; isoTauMin = isoTau; tauIndex = int(tIndex); } } } } // std::cout << "mIndex = " << muonIndex << " eIndex = " << electronIndex << std::endl; if (tauIndex<0) continue; if (muonIndex<0) continue; // std::cout << "OK " << std::endl; // std::cout << std::endl; os = (analysisTree.muon_charge[muonIndex]*analysisTree.tau_charge[tauIndex]) < 0; //dilepton veto vector<int> dilepveto_muons; dilepveto_muons.clear(); for (unsigned int im = 0; im<analysisTree.muon_count; ++im) { if (analysisTree.muon_pt[im]<=ptDilepVeto) continue; if (fabs(analysisTree.muon_eta[im])>=etaDilepVeto) continue; if (fabs(analysisTree.muon_dxy[im])>=dxyDilepVeto) continue; if (fabs(analysisTree.muon_dz[im])>=dzDilepVeto) continue; if (!analysisTree.muon_isGlobal[im]) continue; if (!analysisTree.muon_isTracker[im]) continue; if (!analysisTree.muon_isPF[im]) continue; float neutralHadIsoMu = analysisTree.muon_neutralHadIso[im]; float photonIsoMu = analysisTree.muon_photonIso[im]; float chargedHadIsoMu = analysisTree.muon_chargedHadIso[im]; float puIsoMu = analysisTree.muon_puIso[im]; if (isIsoR03) { neutralHadIsoMu = analysisTree.muon_r03_sumNeutralHadronEt[im]; photonIsoMu = analysisTree.muon_r03_sumPhotonEt[im]; chargedHadIsoMu = analysisTree.muon_r03_sumChargedHadronPt[im]; puIsoMu = analysisTree.muon_r03_sumPUPt[im]; } float neutralIsoMu = neutralHadIsoMu + photonIsoMu - 0.5*puIsoMu; neutralIsoMu = TMath::Max(float(0),neutralIsoMu); float absIsoMu = chargedHadIsoMu + neutralIsoMu; float relIsoMu = absIsoMu/analysisTree.muon_pt[im]; if (relIsoMu>=isoDilepVeto) continue; dilepveto_muons.push_back(im); } bool foundDilep = false; for (unsigned int im = 0; im<dilepveto_muons.size(); ++im) { for (unsigned int jm = im; jm<dilepveto_muons.size(); ++jm) { Float_t dR_dilep = deltaR(analysisTree.muon_eta[dilepveto_muons.at(im)], analysisTree.muon_eta[dilepveto_muons.at(im)], analysisTree.muon_eta[dilepveto_muons.at(jm)], analysisTree.muon_eta[dilepveto_muons.at(jm)]); if (dR_dilep > dRDilepVeto) foundDilep = true; } } // looking for extra electron bool foundExtraElectron = false; for (unsigned int ie = 0; ie<analysisTree.electron_count; ++ie) { if (analysisTree.electron_pt[ie]<=ptVetoElectronCut) continue; if (fabs(analysisTree.electron_eta[ie])>=etaVetoElectronCut) continue; if (fabs(analysisTree.electron_dxy[ie])>=dxyVetoElectronCut) continue; if (fabs(analysisTree.electron_dz[ie])>=dzVetoElectronCut) continue; bool electronMvaId = electronMvaIdWP90(analysisTree.electron_pt[ie], analysisTree.electron_superclusterEta[ie], analysisTree.electron_mva_id_nontrigPhys14[ie]); electronMvaId = analysisTree.electron_mva_tightId_nontrig_Spring15_v1[ie]; if (!electronMvaId&&applyVetoElectronId) continue; if (!analysisTree.electron_pass_conversion[ie]&&applyVetoElectronId) continue; if (analysisTree.electron_nmissinginnerhits[ie]>1&&applyVetoElectronId) continue; float neutralHadIsoEle = analysisTree.electron_neutralHadIso[ie]; float photonIsoEle = analysisTree.electron_photonIso[ie]; float chargedHadIsoEle = analysisTree.electron_chargedHadIso[ie]; float puIsoEle = analysisTree.electron_puIso[ie]; if (isIsoR03) { neutralHadIsoEle = analysisTree.electron_r03_sumNeutralHadronEt[ie]; photonIsoEle = analysisTree.electron_r03_sumPhotonEt[ie]; chargedHadIsoEle = analysisTree.electron_r03_sumChargedHadronPt[ie]; puIsoEle = analysisTree.electron_r03_sumPUPt[ie]; } float neutralIsoEle = neutralHadIsoEle + photonIsoEle - 0.5*puIsoEle; neutralIsoEle = TMath::Max(float(0),neutralIsoEle); float absIsoEle = chargedHadIsoEle + neutralIsoEle; float relIsoEle = absIsoEle/analysisTree.electron_pt[ie]; if (relIsoEle>=isoVetoElectronCut) continue; foundExtraElectron = true; } // looking for extra muon bool foundExtraMuon = false; for (unsigned int im = 0; im<analysisTree.muon_count; ++im) { if (int(im)==muonIndex) continue; if (analysisTree.muon_pt[im]<=ptVetoMuonCut) continue; if (fabs(analysisTree.muon_eta[im])>=etaVetoMuonCut) continue; if (fabs(analysisTree.muon_dxy[im])>=dxyVetoMuonCut) continue; if (fabs(analysisTree.muon_dz[im])>=dzVetoMuonCut) continue; if (applyVetoMuonId && !analysisTree.muon_isMedium[im]) continue; float neutralHadIsoMu = analysisTree.muon_neutralHadIso[im]; float photonIsoMu = analysisTree.muon_photonIso[im]; float chargedHadIsoMu = analysisTree.muon_chargedHadIso[im]; float puIsoMu = analysisTree.muon_puIso[im]; if (isIsoR03) { neutralHadIsoMu = analysisTree.muon_r03_sumNeutralHadronEt[im]; photonIsoMu = analysisTree.muon_r03_sumPhotonEt[im]; chargedHadIsoMu = analysisTree.muon_r03_sumChargedHadronPt[im]; puIsoMu = analysisTree.muon_r03_sumPUPt[im]; } float neutralIsoMu = neutralHadIsoMu + photonIsoMu - 0.5*puIsoMu; neutralIsoMu = TMath::Max(float(0),neutralIsoMu); float absIsoMu = chargedHadIsoMu + neutralIsoMu; float relIsoMu = absIsoMu/analysisTree.muon_pt[im]; if (relIsoMu>isoVetoMuonCut) continue; foundExtraMuon = true; } dilepton_veto = foundDilep; extraelec_veto = foundExtraElectron; extramuon_veto = foundExtraMuon; // met met = TMath::Sqrt(analysisTree.pfmet_ex*analysisTree.pfmet_ex + analysisTree.pfmet_ey*analysisTree.pfmet_ey); metphi = TMath::ATan2(analysisTree.pfmet_ey,analysisTree.pfmet_ex); metcov00 = analysisTree.pfmet_sigxx; metcov01 = analysisTree.pfmet_sigxy; metcov10 = analysisTree.pfmet_sigyx; metcov11 = analysisTree.pfmet_sigyy; // filling muon variables pt_1 = analysisTree.muon_pt[muonIndex]; eta_1 = analysisTree.muon_eta[muonIndex]; phi_1 = analysisTree.muon_phi[muonIndex]; q_1 = -1; if (analysisTree.muon_charge[muonIndex]>0) q_1 = 1; mva_1 = -9999; d0_1 = analysisTree.muon_dxy[muonIndex]; dZ_1 = analysisTree.muon_dz[muonIndex]; iso_1 = isoMuMin; m_1 = muonMass; float dPhiMETMuon = dPhiFrom2P(analysisTree.muon_px[muonIndex],analysisTree.muon_py[muonIndex], analysisTree.pfmet_ex,analysisTree.pfmet_ey); mt_1 = TMath::Sqrt(2*met*analysisTree.muon_pt[muonIndex]*(1-TMath::Cos(dPhiMETMuon))); // filling tau variables pt_2 = analysisTree.tau_pt[tauIndex]; eta_2 = analysisTree.tau_eta[tauIndex]; phi_2 = analysisTree.tau_phi[tauIndex]; q_2 = -1; if (analysisTree.tau_charge[tauIndex]>0) q_2 = 1; mva_2 = -9999; d0_2 = analysisTree.tau_leadchargedhadrcand_dxy[tauIndex]; dZ_2 = analysisTree.tau_leadchargedhadrcand_dz[tauIndex]; iso_2 = isoTauMin; m_2 = analysisTree.tau_mass[tauIndex]; float dPhiMETTau = dPhiFrom2P(analysisTree.tau_px[tauIndex],analysisTree.tau_py[tauIndex], analysisTree.pfmet_ex,analysisTree.pfmet_ey); mt_2 = TMath::Sqrt(2*met*analysisTree.tau_pt[tauIndex]*(1-TMath::Cos(dPhiMETTau))); byCombinedIsolationDeltaBetaCorrRaw3Hits_2 = analysisTree.tau_byCombinedIsolationDeltaBetaCorrRaw3Hits[tauIndex]; againstElectronLooseMVA5_2 = analysisTree.tau_againstElectronLooseMVA5[tauIndex]; againstElectronMediumMVA5_2 = analysisTree.tau_againstElectronMediumMVA5[tauIndex]; againstElectronTightMVA5_2 = analysisTree.tau_againstElectronTightMVA5[tauIndex]; againstElectronVLooseMVA5_2 = analysisTree.tau_againstElectronVLooseMVA5[tauIndex]; againstElectronVTightMVA5_2 = analysisTree.tau_againstElectronVTightMVA5[tauIndex]; againstMuonLoose3_2 = analysisTree.tau_againstMuonLoose3[tauIndex]; againstMuonTight3_2 = analysisTree.tau_againstMuonTight3[tauIndex]; TLorentzVector muonLV; muonLV.SetXYZM(analysisTree.muon_px[muonIndex], analysisTree.muon_py[muonIndex], analysisTree.muon_pz[muonIndex], muonMass); TLorentzVector tauLV; tauLV.SetXYZT(analysisTree.tau_px[tauIndex], analysisTree.tau_py[tauIndex], analysisTree.tau_pz[tauIndex], analysisTree.tau_e[tauIndex]); TLorentzVector metLV; metLV.SetXYZT(analysisTree.pfmet_ex, analysisTree.pfmet_ey, 0, TMath::Sqrt(analysisTree.pfmet_ex*analysisTree.pfmet_ex + analysisTree.pfmet_ey*analysisTree.pfmet_ey)); TLorentzVector dileptonLV = muonLV + tauLV; // visible mass m_vis = dileptonLV.M(); // visible ditau pt pt_tt = (dileptonLV+metLV).Pt(); // bisector of electron and muon transverse momenta float tauUnitX = tauLV.Px()/tauLV.Pt(); float tauUnitY = tauLV.Py()/tauLV.Pt(); float muonUnitX = muonLV.Px()/muonLV.Pt(); float muonUnitY = muonLV.Py()/muonLV.Pt(); float zetaX = tauUnitX + muonUnitX; float zetaY = tauUnitY + muonUnitY; float normZeta = TMath::Sqrt(zetaX*zetaX+zetaY*zetaY); zetaX = zetaX/normZeta; zetaY = zetaY/normZeta; // choosing mva met unsigned int iMet = 0; for (; iMet<analysisTree.mvamet_count; ++iMet) { if (analysisTree.mvamet_channel[iMet]==3){ if(analysisTree.mvamet_lep1[iMet]==tauIndex && analysisTree.mvamet_lep2[iMet]==muonIndex) break; } } float mvamet_x = 0; float mvamet_y = 0; mvacov00 = 0.; mvacov01 = 0.; mvacov10 = 0.; mvacov11 = 0.; if(iMet < analysisTree.mvamet_count){ mvamet_x = analysisTree.mvamet_ex[iMet]; mvamet_y = analysisTree.mvamet_ey[iMet]; mvacov00 = analysisTree.mvamet_sigxx[iMet]; mvacov01 = analysisTree.mvamet_sigxy[iMet]; mvacov10 = analysisTree.mvamet_sigyx[iMet]; mvacov11 = analysisTree.mvamet_sigyy[iMet]; } float mvamet_x2 = mvamet_x * mvamet_x; float mvamet_y2 = mvamet_y * mvamet_y; mvamet = TMath::Sqrt(mvamet_x2+mvamet_y2); mvametphi = TMath::ATan2(mvamet_y,mvamet_x); float vectorX = analysisTree.pfmet_ex + muonLV.Px() + tauLV.Px(); float vectorY = analysisTree.pfmet_ey + muonLV.Py() + tauLV.Py(); float vectorVisX = muonLV.Px() + tauLV.Px(); float vectorVisY = muonLV.Py() + tauLV.Py(); // computation of DZeta variable pzetamiss = analysisTree.pfmet_ex*zetaX + analysisTree.pfmet_ey*zetaY; pzetavis = vectorVisX*zetaX + vectorVisY*zetaY; // counting jets vector<unsigned int> jets; jets.clear(); vector<unsigned int> jetspt20; jetspt20.clear(); vector<unsigned int> bjets; bjets.clear(); int indexLeadingJet = -1; float ptLeadingJet = -1; int indexSubLeadingJet = -1; float ptSubLeadingJet = -1; int indexLeadingBJet = -1; float ptLeadingBJet = -1; for (unsigned int jet=0; jet<analysisTree.pfjet_count; ++jet) { float absJetEta = fabs(analysisTree.pfjet_eta[jet]); if (absJetEta>=jetEtaCut) continue; float jetPt = analysisTree.pfjet_pt[jet]; if (jetPt<=jetPtLowCut) continue; float dR1 = deltaR(analysisTree.pfjet_eta[jet],analysisTree.pfjet_phi[jet], eta_1,phi_1); if (dR1<=dRJetLeptonCut) continue; float dR2 = deltaR(analysisTree.pfjet_eta[jet],analysisTree.pfjet_phi[jet], eta_2,phi_2); if (dR2<=dRJetLeptonCut) continue; // jetId float energy = analysisTree.pfjet_e[jet]; energy *= analysisTree.pfjet_jecfactor[jet]; float chf = analysisTree.pfjet_chargedhadronicenergy[jet]/energy; float nhf = analysisTree.pfjet_neutralhadronicenergy[jet]/energy; float phf = analysisTree.pfjet_neutralemenergy[jet]/energy; float elf = analysisTree.pfjet_chargedemenergy[jet]/energy; float muf = analysisTree.pfjet_muonenergy[jet]/energy; float chm = analysisTree.pfjet_chargedmulti[jet]; float nm = analysisTree.pfjet_neutralmulti[jet]; float npr = analysisTree.pfjet_chargedmulti[jet] + analysisTree.pfjet_neutralmulti[jet]; //bool isPFJetId = (npr>1 && phf<0.99 && nhf<0.99) && (absJetEta>3.0 || (elf<0.99 && chf>0 && chm>0)); bool isPFJetId = false; if (absJetEta<=3.0) isPFJetId = (nhf < 0.99 && phf < 0.99 && npr > 1) && (absJetEta>2.4 || (chf>0 && chm > 0 && elf < 0.99)); else isPFJetId = phf < 0.9 && nm > 10; //isPFJetId = (npr>1 && phf<0.99 && nhf<0.99 && muf < 0.8) && (absJetEta>3.0 || (elf<0.99 && chf>0 && chm>0)); //isPFJetId = (npr>1 && phf<0.99 && nhf<0.99) && (absJetEta>3.0 || (elf<0.99 && chf>0 && chm>0)); if (!isPFJetId) continue; jetspt20.push_back(jet); if (absJetEta<bJetEtaCut && analysisTree.pfjet_btag[jet][6]>btagCut) { // b-jet bjets.push_back(jet); if (jetPt>ptLeadingBJet) { ptLeadingBJet = jetPt; indexLeadingBJet = jet; } } if (indexLeadingJet>=0) { if (jetPt<ptLeadingJet&&jetPt>ptSubLeadingJet) { indexSubLeadingJet = jet; ptSubLeadingJet = jetPt; } } if (jetPt>ptLeadingJet) { indexLeadingJet = jet; ptLeadingJet = jetPt; } if (jetPt<jetPtHighCut) continue; jets.push_back(jet); } njets = jets.size(); njetspt20 = jetspt20.size(); nbtag = bjets.size(); bpt = -9999; beta = -9999; bphi = -9999; if (indexLeadingBJet>=0) { bpt = analysisTree.pfjet_pt[indexLeadingBJet]; beta = analysisTree.pfjet_eta[indexLeadingBJet]; bphi = analysisTree.pfjet_phi[indexLeadingBJet]; } jpt_1 = -9999; jeta_1 = -9999; jphi_1 = -9999; jptraw_1 = -9999; jptunc_1 = -9999; jmva_1 = -9999; jlrm_1 = -9999; jctm_1 = -9999; if (indexLeadingJet>=0&&indexSubLeadingJet>=0&&indexLeadingJet==indexSubLeadingJet) cout << "warning : indexLeadingJet ==indexSubLeadingJet = " << indexSubLeadingJet << endl; if (indexLeadingJet>=0) { jpt_1 = analysisTree.pfjet_pt[indexLeadingJet]; jeta_1 = analysisTree.pfjet_eta[indexLeadingJet]; jphi_1 = analysisTree.pfjet_phi[indexLeadingJet]; jptraw_1 = analysisTree.pfjet_pt[indexLeadingJet]*analysisTree.pfjet_energycorr[indexLeadingJet]; jmva_1 = analysisTree.pfjet_pu_jet_full_mva[indexLeadingJet]; } jpt_2 = -9999; jeta_2 = -9999; jphi_2 = -9999; jptraw_2 = -9999; jptunc_2 = -9999; jmva_2 = -9999; jlrm_2 = -9999; jctm_2 = -9999; if (indexSubLeadingJet>=0) { jpt_2 = analysisTree.pfjet_pt[indexSubLeadingJet]; jeta_2 = analysisTree.pfjet_eta[indexSubLeadingJet]; jphi_2 = analysisTree.pfjet_phi[indexSubLeadingJet]; jptraw_2 = analysisTree.pfjet_pt[indexSubLeadingJet]*analysisTree.pfjet_energycorr[indexSubLeadingJet]; jmva_2 = analysisTree.pfjet_pu_jet_full_mva[indexSubLeadingJet]; } mjj = -9999; jdeta = -9999; njetingap =-1; if (indexLeadingJet>=0 && indexSubLeadingJet>=0) { njetingap = 0; TLorentzVector jet1; jet1.SetPxPyPzE(analysisTree.pfjet_px[indexLeadingJet], analysisTree.pfjet_py[indexLeadingJet], analysisTree.pfjet_pz[indexLeadingJet], analysisTree.pfjet_e[indexLeadingJet]); TLorentzVector jet2; jet2.SetPxPyPzE(analysisTree.pfjet_px[indexSubLeadingJet], analysisTree.pfjet_py[indexSubLeadingJet], analysisTree.pfjet_pz[indexSubLeadingJet], analysisTree.pfjet_e[indexSubLeadingJet]); mjj = (jet1+jet2).M(); jdeta = abs(analysisTree.pfjet_eta[indexLeadingJet]- analysisTree.pfjet_eta[indexSubLeadingJet]); float etamax = analysisTree.pfjet_eta[indexLeadingJet]; float etamin = analysisTree.pfjet_eta[indexSubLeadingJet]; if (etamax<etamin) { float tmp = etamax; etamax = etamin; etamin = tmp; } for (unsigned int jet=0; jet<jets.size(); ++jet) { int index = jets.at(jet); float etaX = analysisTree.pfjet_eta[index]; if (index!=indexLeadingJet&&index!=indexSubLeadingJet&&etaX>etamin&&etaX<etamax) njetingap++; } } tree->Fill(); selEvents++; } // end of file processing (loop over events in one file) nFiles++; delete _tree; file_->Close(); delete file_; } std::cout << std::endl; int allEvents = int(inputEventsH->GetEntries()); std::cout << "Total number of input events = " << allEvents << std::endl; std::cout << "Total number of events in Tree = " << nEvents << std::endl; std::cout << "Total number of selected events = " << selEvents << std::endl; std::cout << std::endl; file->cd(""); file->Write(); file->Close(); delete file; }
void asym2_halfday(const int Trig = 0, const int NBins = 5, const int Roadset = 67, const int Seed = 0, const int SaveOn = 0) { //gROOT -> ProcessLine ("~/root/init.C"); gROOT -> ProcessLine (".L ./my_root_functions.C"); gROOT -> ProcessLine (".L ./asym_funcs.C"); gROOT -> ProcessLine (".L ./fit_funcs.C"); gROOT -> SetStyle("Plain"); gStyle -> SetPalette (1); //gStyle -> SetOptTitle(0); gStyle -> SetOptStat(0); gStyle -> SetOptFit(1); gStyle -> SetCanvasColor(0); Float_t PI = 3.141592654; //File input/output names char inName[64]; char outName[64]; char inArm[5]; char inTrig[5]; char inBeam[7]; char inPol[5]; if(Trig == 0) sprintf (inTrig, "Real"); //else if(Trig == 2) sprintf (inTrig, "Sim"); //Beam polarization Double_t targetPol = 1.0; Double_t targetPolError = 0.02; char Beam[6]; char Poldir[5]; char LRdir[6]; TRandom *TRand = new TRandom3(0); TRand -> SetSeed(Seed); //ok, lets make our histograms! const Int_t nbins = NBins;//2 for mb, 4 for trig Float_t binjump = 3.5; if(nbins == 1) binjump = 4.5; Int_t mbins = 140; Double_t mmin = 0.; Double_t mmax = 14; const Int_t phibins = 12; const Int_t cosbins = 32; Double_t phimin = -PI; Double_t phimax = +PI; char Hname[128]; //Yield histograms TH2F *Yield[2][nbins][2]; // [target][xf][pol] TH2F *Yieldmix[2][nbins]; TH2F *Yield2[2][nbins][2]; // [target][xf][pol] TH2F *Yieldmix2[2][nbins]; TH2F *Yield3[2][nbins]; // [target][xf] TH2F *Yieldmix3[2][nbins]; TH1D *Hmass[2][nbins]; for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++){ for (int j = 0; j < 2; j++){ sprintf (Hname, "Yield_target%d_xf%d_p%d", a, k, j); Yield[a][k][j] = new TH2F (Hname, Hname, mbins, mmin, mmax, phibins, phimin, phimax); sprintf (Hname, "Yield2_target%d_xf%d_p%d", a, k, j); Yield2[a][k][j] = new TH2F (Hname, Hname, mbins, mmin, mmax, 2, phimin, phimax); } sprintf (Hname, "Yield3_target%d_xf%d", a, k); Yield3[a][k] = new TH2F (Hname, Hname, mbins, mmin, mmax, cosbins, phimin, phimax); sprintf (Hname, "Hmass_target%d_xf%d", a, k); Hmass[a][k] = new TH1D (Hname, Hname, mbins, mmin, mmax); } //mixed event subtraction histograms TH1D *tmass; TH1D *tmass2; TH1D *tmass3; TH1D *hmass[phibins][2]; TH1D *hmass2[2][2]; TH1D *hmass3; //mean xf, pt, eta histos TH2F *yxfmass = new TH2F ("yxfmass", "yxfmass", 100, 0., 1., 100, 0., 10. ); TH2F *yxfmass3 = new TH2F ("yxfmass3", "yxfmass3", 100, 0., 1., 100, 0., 10. ); TH1F *yeta = new TH1F ("yeta", "yeta", 300, 2.0, 5.0 ); TH3F *yxfmasspt = new TH3F ("yxfmasspt", "yxfmasspt", 100, 0., 1., 100, 0., 10., 500, 0., 5. ); TH3F *yxfmasspt3 = new TH3F ("yxfmasspt3", "yxfmasspt3", 100, 0., 1., 100, 0., 10., 500, 0., 5. ); TH3F *yxfmasseta = new TH3F ("yxfmasseta", "yxfmasseta", 100, 0., 1., 100, 0., 10., 300, 2., 5. ); TH3F *yxfmasseta3 = new TH3F ("yxfmasseta3", "yxfmasseta3", 100, 0., 1., 100, 0., 10., 300, 2., 5. ); TH1F *xf_mean = new TH1F("xf_mean","xf_mean",10, 0., 1.); TH1F *pt_mean = new TH1F("pt_mean","pt_mean",10, 0., 1.); TH1F *eta_mean = new TH1F("eta_mean","eta_mean",10, 0., 1.); TH1D *txf3; TH1D *tpt3; TH1D *teta3; for (int p = 0; p < phibins; p++) for (int j = 0; j < 2; j++){ sprintf (Hname, "mass_%d_%d", p, j); hmass[p][j] = new TH1D (Hname, Hname, mbins, mmin, mmax); hmass[p][j] -> GetXaxis() -> SetTitle ("m_{#gamma#gamma} (GeV/c^{2})"); hmass[p][j] -> SetLineColor (1); hmass[p][j] -> Sumw2(); } for (int p = 0; p < 2; p++) for (int j = 0; j < 2; j++){ sprintf (Hname, "mass2_%d_%d", p, j); hmass2[p][j] = new TH1D (Hname, Hname, mbins, mmin, mmax); hmass2[p][j] -> GetXaxis() -> SetTitle ("m_{#gamma#gamma} (GeV/c^{2})"); hmass2[p][j] -> SetLineColor (1); hmass2[p][j] -> Sumw2(); } sprintf (Hname, "mass3"); hmass3 = new TH1D (Hname, Hname, mbins, mmin, mmax); hmass3 -> GetXaxis() -> SetTitle ("m_{#gamma#gamma} (GeV/c^{2})"); hmass3 -> SetLineColor (1); hmass3 -> Sumw2(); //phi histograms to grab mass projections in eta range! TH1D *hphi_sub[2][nbins][2]; TH1D *hphi_sub2[2][nbins][2]; TH1D *hphi_raw3[2][nbins]; TH1D *hphi_sub3[2][nbins]; // tmp histograms to get the y-projections of the Yield[k] [j] around the pi0 mass TH1D *tphi = new TH1D ("tphi", "tphi", phibins, phimin, phimax); tphi -> Sumw2(); TH1D *tphi2 = new TH1D ("tphi2", "tphi2", 2, phimin, phimax); tphi2 -> Sumw2(); TH1D *tphi3 = new TH1D ("tphi3", "tphi3", cosbins, phimin, phimax); tphi3 -> Sumw2(); TH1D *mphi3 = new TH1D ("mphi3", "mphi3", cosbins, phimin, phimax); mphi3 -> Sumw2(); for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++){ sprintf (Hname, "phi_raw3_%d_%d", a, k); hphi_raw3[a][k] = new TH1D (Hname, Hname, cosbins, phimin, phimax); hphi_raw3[a][k] -> SetLineColor (k + 1); hphi_raw3[a][k] -> Sumw2(); sprintf (Hname, "phi_sub3_%d_%d", a, k); hphi_sub3[a][k] = new TH1D (Hname, Hname, cosbins, phimin, phimax); hphi_sub3[a][k] -> SetLineColor (k + 1); hphi_sub3[a][k] -> Sumw2(); for (int j = 0; j < 2; j++){ sprintf (Hname, "phi_sub_%d_%d_%d", a, k, j); hphi_sub[a][k][j] = new TH1D (Hname, Hname, phibins, phimin, phimax); hphi_sub[a][k][j] -> SetLineColor (2 * j + 1); hphi_sub[a][k][j] -> Sumw2(); sprintf (Hname, "phi_sub2_%d_%d_%d", a, k, j); hphi_sub2[a][k][j] = new TH1D (Hname, Hname, 2, phimin, phimax); hphi_sub2[a][k][j] -> SetLineColor (2 * j + 1); hphi_sub2[a][k][j] -> Sumw2(); } } // Phi distributions for different polarizations!! TH1D *yphi[2][nbins][2]; //[target][xf][pol] TH1D *yphi2[2][nbins][2]; TH1D *yphi3[2][nbins]; for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++){ sprintf (Hname, "yphi3_target%d_xf%d", a, k); yphi3[a][k] = new TH1D (Hname, Hname, cosbins, phimin, phimax); yphi3[a][k] -> SetLineColor (k + 1); yphi3[a][k] -> Sumw2(); for (int d = 0; d < 2; d++) { // down-up sprintf (Hname, "yphi_target%d_xf%d_%d", a, k, d); yphi[a][k][d] = new TH1D (Hname, Hname, phibins, phimin, phimax); yphi[a][k][d] -> SetLineColor (d + 1); yphi[a][k][d] -> Sumw2(); sprintf (Hname, "yphi2_target%d_xf%d_%d", a, k, d); yphi2[a][k][d] = new TH1D (Hname, Hname, 2, phimin, phimax); yphi2[a][k][d] -> SetLineColor (d + 1); yphi2[a][k][d] -> Sumw2(); } } // --------------------------------------------------------------------- // Polarization asymmetries [target][xf] TH1D *asymP[2][nbins]; TH1D *asymP2[2][nbins]; for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++) { sprintf (Hname, "asymPol_target%d_xf%d", a, k); asymP[a][k] = new TH1D (Hname, Hname, phibins, phimin, phimax); // full detector asymP[a][k] -> GetXaxis() -> SetTitle ("#varphi (rad)"); asymP[a][k] -> GetYaxis() -> SetTitle ("#epsilon_{pol}"); asymP[a][k] -> SetMarkerStyle (21); sprintf (Hname, "asymPol3_target%d_xf%d", a, k); asymP2[a][k] = new TH1D (Hname, Hname, 1, 0, 1); // only one bin asymP2[a][k] -> GetXaxis() -> SetTitle ("#varphi (rad)"); asymP2[a][k] -> GetYaxis() -> SetTitle ("#epsilon_{pol}"); asymP2[a][k] -> SetMarkerStyle (21); } TH1D *asymF[2][nbins]; // polarization asymmetries, cleaned from rel.lumi. (fit) !!! for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++) { sprintf (Hname, "asymPol2_target%d_xf%d", a, k); asymF[a][k] = new TH1D (Hname, Hname, phibins, phimin, phimax); // full detector asymF[a][k] -> GetXaxis() -> SetTitle ("#varphi (rad)"); asymF[a][k] -> GetYaxis() -> SetTitle ("#epsilon_{pol}"); asymF[a][k] -> SetMarkerStyle (21); } // --------------------------------------------------------- // left right asymmetries !!! TH1D *asymL[2][nbins]; // [target][xf] for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++) { sprintf (Hname, "asymSide_target%d_xf%d", a, k); asymL[a][k] = new TH1D (Hname, Hname, phibins, phimin, phimax); // full detector asymL[a][k] -> GetXaxis() -> SetTitle ("#varphi (rad)"); asymL[a][k] -> SetMarkerStyle (21); } // --------------------------------------------------------- // Square root asymmetries !!! TH1D *asymS[2][nbins]; // [target][xf] TH1D *asymS2[2][nbins]; // [target][xf] TH1F *anval1[2][nbins]; TH1F *anval5[2][nbins]; for (int a = 0; a < 2; a++) for (int k = 0; k < nbins; k++) { sprintf (Hname, "asymSqrt_target%d_xf%d", a, k); asymS[a][k] = new TH1D (Hname, Hname, phibins /2, phimin, 0); // only left side asymS[a][k] -> GetXaxis() -> SetTitle ("#varphi (rad)"); asymS[a][k] -> GetYaxis() -> SetTitle ("#epsilon_{sqrt}"); asymS[a][k] -> SetMarkerStyle (21); sprintf (Hname, "asymSqrt2_target%d_xf%d", a, k); asymS2[a][k] = new TH1D (Hname, Hname, phibins / 2, phimin, 0); // only left side asymS2[a][k] -> GetXaxis() -> SetTitle ("#varphi (rad)"); asymS2[a][k] -> GetYaxis() -> SetTitle ("#epsilon_{sqrt}"); asymS2[a][k] -> SetMarkerStyle (21); sprintf(Hname, "anval5_target%d_xf%d", a, k); anval5[a][k] = new TH1F(Hname, Hname, 200, -1, 1); anval5[a][k] -> GetXaxis() -> SetTitle ("Counts"); anval5[a][k] -> GetYaxis() -> SetTitle ("A_{N}"); sprintf(Hname, "anval1_target%d_xf%d", a, k); anval1[a][k] = new TH1F(Hname, Hname, 200, -1, 1); anval1[a][k] -> GetXaxis() -> SetTitle ("Counts"); anval1[a][k] -> GetYaxis() -> SetTitle ("A_{N}"); } //functions to fit azimuthal asymmetries! TF1 *fitcos = new TF1 ("an_cos", an_cos, -PI, 0., 1); // cosine to sqrt-asymmetry TF1 *fitsin = new TF1 ("an_sin", an_sin, -PI, 0., 2); // sine with phase to saqrt-asym TF1 *fitcosP = new TF1 ("an_cosP", an_cosP, -PI, PI, 2); // cosine with r.l. to P-asymmetry TF1 *fitsinP = new TF1 ("an_sinP", an_sinP, -PI, PI, 3); // sine with phase and r.l. to P-asym TF1 *fitcosF = new TF1 ("an_cosF", an_cos, -PI, PI, 1); // cosine to asymF fitcos -> SetLineColor(2); fitcosF -> SetLineColor(4); double amp_val, amp_err; double phi_val, phi_err; double rel_val, rel_err; double ndf, csq; // Asymmetries as function of xf !!! TH1F *xf_asymfit1[2]; TH1F *xf_asymfit2[2]; TH1F *xf_phi0fit2[2]; TH1F *xf_rellfit3[2]; TH1F *xf_asymfit3[2]; TH1F *xf_rellfit4[2]; TH1F *xf_asymfit4[2]; TH1F *xf_phi0fit4[2]; TH1F *xf_asymfit5[2]; TH1F *fit_rndf1[2]; TH1F *fit_rndf2[2]; TH1F *fit_rndf3[2]; TH1F *fit_rndf4[2]; TH1F *fit_rndf5[2]; TH1F *xf_an5[2]; TH1F *xf_an1[2]; TH1F *xf_an3[2]; TH1F *xf_an6[2]; TH1F *xf_an7[2]; for (int a = 0; a < 2; a++){ sprintf(Hname, "xf_asymfit1_target%d", a); xf_asymfit1[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_asymfit1[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_asymfit1[a] -> GetYaxis() -> SetTitle ("raw asymmetry #epsilon"); SetHistoStyle (xf_asymfit1[a], 20, 2, 1); sprintf(Hname, "xf_asymfit2_target%d", a); xf_asymfit2[a] = new TH1F (Hname, Hname, 10, 0, 1); sprintf(Hname, "xf_phi0fit2_target%d", a); xf_phi0fit2[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_asymfit2[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_asymfit2[a] -> GetYaxis() -> SetTitle ("raw asymmetry #epsilon"); xf_phi0fit2[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_phi0fit2[a] -> GetYaxis() -> SetTitle ("#varphi_{0}"); SetHistoStyle (xf_asymfit2[a], 24, 2, 1); SetHistoStyle (xf_phi0fit2[a], 24, 2, 1); SetHistoAxes (xf_phi0fit2[a], -1, 1, -.5 * PI, 1.5 * PI); sprintf(Hname, "xf_rellfit3_target%d", a); xf_rellfit3[a] = new TH1F (Hname, Hname, 10, 0, 1); sprintf(Hname, "xf_asymfit3_target%d", a); xf_asymfit3[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_rellfit3[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_rellfit3[a] -> GetYaxis() -> SetTitle ("rel.lumi."); xf_asymfit3[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_asymfit3[a] -> GetYaxis() -> SetTitle ("raw asymmetry #epsilon"); SetHistoStyle (xf_rellfit3[a], 21, 8, 1); SetHistoStyle (xf_asymfit3[a], 21, 8, 1); sprintf(Hname, "xf_rellfit4_target%d", a); xf_rellfit4[a] = new TH1F (Hname, Hname, 10, 0, 1); sprintf(Hname, "xf_asymfit4_target%d", a); xf_asymfit4[a] = new TH1F (Hname, Hname, 10, 0, 1); sprintf(Hname, "xf_phi0fit4_target%d", a); xf_phi0fit4[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_rellfit4[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_rellfit4[a] -> GetYaxis() -> SetTitle ("rel.lumi."); xf_asymfit4[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_asymfit4[a] -> GetYaxis() -> SetTitle ("raw asymmetry #epsilon"); xf_phi0fit4[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_phi0fit4[a] -> GetYaxis() -> SetTitle ("#varphi_{0}"); SetHistoStyle (xf_rellfit4[a], 25, 8, 1); SetHistoStyle (xf_asymfit4[a], 25, 8, 1); SetHistoStyle (xf_phi0fit4[a], 24, 8, 1); SetHistoAxes (xf_phi0fit4[a], -1, 1, -.5 * PI, 1.5 * PI); // Yes-yes, this is the final fit: subtract the global rel. luminosity and fit plain cosine !!! sprintf(Hname, "xf_asymfit5_target%d", a); xf_asymfit5[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_asymfit5[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_asymfit5[a] -> GetYaxis() -> SetTitle ("raw asymmetry #epsilon"); SetHistoStyle (xf_asymfit5[a], 21, 4, 1); sprintf(Hname, "fit_rndf1_target%d", a); fit_rndf1[a] = new TH1F (Hname, Hname, 100, 0., 10.); sprintf(Hname, "fit_rndf2_target%d", a); fit_rndf2[a] = new TH1F (Hname, Hname, 100, 0., 10.); sprintf(Hname, "fit_rndf3_target%d", a); fit_rndf3[a] = new TH1F (Hname, Hname, 100, 0., 10.); sprintf(Hname, "fit_rndf4_target%d", a); fit_rndf4[a] = new TH1F (Hname, Hname, 100, 0., 10.); sprintf(Hname, "fit_rndf5_target%d", a); fit_rndf5[a] = new TH1F (Hname, Hname, 100, 0., 10.); fit_rndf1[a] -> GetXaxis() -> SetTitle ("#chi^{2} / (n.d.f. - 1)"); fit_rndf2[a] -> GetXaxis() -> SetTitle ("#chi^{2} / (n.d.f. - 1)"); fit_rndf3[a] -> GetXaxis() -> SetTitle ("#chi^{2} / (n.d.f. - 1)"); fit_rndf4[a] -> GetXaxis() -> SetTitle ("#chi^{2} / (n.d.f. - 1)"); fit_rndf5[a] -> GetXaxis() -> SetTitle ("#chi^{2} / (n.d.f. - 1)"); // And look: then there is the analyzing power !!! sprintf(Hname, "xf_an5_target%d", a); xf_an5[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_an5[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_an5[a] -> GetYaxis() -> SetTitle ("A_{N}"); SetHistoStyle (xf_an5[a], 21, 4, 1); sprintf(Hname, "xf_an1_target%d", a); xf_an1[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_an1[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_an1[a] -> GetYaxis() -> SetTitle ("A_{N}"); SetHistoStyle (xf_an1[a], 21, 2, 1); sprintf(Hname, "xf_an3_target%d", a); xf_an3[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_an3[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_an3[a] -> GetYaxis() -> SetTitle ("A_{N}"); SetHistoStyle (xf_an3[a], 25, 8, 1); sprintf(Hname, "xf_an6_target%d", a); xf_an6[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_an6[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_an6[a] -> GetYaxis() -> SetTitle ("A_{N}"); SetHistoStyle (xf_an6[a], 25, 2, 1); sprintf(Hname, "xf_an7_target%d", a); xf_an7[a] = new TH1F (Hname, Hname, 10, 0, 1); xf_an7[a] -> GetXaxis() -> SetTitle ("x_{F}"); xf_an7[a] -> GetYaxis() -> SetTitle ("A_{N}"); SetHistoStyle (xf_an7[a], 25, 4, 1); } // ============= Let's roll squared: get the data !!! int arm; int pol, polT; Float_t xf; Float_t phi, phi2, phi3; Float_t pt; //initialize kdimuon tree Int_t dimuonID; Int_t runID; Int_t spillID, eventID; Int_t negTrackID, posTrackID; Int_t negHits, posHits; Float_t xF, xT, xB, mass; Float_t dx, dy, dz; Float_t dpx, dpy, dpz; Float_t px1, py1, pz1; Float_t px2, py2, pz2; Float_t trackSeparation, chisq_dimuon; Int_t target, dump; Int_t targetPos; Float_t m3hm, m3hs, m3vm, m3vs; Float_t m2hm, m2hs, m2vm, m2vs; Float_t dhm, dvm; Float_t costh, phi; Float_t eta; TLorentzVector lordm;// = new TLorentzVector; if(Trig == 0) sprintf (inName, "./nDST/Analysis_roadset%d_R005_V001.root", Roadset); //if(Trig == 2) sprintf (inName, "./nDST/Analysis_mc_drellyan_LD2_M013_S001.root"); TFile *inFile1 = new TFile (inName); gROOT -> cd(); // ====================================================== Read the reconstructed cluster pairs !!! TTree *YieldTree = (TTree*) inFile1 -> Get ("kdimuon"); //YieldTree -> SetBranchAddress ("dimuonID", &dimuonID); YieldTree -> SetBranchAddress ("runID", &runID); //YieldTree -> SetBranchAddress ("eventID", &eventID); YieldTree -> SetBranchAddress ("spillID", &spillID); //YieldTree -> SetBranchAddress ("posTrackID", &posTrackID); //YieldTree -> SetBranchAddress ("negTrackID", &negTrackID); //YieldTree -> SetBranchAddress ("posHits", &posHits); //YieldTree -> SetBranchAddress ("negHits", &negHits); //YieldTree -> SetBranchAddress ("dx", &dx); //YieldTree -> SetBranchAddress ("dy", &dy); //YieldTree -> SetBranchAddress ("dz", &dz); YieldTree -> SetBranchAddress ("dpx", &dpx); YieldTree -> SetBranchAddress ("dpy", &dpy); YieldTree -> SetBranchAddress ("dpz", &dpz); YieldTree -> SetBranchAddress ("mass", &mass); YieldTree -> SetBranchAddress ("xF", &xF); //YieldTree -> SetBranchAddress ("xB", &xB); YieldTree -> SetBranchAddress ("xT", &xT); //YieldTree -> SetBranchAddress ("costh", &costh); //YieldTree -> SetBranchAddress ("phi", &phi); //YieldTree -> SetBranchAddress ("trackSeparation", &trackSeparation); //YieldTree -> SetBranchAddress ("chisq_dimuon", &chisq_dimuon); //YieldTree -> SetBranchAddress ("px1", &px1); //YieldTree -> SetBranchAddress ("py1", &py1); //YieldTree -> SetBranchAddress ("pz1", &pz1); //YieldTree -> SetBranchAddress ("px2", &px2); //YieldTree -> SetBranchAddress ("py2", &py2); //YieldTree -> SetBranchAddress ("pz2", &pz2); YieldTree -> SetBranchAddress ("target", &target); YieldTree -> SetBranchAddress ("dump", &dump); //YieldTree -> SetBranchAddress ("targetPos", &targetPos); //here's the for loop int nentries = YieldTree -> GetEntries(); int spillID0; int daycount = 0; int DspillID; cout << "Number of entries: " << nentries << endl; for (int i = 0; i < nentries; i++) { //for (int i = 0; i < 10000; i++) { YieldTree -> GetEntry (i); if(i%100000 == 0) cout << "entry " << i << endl; if(i == 0 ) spillID0 = spillID; if(runID > 13800 && runID < 14799)continue; if(xT < 0.1 || xT > 0.4)continue; //Now do the kinematic cuts! xf = xF; lordm.SetXYZM(dpx, dpy, dpz, mass); pt = lordm.Pt(); if(pt < 0.5) continue; //if(fabs(lordm.Py()/lordm.Px()) < 0.176 || fabs(lordm.Py()/lordm.Px()) > 5.67) continue; //if(fabs(lordm.Px()/lordm.Py()) < 0.176) continue; phi = lordm.Phi(); //make a left right phi! phi2 = phi - PI/2; if(phi2 < -PI){phi2 = phi2 + 2*PI;} phi3 = phi - PI/2; if(phi3 < -PI){phi3 = phi3 + 2*PI;} if(nbins == 1){k = 0;} else{ if(Trig == 0 || Trig == 2){int k = int (10 * xf);} } if(nbins == 1){ if(xf < 0.2 || xf > 0.6)continue;} else if(nbins > 1){ if(xf < 0.2 || xf > 0.7)continue; } if(nbins == 1){k = 0;} else{ int k = int (10 * (xf - 0.2)); } if (k < 0) continue; if (k > nbins-1) k = nbins - 1; //if (k > nbins-1) continue; //if(i == 0)cout << "entry, day, DspillID, polT " << i << " " << daycount << " " << DspillID << " " << polT <<endl; DspillID = float(spillID - spillID0) / 650.; //if((spillID - spillID0) / 650 > daycount){ if(DspillID > daycount){ if(Seed == 0){ if(DspillID%2 == 0)polT = 0; if(DspillID%2 == 1)polT = 1; } else{ polT = TRand -> Uniform(2); } //cout << "entry, day, Dspill, DspillID, polT " << i << " " << daycount << " " << spillID - spillID0 << " " << DspillID << " " << polT <<endl; daycount++; } //cout << "arm, k, phiy, phib, phi " << i << " " << arm << " " << k << " " << phiyellow << " " << phiblue << " " << phi << endl; Yield[target][k][polT] -> Fill (mass, phi); Yield2[target][k][polT] -> Fill (mass, phi2); Yield3[target][k] -> Fill (mass, phi); yxfmass -> Fill (mass,xf); yeta -> Fill (eta); yxfmasspt -> Fill (mass,xf,pt); yxfmasseta -> Fill (mass,xf,eta); } inFile1 -> Close(); gROOT -> cd(); //exit(1); // ================================================================== mass peak determination // asymmetry calculation //Canvas to draw phi dists TCanvas *cpa[2]; TCanvas *cpa2[2]; TCanvas *c1; TCanvas *c2; c1 = new TCanvas(); for (int j = 0; j < 2; j++){ sprintf(Hname, "cpa_%d", j); cpa[j] = new TCanvas(Hname, Hname, 1800, 1200); cpa[j] -> Divide(3, 3); sprintf(Hname, "cpa2_%d", j); cpa2[j] = new TCanvas(Hname, Hname, 1200, 400); cpa2[j] -> Divide(2, 1); } for (int a = 0; a < 2; a++){ // These are the slices in dump/target !! if(a == 0) sprintf (inArm, "Dump"); else if(a == 1) sprintf (inArm, "Target"); if(a == 0){sprintf(Beam,"dump");} if(a == 1){sprintf(Beam,"target");} for (int k = 0; k < nbins; k++) { // These are the slices in xf !!! // Mass distribution for the mixed events !!! //labels! float xfTitleMin, xfTitleMax; float phiTitleMin, phiTitleMax; if(Trig == 0 || Trig == 2){ xfTitleMin = 0.1 * float (k) + 0.2; xfTitleMax = 0.1 * float (k) + 0.3; if(NBins == 1){xfTitleMin = 0.2, xfTitleMax = 0.4;} } //fit range! printf("//////////////////////////////////"); printf("GET PARAMETERS FOR TARGET %d, XF BIN %d \n", a, k); /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// c1->cd(); printf("Doing mass distributions for target %d, xf bin%d \n", a, k); tmass3 = Yield3[a][k] -> ProjectionX(); Hmass[a][k] -> Add (tmass3); Hmass[a][k] -> Draw(); sprintf (Hname, "./images_xf/mass3_roadset%d_nbins%d_target%d_xf%d.gif", Roadset, nbins, a, k); if(SaveOn == 1) c1-> SaveAs(Hname); tmass3 -> Reset(); //Set the phi distributions for cosavg! tphi3 = Yield3[a][k] -> ProjectionY ("tphi3", 1,140); hphi_raw3[a][k] -> Reset(); hphi_raw3[a][k] -> Add (tphi3); hphi_sub3[a][k] -> Reset(); hphi_sub3[a][k] -> Add (tphi3); //Do it for the bigger phi bins !!! printf("//////////////////////////////////"); printf("BIG PHI BIN PART FOR XF BIN %d \n", k); /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// //one phi bin at a time, then subtract background!! for (int j = 0; j < 2; j++) for(int p = 0; p < 2; p++){ if (j == 0) sprintf (inPol, "Down"); else if (j == 1) sprintf (inPol, "Up"); if (p == 0)sprintf (LRdir, "Left"); else if (p == 1)sprintf (LRdir, "Right"); c1->cd(); //Get invariant mass printf("Doing mass distributions for %s xf bin%d, phi bin %s, %s direction \n", inArm, k, LRdir, inPol); tmass2 = Yield2[a][k][j] -> ProjectionX("tmass2", p+1, p+1); hmass2[p][j] -> Reset(); hmass2[p][j] -> Add (tmass2); cpa2[j] -> cd(p+1); int integral = hmass2[p][j] -> Integral(1, 140); sprintf (Hname, "%d COUNTS! %s %s %s %s for %1.1f < x_{F} < %1.1f, %s", integral, inArm, inTrig, inBeam, inPol, xfTitleMin, xfTitleMax, LRdir); hmass2[p][j] -> SetTitle(Hname); hmass2[p][j] -> Draw(); tmass2 -> Reset(); // Set the phi distributions !!! hphi_sub2[a][k][j] -> SetBinContent(p+1, hmass2[p][j] -> Integral(1, 140)); }//end of slices in big phi, pol direction! //Save Canvas for (int j = 0; j < 2; j++){ cpa2[j] -> cd(); sprintf (Hname, "./images_mass_xf/mass2_nbins%d_roadset%d_target%d_xf%d_D%d.gif", nbins, Roadset, a, k, j); if(SaveOn == 1)cpa2[j] -> SaveAs(Hname); } printf("//////////////////////////////////"); printf("LITTLE PHI BIN PART FOR XF BIN %d \n", k); //one phi bin at a time, then subtract background!! for (int j = 0; j < 2; j++) for(int p = 0; p < phibins; p++){ if (j == 0) sprintf (inPol, "Down"); else if (j == 1) sprintf (inPol, "Up"); phiTitleMin = PI/(phibins/2) * float(p) - PI; phiTitleMax = PI/(phibins/2) * float(p) - PI + PI/(phibins/2); c1->cd(); //Get the invariant mass //tmass -> Reset(); tmass = Yield[a][k][j] -> ProjectionX("tmass", p+1, p+1); hmass[p][j] -> Reset(); hmass[p][j] -> Add (tmass); cpa[j] -> cd(p+1); int integral = hmass[p][j] -> Integral(1, 140); sprintf (Hname, "%d COUNTS! %s %s %s %s for %1.1f < x_{F} < %1.1f, %s", integral, inArm, inTrig, inBeam, inPol, xfTitleMin, xfTitleMax, LRdir); hmass[p][j] -> SetTitle(Hname); hmass[p][j] -> Draw(); tmass -> Reset(); hphi_sub[a][k][j] -> SetBinContent(p+1, hmass[p][j] -> Integral(1, 140)); }//end of slices in phi, pol direction! //Save Canvas for (int j = 0; j < 2; j++){ cpa[j] -> cd(); sprintf (Hname, "./images_mass_xf/masssub_nbins%d_Roadset%d_target%d_xf%d_B%d_D%d.gif", nbins, Roadset, a, k, j); if(SaveOn == 1)cpa[j] -> SaveAs(Hname); } //Get the #eta meson Yields in phi!! printf("NOW GETTING THE SPIN, PHI DEPENDENT YIELDS FOR %s xf bin %d \n", inArm, k); yphi[a][k][0] -> Add (hphi_sub[a][k][0]); // target down yphi[a][k][1] -> Add (hphi_sub[a][k][1]); // target up yphi2[a][k][0] -> Add (hphi_sub2[a][k][0]); // target down yphi2[a][k][1] -> Add (hphi_sub2[a][k][1]); // target up yphi3[a][k] -> Add (hphi_sub3[a][k]); c1 -> cd(); // Calculate polarization asymmetries (asymP),left-right and square root asymmetries (asymS) !!! double n1, n2, n3, n4; double e1, e2, e3, e4; double asym_val, asym_err; double asym_val_up,asym_err_up,asym_val_down,asym_err_down; double asym_val_left,asym_err_left,asym_val_right,asym_err_right; //sqrt asymmetry for (int p = 0; p < phibins / 2; p++) { n1 = yphi[a][k][1] -> GetBinContent (p + 1); n2 = yphi[a][k][0] -> GetBinContent (p + 1); n3 = yphi[a][k][1] -> GetBinContent (p + 1 + phibins / 2); n4 = yphi[a][k][0] -> GetBinContent (p + 1 + phibins / 2); e1 = sqrt(n1); e2 = sqrt(n2); e3 = sqrt(n3); e4 = sqrt(n4); if ((n1 > 9) && (n2 > 9) && (n3 > 9) && (n4 > 9)) { asym_val = square_asym (n1, n2, n3, n4); asym_err = square_error (n1, n2, n3, n4, e1, e2, e3, e4); asymS[a][k] -> SetBinContent (p + 1, asym_val); asymS[a][k] -> SetBinError (p + 1, asym_err); } } //polarization asymmetry for (int p = 0; p < phibins; p++) { n1 = yphi[a][k][1] -> GetBinContent (p + 1); n2 = yphi[a][k][0] -> GetBinContent (p + 1); e1 = sqrt(n1); e2 = sqrt(n2); if ((n1 > 9) && (n2 > 9)) { asymP[a][k] -> SetBinContent (p + 1, simple_asym (n1, n2)); asymP[a][k] -> SetBinError (p + 1, simple_error (n1, n2, e1, e2)); } } //simple left-right asymmetry for (int p = 0; p < phibins / 2; p++) { n1 = yphi[a][k][0] -> GetBinContent (p + 1 + phibins / 2); n2 = yphi[a][k][0] -> GetBinContent (p + 1); n3 = yphi[a][k][1] -> GetBinContent (p + 1); n4 = yphi[a][k][1] -> GetBinContent (p + 1 + phibins / 2); e1 = sqrt(n1); e2 = sqrt(n2); e3 = sqrt(n3); e4 = sqrt(n4); if ((n1 > 9) && (n2 > 9) && (n3 > 9) && (n4 > 9)) { asym_val_up = simple_asym(n1, n2); asym_err_up = simple_error(n1, n2, e1, e2); asym_val_down = simple_asym(n3, n4); asym_err_down = simple_error(n3, n4, e3, e4); asym_val = weighted_mean(asym_val_up, asym_val_down, asym_err_up, asym_err_down); asym_err = weighted_error(asym_err_up, asym_err_down); asymL[a][k] -> SetBinContent (p + 1, asym_val_up); asymL[a][k] -> SetBinError (p + 1, asym_err_down); } } //////////////////////////////////////////////// //this is new do the cos average first double cosval[cosbins]; //[cosbins] int cosavg_den = 0; double cosavg_num = 0; double cosavg = 0; printf ("The f correction factor variables for %s xf bin %d. \n", inArm, k); printf ("%5s : %9s : %5s : %11s : %11s \n", "phibin", "cosval[p]", "n1", "cosavg_num", "cosavg_den"); for (int p = 0; p < cosbins; p++) { n1 = 0; n1 = yphi3[a][k] -> GetBinContent (p + 1); cosval[p] = PI/(cosbins/2) * double(p) - PI + (PI/(cosbins/2)/2); if (n1 > 0) { cosavg_num += (n1 * fabs( cos( cosval[p] ) ) ); cosavg_den += n1; } printf ("%5d : %1.2f : %5d : %1.2f : %1.1f \n", p, cosval[p], n1, cosavg_num, cosavg_den); } cosavg = cosavg_num / double(cosavg_den); printf("The correction factor f for %s xf bin %d is %1.2f. \n", inArm, k, 1/cosavg); //end of cos avg function f ///////////////////////////////////////////////// //this is new let's just do sqrt, left-right printf ("The sqrt-formula spin dependent yields for %s xf bin %d. \n", inArm, k); n1 = n2 = n3 = n4 = 0; n1 = yphi2[a][k][1] -> GetBinContent (1); n2 = yphi2[a][k][1] -> GetBinContent (2); n3 = yphi2[a][k][0] -> GetBinContent (1); n4 = yphi2[a][k][0] -> GetBinContent (2); e1 = sqrt(n1); e2 = sqrt(n2); e3 = sqrt(n3); e4 = sqrt(n4); if ((n1 > 9) && (n2 > 9) && (n3 > 9) && (n4 > 9)) { printf ("%5s : %5s : %5s : %5s : %5s : %5s : %5s : %5s \n", "n1", "n2", "n3", "n4", "e1", "e2", "e3", "e4"); printf ("%5d : %5d : %5d : %5d : %5d : %5d : %5d : %5d \n", n1, n2, n3, n4, e1, e2, e3, e4); asym_val = (1/cosavg)*(square_asym (n1, n2, n3, n4)); asym_err = (1/cosavg)*(square_error (n1, n2, n3, n4, e1, e2, e3, e4)); cout << "The sqrt-formula value of asym_val,asym_err after f correction is: " << asym_val << ", " << asym_err << endl; asymS2[a][k] -> SetBinContent (1, asym_val); asymS2[a][k] -> SetBinError (1, asym_err); } //this is the end of the new sqrt asym part ///////////////////////////////////////////////// //this is new let's just do pol up-down printf ("The relative luminosity spin dependent yields for %s xf bin %d. \n", inArm, k); n1 = n2 = n3 = n4 = 0; n1 = yphi2[a][k][1] -> GetBinContent (1); n2 = yphi2[a][k][1] -> GetBinContent (2); n3 = yphi2[a][k][0] -> GetBinContent (1); n4 = yphi2[a][k][0] -> GetBinContent (2); e1 = sqrt(n1); e2 = sqrt(n2); e3 = sqrt(n3); e4 = sqrt(n4); if ((n1 > 9) && (n2 > 9) && (n3 > 9) && (n4 > 9)) { printf ("%5s : %5s : %5s : %5s : %5s : %5s : %5s : %5s : %5s : %11s : %11s \n", "phibin", "n1", "n2", "n3", "n4", "e1", "e2", "e3", "e4", "cosavg_num", "cosavg_den"); printf ("%5d : %5d : %5d : %5d : %5d : %5d : %5d : %5d : %5d : %1.2f : %1.1f \n", p, n1, n2, n3, n4, e1, e2, e3, e4, cosavg_num, cosavg_den); asym_val_left = (1/cosavg)*(simple_asym (n1, n3)); asym_err_left = (1/cosavg)*(simple_error (n1, n3, e1, e3)); asym_val_right = (1/cosavg)*(simple_asym (n4, n2)); asym_err_right = (1/cosavg)*(simple_error (n4, n2, e4, e2)); asym_val = weighted_mean(asym_val_left,asym_val_right,asym_err_left,asym_err_right); asym_err = weighted_error(asym_err_left,asym_err_right); cout << "The rel-lum value of asym_val,asym_err after f correction for beam is: " << asym_val << ", " << asym_err << endl; asymP2[a][k] -> SetBinContent (1, asym_val); asymP2[a][k] -> SetBinError (1, asym_err); } //this is the end of the new pol asym part //////////////////////////////////////////////// // Determine the amplitude of the single spin asymmetries as function of xf !!! printf ("==============================================\n"); printf (" fit results for %s xf-bin %d \n", inArm, k); printf ("----------------------------------------------\n"); printf ("::: sqrt,pol-asymmetries, left-right ::: \n"); amp_val = asymS2[a][k] -> GetBinContent(1); amp_err = asymS2[a][k] -> GetBinError(1); xf_an6[a] -> SetBinContent (binjump + k, amp_val / targetPol); xf_an6[a] -> SetBinError (binjump + k, amp_err / targetPol); amp_val = asymP2[a][k] -> GetBinContent(1); amp_err = asymP2[a][k] -> GetBinError(1); xf_an7[a] -> SetBinContent (binjump + k, amp_val / targetPol); xf_an7[a] -> SetBinError (binjump + k, amp_err / targetPol); printf ("----------------------------------------------\n"); printf ("::: sqrt-asymmetries ::: \n"); printf ("plain cosine fit: \n"); fitcos -> SetParameters (0., 0.); asymS[a][k] -> Fit ("an_cos", "R"); amp_val = fitcos -> GetParameter (0); amp_err = fitcos -> GetParError (0); xf_asymfit1[a] -> SetBinContent (binjump + k, amp_val); xf_asymfit1[a] -> SetBinError (binjump + k, amp_err); printf (" %5.3f +/- %5.3f \n", amp_val, amp_err); ndf = fitcos -> GetNDF(); csq = fitcos -> GetChisquare(); if (ndf > 1){ fit_rndf1[a] -> Fill (csq / (ndf - 1)); } xf_an1[a] -> SetBinContent (binjump + k, amp_val / targetPol); xf_an1[a] -> SetBinError (binjump + k, amp_err / targetPol); anval1[a][k] -> Fill(amp_val); printf ("sine fit with free phase: \n"); fitsin -> SetParameters (0., 1.5 * PI); asymS[a][k] -> Fit ("an_sin", "R"); amp_val = fitsin -> GetParameter (0); amp_err = fitsin -> GetParError (0); phi_val = fitsin -> GetParameter (1); phi_err = fitsin -> GetParError (1); // ========> correlation of sign of amplitude and phi0 !!! <======== if (sin (phi_val) < 0.) {phi_val += PI; amp_val *= -1.;} phi_val = phase_modulo (phi_val); xf_asymfit2[a] -> SetBinContent (binjump + k, amp_val); xf_asymfit2[a] -> SetBinError (binjump + k, amp_err); xf_phi0fit2[a] -> SetBinContent (binjump + k, phi_val - 0.5 * PI); xf_phi0fit2[a] -> SetBinError (binjump + k, phi_err); printf (" %5.3f +/- %5.3f \n", amp_val, amp_err); printf (" %5.3f +/- %5.3f \n", phi_val, phi_err); ndf = fitsin -> GetNDF(); csq = fitsin -> GetChisquare(); if (ndf > 1){ fit_rndf2[a] -> Fill (csq / (ndf - 1)); } printf ("----------------------------------------------\n"); printf ("::: pol-asymmetries :::"); printf ("constant plus cosine fit: \n"); fitcosP -> SetParameters (0., 0.); asymP[a][k] -> Fit ("an_cosP", "R"); rel_val = fitcosP -> GetParameter (0); rel_err = fitcosP -> GetParError (0); amp_val = fitcosP -> GetParameter (1); amp_err = fitcosP -> GetParError (1); xf_rellfit3[a] -> SetBinContent (binjump + k, rel_val); xf_rellfit3[a] -> SetBinError (binjump + k, rel_err); xf_asymfit3[a] -> SetBinContent (binjump + k, amp_val); xf_asymfit3[a] -> SetBinError (binjump + k, amp_err); printf (" %5.3f +/- %5.3f \n", rel_val, rel_err); printf (" %5.3f +/- %5.3f \n", amp_val, amp_err); ndf = fitcosP -> GetNDF(); csq = fitcosP -> GetChisquare(); if (ndf > 1){ fit_rndf3[a] -> Fill (csq / (ndf - 1)); } printf ("constant plus sine fit with free phase: \n"); fitsinP -> SetParameters (0., 1.5 * PI); asymP[a][k] -> Fit ("an_sinP", "R"); rel_val = fitsinP -> GetParameter (0); rel_err = fitsinP -> GetParError (0); amp_val = fitsinP -> GetParameter (1); amp_err = fitsinP -> GetParError (1); phi_val = fitsinP -> GetParameter (2); phi_err = fitsinP -> GetParError (2); // ========> correlation of sign of amplitude and phi0 !!! <======== if (sin (phi_val) < 0.) {phi_val += PI; amp_val *= -1.;} phi_val = phase_modulo (phi_val); xf_rellfit4[a] -> SetBinContent (binjump + k, rel_val); xf_rellfit4[a] -> SetBinError (binjump + k, rel_err); xf_asymfit4[a] -> SetBinContent (binjump + k, amp_val); xf_asymfit4[a] -> SetBinError (binjump + k, amp_err); xf_phi0fit4[a] -> SetBinContent (binjump + k, phi_val - 0.5 * PI); xf_phi0fit4[a] -> SetBinError (binjump + k, phi_err); printf (" %5.3f +/- %5.3f \n", rel_val, rel_err); printf (" %5.3f +/- %5.3f \n", amp_val, amp_err); printf (" %5.3f +/- %5.3f \n", phi_val, phi_err); ndf = fitsinP -> GetNDF(); csq = fitsinP -> GetChisquare(); if (ndf > 1){ fit_rndf4[a] -> Fill (csq / (ndf - 1)); } }// End of the slices in k !!! cout << "END OF SLICES IN XF BINS!" << endl; // Determine the global relative luminosity !!! TLine *RLine; Double_t avRL; Double_t erRL; TF1 *relTarget = new TF1 ("relTarget", "pol0", -.7, -.1); xf_rellfit3[a] -> Fit ("relTarget", "R"); avRL = relTarget -> GetParameter (0); erRL = relTarget -> GetParError (0); for (int k = 0; k < nbins; k++) for (int p = 0; p < phibins; p++) if (asymP[a][k] -> GetBinError (p + 1)){ asymF[a][k] -> SetBinContent (p + 1, asymP[a][k] -> GetBinContent (p + 1) - avRL); asymF[a][k] -> SetBinError (p + 1, asymP[a][k] -> GetBinError (p + 1)); } RLine = new TLine (.1, avRL, .8, avRL); RLine -> SetLineWidth (3); for (int k = 0; k < nbins; k++) { printf ("==============================================\n"); printf ("::: final pol-asymmetries :::"); printf ("constant plus cosine fit (global relative luminosity): \n"); fitcosF -> SetParameters (0., 0.); asymF[a][k] -> Fit ("an_cosF", "R"); amp_val = fitcosF -> GetParameter (0); amp_err = fitcosF -> GetParError (0); xf_asymfit5[a] -> SetBinContent (binjump + k, amp_val); xf_asymfit5[a] -> SetBinError (binjump + k, amp_err); printf (" %5.3f +/- %5.3f \n", rel_val, rel_err); printf (" %5.3f +/- %5.3f \n", amp_val, amp_err); ndf = fitcosF -> GetNDF(); csq = fitcosF -> GetChisquare(); if (ndf > 1){ fit_rndf5[a] -> Fill (csq / (ndf - 1)); } xf_an5[a] -> SetBinContent (binjump + k, amp_val / targetPol); xf_an5[a] -> SetBinError (binjump + k, amp_err / targetPol); anval5[a][k] -> Fill(amp_val); } // Images !!! /* if(Peak == 0){ xf_asymfit1[a] -> SetMinimum (-.08); xf_asymfit1[a] -> SetMaximum ( .13); xf_an1[a] -> SetMinimum (-.20); xf_an1[a] -> SetMaximum ( .25); } else if(Peak == 1 || Peak == 2){ xf_asymfit1[a] -> SetMinimum (-.17); xf_asymfit1[a] -> SetMaximum ( .17); xf_an1[a] -> SetMinimum (-.35); xf_an1[a] -> SetMaximum ( .25); }*/ xf_an1[a] -> SetMinimum (-.1); xf_an1[a] -> SetMaximum ( .1); TLegend *Legend1 = new TLegend (.15, .7, .5, .88); Legend1 -> SetFillStyle (0); Legend1 -> SetLineColor (0); Legend1 -> AddEntry (xf_asymfit1[a], "#epsilon_{sqrt}:a*cos(#varphi)"); Legend1 -> AddEntry (xf_asymfit3[a], "#epsilon_{pol}:b+a*cos(#varphi)"); Legend1 -> AddEntry (xf_asymfit5[a], "#epsilon_{pol}:#bar{b}+a*cos(#varphi)"); TLine *zxf = new TLine (0., 0., 1., 0.); char *asymxNameText = "./images_xf/asym2p_roadset%d_nbins%d_target%d.gif"; sprintf (Hname, asymxNameText, Roadset, nbins, a); TCanvas *Casymx = new TCanvas ("asym", "asym", 500, 500); //Casymx -> Divide (1, 2); //Casymx -> cd(1); //xf_asymfit1[a] -> Draw(); //xf_asymfit3[a] -> Draw("SAME"); //xf_asymfit5[a] -> Draw("SAME"); //Legend1 -> Draw ("SAME"); //zxf -> Draw(); //Casymx -> cd(2); xf_an1[a] -> Draw(); xf_an5[a] -> Draw("same"); zxf -> Draw(); Casymx -> Update(); if(SaveOn == 1) Casymx -> SaveAs (Hname); TLatex *Lxf[5]; if(a == 1){neg = 1; pos = 0;} if(Trig == 0 || Trig == 2){ if(nbins == 1){ Lxf[0] = new TLatex (-2.8, .08, " 0.2 < x_{F} < 0.7"); } else{ Lxf[0] = new TLatex (-2.8, .08, "0.2 < x_{F} < 0.3"); Lxf[1] = new TLatex (-2.8, .08, "0.3 < x_{F} < 0.4"); Lxf[2] = new TLatex (-2.8, .08, "0.4 < x_{F} < 0.5"); Lxf[3] = new TLatex (-2.8, .08, "0.5 < x_{F} < 0.6"); Lxf[4] = new TLatex (-2.8, .16, "0.6 < x_{F} < 0.7"); } } // for (int k = 0; k < 3, k++){Lxf[k] -> SetTextSize (0.07);} TLine *phi_zero1 = new TLine (-PI, 0., 0., 0.); TLine *phi_zero2 = new TLine (-PI, 0., PI, 0.); TH1D *tasym1[2][nbins]; TH1D *tasym2[2][nbins]; TH1D *tasym3[2][nbins]; TH1D *tasym4[2][nbins]; TH1D *tasym5[2][nbins]; char *asymsNameText = "./images_xf/asym2s_roadset%d_nbins%d_target%d.gif"; sprintf (Hname, asymsNameText, Roadset, nbins, a); TCanvas *Casym4 = new TCanvas ("asyms", "asyms", 600, 400*(nbins)); Casym4 -> Divide (1, nbins); for (int k = 0; k < nbins; k++){ asymF[a][k] -> SetMinimum (-0.10); asymF[a][k] -> SetMaximum (0.10); Casym4 -> cd (k + 1); tasym5[a][k] = (TH1D*)asymF[a][k]->Clone(); tasym5[a][k] -> Fit ("an_cosF", "R"); tasym5[a][k] -> Draw(); Lxf[k] -> Draw("same"); phi_zero2 -> Draw("same"); } if(SaveOn == 1)Casym4 -> SaveAs (Hname); char *asymqNameText = "./images_xf/asym2q_roadset%d_nbins%d_target%d.gif"; sprintf (Hname, asymqNameText, Roadset, nbins, a); TCanvas *Casym5 = new TCanvas ("asymq", "asymq", 600, 400*(nbins)); Casym5 -> Divide (1, nbins); for (int k = 0; k < nbins; k++){ asymS[a][k] -> SetMinimum (-.10); asymS[a][k] -> SetMaximum ( .10); Casym5 -> cd (k+1); tasym1[a][k] = (TH1D*)asymS[a][k]->Clone(); tasym1[a][k] -> Fit ("an_cos", "R"); tasym1[a][k] -> Draw(); Lxf[k] -> Draw("same"); phi_zero1 -> Draw("same"); } if(SaveOn == 1)Casym5 -> SaveAs (Hname); TLine *defaultshiftblue = new TLine (-1., PI, 1., PI); defaultshiftblue-> SetLineStyle (2); TLine *defaultshiftyellow = new TLine (-1., 0., 1., 0.); TLegend *Legend2 = new TLegend (.16, .65, .5, .88); //TLegend *Legend1 = new TLegend (.15, .7, .5, .88); Legend2 -> SetFillStyle (0); Legend2 -> SetLineColor (0); Legend2 -> AddEntry (xf_asymfit1[a], "#epsilon_{sqrt}:a*cos(#varphi)"); Legend2 -> AddEntry (xf_asymfit2[a], "#epsilon_{sqrt}:a*cos(#varphi+#varphi_{0})"); Legend2 -> AddEntry (xf_asymfit3[a], "#epsilon_{pol}:b+a*cos(#varphi)"); Legend2 -> AddEntry (xf_asymfit4[a], "#epsilon_{pol}:b+a*cos(#varphi+#varphi_{0})"); char *fitsNameText = "./images_xf/fitsummary_roadset%d_nbins%d_target%d.gif"; sprintf (Hname, fitsNameText, Roadset, nbins, a); //printf("%s \n", Hname); TCanvas *Cfits = new TCanvas ("fitsummary", "fitsummary", 1000, 1000); Cfits -> Divide (2, 2); Cfits -> cd (1); xf_asymfit1[a] -> Draw(); xf_asymfit2[a] -> Draw("same"); xf_asymfit3[a] -> Draw("same"); xf_asymfit4[a] -> Draw("same"); Legend2 -> Draw ("same"); zxf -> Draw(); Cfits -> cd (3); xf_rellfit3[a] -> Draw(); xf_rellfit4[a] -> Draw ("same"); RLine -> Draw(); Cfits -> cd (4); xf_phi0fit4[a] -> Draw(); defaultshiftblue -> Draw("same"); defaultshiftyellow -> Draw("same"); Cfits -> cd (2); xf_phi0fit2[a] -> Draw(); defaultshiftblue -> Draw("same"); defaultshiftyellow -> Draw("same"); //Cfits -> cd(); if(SaveOn == 1)Cfits -> SaveAs (Hname); //End of Images!!! printf ("==================================================\n"); printf ("Arm %s mean target relative luminosity: %5.3f +/- %5.3f \n", inArm, avRL, erRL); printf ("==================================================\n\n"); } //End of Arms!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11 //Let's get the average pt, xf /* for (int k = 0; k < nbins; k++) { //labels! float xfTitleMin, xfTitleMax; xfTitleMin = 0.1 * float (k) + 0.2; xfTitleMax = 0.1 * float (k) + 0.3; if(NBins == 1){xfTitleMin = 0.2, xfTitleMax = 0.7;} int kmin = xfTitleMin * 100 + 1; int kmax = xfTitleMax * 100 + 1; float meanxf; float rmsxf; float meanpt; float meaneta; for(int x = kmin; x < kmax; x++) for(int m = 1; m <= 140; m++){ yxfmass3 -> SetBinContent(m, x, yxfmass -> GetBinContent(m, x)); for(int p = 0; p < 500; p++){ yxfmasspt3 -> SetBinContent(m, x, p, yxfmasspt -> GetBinContent(m, x, p)); } for(int p = 0; p < 300; p++){ yxfmasseta3 -> SetBinContent(m, x, p, yxfmasseta -> GetBinContent(m, x, p)); } } txf3 = yxfmass3 -> ProjectionY(); meanxf = txf3 -> GetMean(); txf3 -> Reset(); yxfmass3 -> Reset(); tpt3 = yxfmasspt3 -> ProjectionZ("tpt3"); meanpt = tpt3 -> GetMean(); tpt3 -> Reset(); yxfmasspt3 -> Reset(); c1 -> cd(); yxfmasseta3 -> Draw(); teta3 = yxfmasseta3 -> ProjectionZ("teta3"); meaneta = teta3 -> GetMean(); teta3 -> Reset(); yxfmasseta3 -> Reset(); cout << "k, meanxf, meanpt, meaneta " << k << " " << meanxf << " " << meanpt << " " << meaneta << endl; xf_mean -> SetBinContent(0.5 + (binjump + k) , meanxf); pt_mean -> SetBinContent(0.5 + (binjump + k) , meanpt); eta_mean -> SetBinContent(0.5 + (binjump + k) , meaneta); //exit(1); } //Let's get the average eta meaneta = yeta -> GetMean(); cout << "The mean of pseudo-rapidity is " << meaneta << endl; */ //Write out to OutFile!! char *outNameText = "./results_tighter/asym2_roadset%d_nbins%d_halfday%d.root"; //char *outNameText = "./results/phicut_asym2_roadset%d_nbins%d_halfday%d.root"; sprintf (outName, outNameText, Roadset, nbins, Seed); TFile *outFile = new TFile (outName, "RECREATE"); //yxfmass -> Write(); //yxfmasspt -> Write(); //yxfmass3 -> Write(); //yxfmasspt3 -> Write(); xf_mean -> Write(); pt_mean -> Write(); eta_mean -> Write(); yeta -> Write(); for (int a = 0; a < 2; a++) { xf_asymfit1[a] -> Write(); xf_asymfit2[a] -> Write(); xf_phi0fit2[a] -> Write(); xf_rellfit3[a] -> Write(); xf_asymfit3[a] -> Write(); xf_rellfit4[a] -> Write(); xf_asymfit4[a] -> Write(); xf_phi0fit4[a] -> Write(); xf_asymfit5[a] -> Write(); fit_rndf1[a] -> Write(); fit_rndf2[a] -> Write(); fit_rndf3[a] -> Write(); fit_rndf4[a] -> Write(); fit_rndf5[a] -> Write(); xf_an5[a] -> Write(); xf_an1[a] -> Write(); xf_an3[a] -> Write(); xf_an6[a] -> Write(); xf_an7[a] -> Write(); for (int k = 0; k < nbins; k++) { Yield3[a][k] -> Write(); Hmass[a][k] -> Write(); yphi3[a][k] -> Write(); hphi_sub3[a][k] -> Write(); hphi_raw3[a][k] -> Write(); for (int j = 0; j < 2; j++){ Yield[a][k][j] -> Write(); Yield2[a][k][j] -> Write(); //hphi_raw[a][k][j] -> Write(); //hphi_raw2[a][k][j] -> Write(); hphi_sub[a][k][j] -> Write(); hphi_sub2[a][k][j] -> Write(); } asymP[a][k] -> Write(); asymP2[a][k] -> Write(); asymS[a][k] -> Write(); asymS2[a][k] -> Write(); asymL[a][k] -> Write(); asymF[a][k] -> Write(); anval1[a][k] -> Write(); anval5[a][k] -> Write(); for (int d = 0; d < 2; d++) { // down-up yphi[a][k][d] -> Write(); yphi2[a][k][d] -> Write(); } } } /* for (int p = 0; p < phibins; p++) for (int j = 0; j < 2; j++){ hmass[p][j] -> Write(); } for (int p = 0; p < 2; p++) for (int j = 0; j < 2; j++){ hmass2[p][j] -> Write(); } hmass3 -> Write(); } */ outFile -> Write(); outFile -> Close(); }