plotClasses(const char* canvas, const char* title, int nClasses, const char classes[][200], const int* events, const double* weights) { char evtitle[200], wttitle[200]; strcpy(evtitle,title); strcpy(wttitle,title); strcat(evtitle,": Events"); strcat(wttitle,": Weights"); TCanvas *c = new TCanvas(canvas,"SPR Input Classes",200,10,600,400); gStyle->SetPalette(1); int maxEv = TMath::MaxElement(nClasses,events); double maxWt = TMath::MaxElement(nClasses,weights); TPad* pad1 = new TPad("events", evtitle,0,0,1.,0.5); TPad* pad2 = new TPad("weights",wttitle,0,0.5,1.,1.); pad1->Draw(); pad2->Draw(); // events pad1->cd(); TH1I* hev = new TH1I("events",evtitle,nClasses,0,nClasses); for( int i=0;i<nClasses;i++ ) hev->Fill(classes[i],events[i]); hev->LabelsDeflate("X"); hev->SetLabelSize(0.06,"X"); hev->SetLabelSize(0.1,"X"); hev->SetLabelSize(0.1,"Y"); hev->SetLineColor(4); hev->SetFillColor(4); hev->SetBarWidth(0.8); hev->SetBarOffset(0.1); TAxis* yaxis1 = hev->GetYaxis(); yaxis1->SetRangeUser(0.,1.1*maxEv); hev->Draw("B"); // weights pad2->cd(); TH1D* hwt = new TH1D("weights",wttitle,nClasses,0,nClasses); for( int i=0;i<nClasses;i++ ) hwt->Fill(classes[i],weights[i]); hwt->LabelsDeflate("X"); hwt->SetLabelSize(0.06,"X"); hwt->SetLabelSize(0.1,"X"); hwt->SetLabelSize(0.1,"Y"); hwt->SetLineColor(3); hwt->SetFillColor(3); hwt->SetBarWidth(0.8); hwt->SetBarOffset(0.1); TAxis* yaxis2 = hwt->GetYaxis(); yaxis2->SetRangeUser(0.,1.1*maxWt); hwt->Draw("B"); }
TGraph* GetStat(TString className="CVHMV0M-B-NOPF-CENTNOTRD",Bool_t lumi=1, Bool_t goodOnly=0, TString part="PHYSICS_1"){ Double_t stat[100000]; Double_t time_stamp[100000]; TH1D* hStat = new TH1D("hStat","",1,0,1); TH1D* hTimeStart = new TH1D("hTimeStart","",1,0,1); TH1D* hTimeEnd = new TH1D("hTimeEnd","",1,0,1); TString classNameRun; for (Int_t r=0;r<t->GetEntries();r++){ t->GetEntry(r); if (!partition->String().Contains(part.Data())) continue; if (!lhcState->String().Contains("STABLE")) continue; if (!lhcPeriod->String().Contains("LHC15m")) continue; if (run<225000) continue; hTimeStart->Fill(Form("%i",run),timeStart); hTimeEnd->Fill(Form("%i",run),timeEnd); classNameRun = TString(className); if (className.EqualTo("CEMC7-B-NOPF-CENTNOTRD") && run<=236224) classNameRun="CEMC7-ABCE-NOPF-ALLNOTRD"; if (className.EqualTo("CDMC7-B-NOPF-CENTNOTRD") && run<=236224) classNameRun="CDMC7-ABCE-NOPF-ALLNOTRD"; if (className.EqualTo("CMUL7-B-NOPF-MUFAST") && run<=226606) classNameRun="CMUL7-B-NOPF-ALLNOTRD"; if (className.EqualTo("CVHMV0M-B-NOPF-CENTNOTRD") && run<=236221) classNameRun="CVHMV0M-B-NOPF-CENT"; if (className.EqualTo("CVHMSH2-B-NOPF-CENTNOTRD") && run<=236226) classNameRun="CVHMSH2-B-NOPF-CENT"; if (className.EqualTo("CVHMV0M-B-NOPF-CENTNOTRD") && run>=238432 && run<=239144) classNameRun="CVHMV0M-B-SPD1-CENTNOTRD"; if (className.EqualTo("CVHMSH2-B-NOPF-CENTNOTRD") && run>=238432 ) classNameRun="CVHMSH2-B-SPD1-CENTNOTRD"; if (className.EqualTo("CINT7-B-NOPF-CENT") && run>=225000 && run<=228935) classNameRun="CINT7-B-NOPF-ALLNOTRD"; if (className.EqualTo("CINT7-B-NOPF-CENT") && run>=228936 && run<=229893) classNameRun="CINT7-B-NOPF-CENTNOTRD"; if (className.EqualTo("CINT7-B-NOPF-CENT") && run>=229894 && run<=229899) classNameRun="CINT7-B-NOPF-ALLNOTRD"; if (className.EqualTo("CINT7-B-NOPF-CENT") && run>=229900 && run<=233911) classNameRun="CINT7-B-NOPF-CENT"; if (className.EqualTo("CINT7-B-NOPF-CENT") && run>=233912 && run<=234050) classNameRun="CINT7-B-NOPF-ALLNOTRD"; if (className.EqualTo("CINT7-B-NOPF-CENT") && run>=238890 && run<=239144) classNameRun="CINT7-I-NOPF-CENTNOTRD"; if (className.EqualTo("CEMC7-B-NOPF-CENTNOTRD") && run<=236224) classNameRun="CEMC7-ABCE-NOPF-ALLNOTRD"; if (className.EqualTo("CDMC7-B-NOPF-CENTNOTRD") && run<=236224) classNameRun="CDMC7-ABCE-NOPF-ALLNOTRD"; AliTriggerClass* cl = (AliTriggerClass*) classes->FindObject(classNameRun.Data()); if (!cl) { hStat->Fill(Form("%i",run),0.); continue; } if (goodOnly){ if (classNameRun.Contains("CINT7") || classNameRun.Contains("CVHM")){ Int_t good=0; for (Int_t i=0;i<nGoodRuns;i++) good|= (goodRuns[i]==run); if (!good) { hStat->Fill(Form("%i",run),0.); continue; } } if (className.Contains("MC7")){ if (run<235709 || run==236855 || run==236858 || run==236861 || fill==4440) { hStat->Fill(Form("%i",run),0.); continue; } } if (classNameRun.Contains("CMUL")){ if (!activeDetectors->String().Contains("MUONTRK") || !activeDetectors->String().Contains("MUONTRG") || !activeDetectors->String().Contains("T0") || !activeDetectors->String().Contains("VZERO") || !activeDetectors->String().Contains("ITSSPD") ){ hStat->Fill(Form("%i",run),0.); continue; } } } // printf("%i\n",classes->IndexOf(cl)); Double_t x = lumi ? class_lumi[classes->IndexOf(cl)] : class_l2a[classes->IndexOf(cl)]; hStat->Fill(Form("%i",run),x); } hStat->GetXaxis()->LabelsOption("a"); hTimeEnd->GetXaxis()->LabelsOption("a"); hTimeStart->GetXaxis()->LabelsOption("a"); hStat->LabelsDeflate("x"); hTimeStart->LabelsDeflate("x"); hTimeEnd->LabelsDeflate("x"); Int_t n = 2*hStat->GetNbinsX(); for (Int_t i=0;i<hStat->GetNbinsX();i++){ time_stamp[2*i ] = hTimeStart->GetBinContent(i+1); time_stamp[2*i+1] = hTimeEnd->GetBinContent(i+1); stat[2*i] = i>0?stat[2*i-1]:0; stat[2*i+1] = stat[2*i]+hStat->GetBinContent(i+1)/1000000.; } delete hStat; delete hTimeStart; delete hTimeEnd; TGraph* gStat = new TGraph(n,time_stamp,stat); gStat->SetLineColor(kBlue); gStat->SetLineWidth(2); return gStat; }
void fwliteExample(bool debug=false){ // event cuts const unsigned int maxEvents = -1; const double hfEThreshold = 3.0; const int nTowerThreshold = 1; // track cuts const double normD0Cut = 5.0; const double normDZCut = 5.0; const double ptDebug = 3.0; // trigger names const int nTrigs = 4; const char *hltNames[nTrigs] = {"HLT_MinBiasBSC","HLT_L1Jet6U","HLT_Jet15U","HLT_Jet30U"}; //----- input files (900 GeV data) ----- vector<string> fileNames; fileNames.push_back("./hiCommonSkimAOD.root"); //fileNames.push_back("../test/hiCommonSkimAOD.root"); fwlite::ChainEvent event(fileNames); //----- define output hists/trees in directories of output file ----- TFile *outFile = new TFile("output_fwlite.root","recreate"); TH1D::SetDefaultSumw2(); // evt hists outFile->cd(); outFile->mkdir("evt"); outFile->cd("evt"); TH1D *hL1TechBits = new TH1D("hL1TechBits","L1 technical trigger bits before mask",64,-0.5,63.5); TH2D *hHfTowers = new TH2D("hHfTowers","Number of HF tower above threshold; positive side; negative side",80,-0.5,79.5,80,-0.5,79.5); TH1D *hHLTPaths = new TH1D("hHLTPaths","HLT Paths",3,0,3); hHLTPaths->SetCanExtend(TH1::kAllAxes); // vtx hists outFile->cd(); outFile->mkdir("vtx"); outFile->cd("vtx"); TH1D *hVtxTrks = new TH1D("hVtxTrks","number of tracks used to fit pixel vertex",50,-0.5,49.5); TH1D *hVtxZ = new TH1D("hVtxZ","z position of best reconstructed pixel vertex", 80,-20,20); // track hists outFile->cd(); outFile->mkdir("trk"); outFile->cd("trk"); TH1D *hTrkPt = new TH1D("hTrkPt","track p_{T}; p_{T} [GeV/c]", 80, 0.0, 20.0); TH1D *hTrkEta = new TH1D("hTrkEta","track #eta; #eta", 60, -3.0, 3.0); TH1D *hTrkPhi = new TH1D("hTrkPhi","track #phi; #phi [radians]", 56, -3.5, 3.5); // correlation hists outFile->cd(); outFile->mkdir("corr"); outFile->cd("corr"); TH2D *hDetaDphi = new TH2D("hDetaDphi","raw two-particle correlation; #Delta#eta; #Delta#phi",50,-5.0,5.0,50,-3.1416,3.1416); // debug ntuple outFile->cd(); TNtuple *nt=0; if(debug) nt = new TNtuple("nt","track debug ntuple", "pt:eta:phi:hits:pterr:d0:d0err:dz:dzerr:jet6:jet15:jet30"); //----- loop over events ----- unsigned int iEvent=0; for(event.toBegin(); !event.atEnd(); ++event, ++iEvent){ if( iEvent == maxEvents ) break; if( iEvent % 1000 == 0 ) cout << "Processing " << iEvent<< "th event: " << "run " << event.id().run() << ", lumi " << event.luminosityBlock() << ", evt " << event.id().event() << endl; // select on L1 trigger bits fwlite::Handle<L1GlobalTriggerReadoutRecord> gt; gt.getByLabel(event, "gtDigis"); const TechnicalTriggerWord& word = gt->technicalTriggerWord(); //before mask for(int bit=0; bit<64; bit++) hL1TechBits->Fill(bit,word.at(bit)); if(!word.at(0)) continue; // BPTX coincidence if(!(word.at(40) || word.at(41))) continue; // BSC coincidence if(word.at(36) || word.at(37) || word.at(38) || word.at(39)) continue; // BSC halo // select on coincidence of HF towers above threshold fwlite::Handle<CaloTowerCollection> towers; towers.getByLabel(event, "towerMaker"); int nHfTowersN=0, nHfTowersP=0; for(CaloTowerCollection::const_iterator calo = towers->begin(); calo != towers->end(); ++calo) { if(calo->energy() < hfEThreshold) continue; if(calo->eta()>3) nHfTowersP++; if(calo->eta()<-3) nHfTowersN++; } hHfTowers->Fill(nHfTowersP,nHfTowersN); if(nHfTowersP < nTowerThreshold || nHfTowersN < nTowerThreshold) continue; // get hlt bits bool accept[nTrigs]={}; fwlite::Handle<edm::TriggerResults> triggerResults; triggerResults.getByLabel(event, "TriggerResults","","HLT"); const edm::TriggerNames triggerNames = event.triggerNames(*triggerResults); for(int i=0; i<nTrigs; i++) { accept[i] = triggerResults->accept(triggerNames.triggerIndex(hltNames[i])); if(accept[i]) hHLTPaths->Fill(hltNames[i],1); } // select on requirement of valid vertex math::XYZPoint vtxpoint(0,0,0); fwlite::Handle<std::vector<reco::Vertex> > vertices; vertices.getByLabel(event, "hiSelectedVertex"); if(!vertices->size()) continue; const reco::Vertex & vtx = (*vertices)[0]; vtxpoint.SetCoordinates(vtx.x(),vtx.y(),vtx.z()); hVtxTrks->Fill(vtx.tracksSize()); hVtxZ->Fill(vtx.z()); // get beamspot fwlite::Handle<reco::BeamSpot> beamspot; beamspot.getByLabel(event, "offlineBeamSpot"); //----- loop over tracks ----- fwlite::Handle<std::vector<reco::Track> > tracks; tracks.getByLabel(event, "hiSelectedTracks"); for(unsigned it=0; it<tracks->size(); ++it){ const reco::Track & trk = (*tracks)[it]; // select tracks based on transverse proximity to beamspot double dxybeam = trk.dxy(beamspot->position()); if(fabs(dxybeam/trk.d0Error()) > normD0Cut) continue; // select tracks based on z-proximity to best vertex double dzvtx = trk.dz(vtxpoint); if(fabs(dzvtx/trk.dzError()) > normDZCut) continue; // fill selected track histograms and debug ntuple hTrkPt->Fill(trk.pt()); hTrkEta->Fill(trk.eta()); hTrkPhi->Fill(trk.phi()); if(debug && trk.pt() > ptDebug) // fill debug ntuple for selection of tracks nt->Fill(trk.pt(),trk.eta(),trk.phi(),trk.numberOfValidHits(),trk.ptError(), dxybeam,trk.d0Error(),dzvtx,trk.dzError(),accept[1],accept[2],accept[3]); } //----- loop over jets ----- fwlite::Handle<vector<reco::CaloJet> > jets; jets.getByLabel(event, "iterativeConePu5CaloJets"); //----- loop over muons ----- //----- loop over photons ----- //----- loop over charged candidates ----- fwlite::Handle<vector<reco::RecoChargedCandidate> > candidates; candidates.getByLabel(event, "allTracks"); for(unsigned it1=0; it1<candidates->size(); ++it1) { const reco::RecoChargedCandidate & c1 = (*candidates)[it1]; for(unsigned it2=0; it2<candidates->size(); ++it2) { if(it1==it2) continue; const reco::RecoChargedCandidate & c2 = (*candidates)[it2]; hDetaDphi->Fill(c1.eta()-c2.eta(),deltaPhi(c1.phi(),c2.phi())); } } } //end loop over events cout << "Number of events processed : " << iEvent << endl; cout << "Number passing all event selection cuts: " << hVtxZ->GetEntries() << endl; // write to output file hHLTPaths->LabelsDeflate(); outFile->Write(); outFile->ls(); outFile->Close(); }