int main (int argc, char** argv) { if (argc < 3) { printHelp() ; exit (1) ; } std::string inputfiles, inputdir ; std::string outputRootName = "histoTPG.root" ; int verbose = 0 ; int occupancyCut = 0 ; std::string l1algo ; bool ok(false) ; for (int i=0 ; i<argc ; i++) { if (argv[i] == std::string("-h") ) { printHelp() ; exit(1); } if (argv[i] == std::string("-i") && argc>i+1) { ok = true ; inputfiles = argv[i+1] ; } if (argv[i] == std::string("-d") && argc>i+1) inputdir = argv[i+1] ; if (argv[i] == std::string("-o") && argc>i+1) outputRootName = argv[i+1] ; if (argv[i] == std::string("-v") && argc>i+1) verbose = atoi(argv[i+1]) ; if (argv[i] == std::string("-l1") && argc>i+1) l1algo = std::string(argv[i+1]) ; if (argv[i] == std::string("--cutTPOccup") && argc>i+1) occupancyCut = atoi(argv[i+1]) ; } if (!ok) { std::cout<<"No input files have been given: nothing to do!"<<std::endl ; printHelp() ; exit(1); } std::vector<int> algobits ; std::vector<std::string> algos = split(l1algo,",") ; for (unsigned int i=0 ; i<algos.size() ; i++) algobits.push_back(atoi(algos[i].c_str())) ; unsigned int ref = 2 ; /////////////////////// // book the histograms /////////////////////// TH2F * occupancyTP = new TH2F("occupancyTP", "Occupancy TP data", 72, 1, 73, 38, -19, 19) ; occupancyTP->GetYaxis()->SetTitle("eta index") ; occupancyTP->GetXaxis()->SetTitle("phi index") ; TH2F * occupancyTPEmul = new TH2F("occupancyTPEmul", "Occupancy TP emulator", 72, 1, 73, 38, -19, 19) ; occupancyTPEmul->GetYaxis()->SetTitle("eta index") ; occupancyTPEmul->GetXaxis()->SetTitle("phi index") ; TH1F * TP = new TH1F("TP", "TP", 256, 0., 256.) ; TP->GetXaxis()->SetTitle("TP (ADC)") ; TH1F * TPEmul = new TH1F("TPEmul", "TP Emulator", 256, 0., 256.) ; TPEmul->GetXaxis()->SetTitle("TP (ADC)") ; TH1F * TPEmulMax = new TH1F("TPEmulMax", "TP Emulator max", 256, 0., 256.) ; TPEmulMax->GetXaxis()->SetTitle("TP (ADC)") ; TH3F * TPspectrumMap3D = new TH3F("TPspectrumMap3D", "TP data spectrum map", 72, 1, 73, 38, -19, 19, 256, 0., 256.) ; TPspectrumMap3D->GetYaxis()->SetTitle("eta index") ; TPspectrumMap3D->GetXaxis()->SetTitle("phi index") ; TH1F * TPMatchEmul = new TH1F("TPMatchEmul", "TP data matching Emulator", 7, -1., 6.) ; TH1F * TPEmulMaxIndex = new TH1F("TPEmulMaxIndex", "Index of the max TP from Emulator", 7, -1., 6.) ; TH3I * TPMatchEmul3D = new TH3I("TPMatchEmul3D", "TP data matching Emulator", 72, 1, 73, 38, -19, 19, 7, -1, 6) ; TPMatchEmul3D->GetYaxis()->SetTitle("eta index") ; TPMatchEmul3D->GetXaxis()->SetTitle("phi index") ; TH2I * ttfMismatch = new TH2I("ttfMismatch", "TTF mismatch map", 72, 1, 73, 38, -19, 19) ; ttfMismatch->GetYaxis()->SetTitle("eta index") ; ttfMismatch->GetXaxis()->SetTitle("phi index") ; /////////////////////// // Chain the trees: /////////////////////// TChain * chain = new TChain ("EcalTPGAnalysis") ; std::vector<std::string> files ; if (inputfiles.find(std::string(",")) != std::string::npos) files = split(inputfiles,",") ; if (inputfiles.find(std::string(":")) != std::string::npos) { std::vector<std::string> filesbase = split(inputfiles,":") ; if (filesbase.size() == 4) { int first = atoi(filesbase[1].c_str()) ; int last = atoi(filesbase[2].c_str()) ; for (int i=first ; i<=last ; i++) { std::stringstream name ; name<<filesbase[0]<<i<<filesbase[3] ; files.push_back(name.str()) ; } } } for (unsigned int i=0 ; i<files.size() ; i++) { files[i] = inputdir+"/"+files[i] ; std::cout<<"Input file: "<<files[i]<<std::endl ; chain->Add (files[i].c_str()) ; } EcalTPGVariables treeVars ; setBranchAddresses (chain, treeVars) ; int nEntries = chain->GetEntries () ; std::cout << "Number of entries: " << nEntries <<std::endl ; /////////////////////// // Main loop over entries /////////////////////// for (int entry = 0 ; entry < nEntries ; ++entry) { chain->GetEntry (entry) ; if (entry%1000==0) std::cout <<"------> "<< entry+1 <<" entries processed" << " <------\n" ; if (verbose>0) std::cout<<"Run="<<treeVars.runNb<<" Evt="<<treeVars.runNb<<std::endl ; // trigger selection if any bool keep(false) ; if (!algobits.size()) keep = true ; // keep all events when no trigger selection for (unsigned int algo = 0 ; algo<algobits.size() ; algo++) for (unsigned int ntrig = 0 ; ntrig < treeVars.nbOfActiveTriggers ; ntrig++) if (algobits[algo] == treeVars.activeTriggers[ntrig]) keep = true ; if (!keep) continue ; // loop on towers for (unsigned int tower = 0 ; tower < treeVars.nbOfTowers ; tower++) { int tp = getEt(treeVars.rawTPData[tower]) ; int emul[5] = {getEt(treeVars.rawTPEmul1[tower]), getEt(treeVars.rawTPEmul2[tower]), getEt(treeVars.rawTPEmul3[tower]), getEt(treeVars.rawTPEmul4[tower]), getEt(treeVars.rawTPEmul5[tower])} ; int maxOfTPEmul = 0 ; int indexOfTPEmulMax = -1 ; for (int i=0 ; i<5 ; i++) if (emul[i]>maxOfTPEmul) { maxOfTPEmul = emul[i] ; indexOfTPEmulMax = i ; } int ieta = treeVars.ieta[tower] ; int iphi = treeVars.iphi[tower] ; int nbXtals = treeVars.nbOfXtals[tower] ; int ttf = getTtf(treeVars.rawTPData[tower]) ; if (verbose>9 && (tp>0 || maxOfTPEmul>0)) { std::cout<<"(phi,eta, Nbxtals)="<<std::dec<<iphi<<" "<<ieta<<" "<<nbXtals<<std::endl ; std::cout<<"Data Et, TTF: "<<tp<<" "<<ttf<<std::endl ; std::cout<<"Emulator: " ; for (int i=0 ; i<5 ; i++) std::cout<<emul[i]<<" " ; std::cout<<std::endl ; } // Fill TP spctrum TP->Fill(tp) ; TPEmul->Fill(emul[ref]) ; TPEmulMax->Fill(maxOfTPEmul) ; TPspectrumMap3D->Fill(iphi, ieta, tp) ; // Fill TP occupancy if (tp>occupancyCut) occupancyTP->Fill(iphi, ieta) ; if (emul[ref]>occupancyCut) occupancyTPEmul->Fill(iphi, ieta) ; // Fill TP-Emulator matching // comparison is meaningful when: if (tp>0 && nbXtals == 25) { bool match(false) ; for (int i=0 ; i<5 ; i++) { if (tp == emul[i]) { TPMatchEmul->Fill(i+1) ; TPMatchEmul3D->Fill(iphi, ieta, i+1) ; match = true ; } } if (!match) { TPMatchEmul->Fill(-1) ; TPMatchEmul3D->Fill(iphi, ieta, -1) ; if (verbose>5) { std::cout<<"MISMATCH"<<std::endl ; std::cout<<"(phi,eta, Nbxtals)="<<std::dec<<iphi<<" "<<ieta<<" "<<nbXtals<<std::endl ; std::cout<<"Data Et, TTF: "<<tp<<" "<<ttf<<std::endl ; std::cout<<"Emulator: " ; for (int i=0 ; i<5 ; i++) std::cout<<emul[i]<<" " ; std::cout<<std::endl ; } } } if (maxOfTPEmul>0) TPEmulMaxIndex->Fill(indexOfTPEmulMax+1) ; // Fill TTF mismatch if ((ttf==1 || ttf==3) && nbXtals != 25) ttfMismatch->Fill(iphi, ieta) ; } // end loop towers } // endloop entries /////////////////////// // Format & write histos /////////////////////// // 1. TP Spectrum TProfile2D * TPspectrumMap = TPspectrumMap3D->Project3DProfile("yx") ; TPspectrumMap->SetName("TPspectrumMap") ; // 2. TP Timing TH2F * TPMatchEmul2D = new TH2F("TPMatchEmul2D", "TP data matching Emulator", 72, 1, 73, 38, -19, 19) ; TH2F * TPMatchFraction2D = new TH2F("TPMatchFraction2D", "TP data: fraction of non-single timing", 72, 1, 73, 38, -19, 19) ; TPMatchEmul2D->GetYaxis()->SetTitle("eta index") ; TPMatchEmul2D->GetXaxis()->SetTitle("phi index") ; TPMatchEmul2D->GetZaxis()->SetRangeUser(-1,6) ; TPMatchFraction2D->GetYaxis()->SetTitle("eta index") ; TPMatchFraction2D->GetXaxis()->SetTitle("phi index") ; for (int binx=1 ; binx<=72 ; binx++) for (int biny=1 ; biny<=38 ; biny++) { int maxBinz = 5 ; double maxCell = TPMatchEmul3D->GetBinContent(binx, biny, maxBinz) ; double totalCell(0) ; for (int binz=1; binz<=7 ; binz++) { double content = TPMatchEmul3D->GetBinContent(binx, biny, binz) ; if (content>maxCell) { maxCell = content ; maxBinz = binz ; } totalCell += content ; } if (maxCell <=0) maxBinz = 2 ; // empty cell TPMatchEmul2D->SetBinContent(binx, biny, float(maxBinz)-2.) ; //z must be in [-1,5] double fraction = 0 ; if (totalCell>0) fraction = 1.- maxCell/totalCell ; TPMatchFraction2D->SetBinContent(binx, biny, fraction) ; if (totalCell > maxCell && verbose>9) { std::cout<<"--->"<<std::endl ; for (int binz=1; binz<=7 ; binz++) { std::cout<< "(phi,eta, z): (" << TPMatchEmul3D->GetXaxis()->GetBinLowEdge(binx) << ", " << TPMatchEmul3D->GetYaxis()->GetBinLowEdge(biny) << ", " << TPMatchEmul3D->GetZaxis()->GetBinLowEdge(binz) << ") Content="<<TPMatchEmul3D->GetBinContent(binx, biny, binz) << ", erro="<<TPMatchEmul3D->GetBinContent(binx, biny, binz) << std::endl ; } } } TFile saving (outputRootName.c_str (),"recreate") ; saving.cd () ; occupancyTP->Write() ; occupancyTPEmul->Write() ; TP->Write() ; TPEmul->Write() ; TPEmulMax->Write() ; TPspectrumMap->Write() ; TPMatchEmul->Write() ; TPMatchEmul3D->Write() ; TPEmulMaxIndex->Write() ; TPMatchEmul2D->Write() ; TPMatchFraction2D->Write() ; ttfMismatch->Write() ; saving.Close () ; delete chain ; return 0 ; }
void ITSSDDQAMaker(char *iFile, Int_t MaxEvts=1000000, Int_t FirstEvt=0) { //To have Baseline Histos uncomment parts with " // BL!!! " comment cout << "SDD Quality Assurance Prototype Macro" << endl; const Int_t nSDDmodules= 260; const Int_t imodoffset = 240; const Int_t modtotSDD = nSDDmodules*2; const Int_t anode = 256; Float_t xi = -0.5; Float_t xf = xi + nSDDmodules; TH1F *hModulePattern = new TH1F("hModulePattern","Modules pattern",nSDDmodules,xi,xf); xf = xi + modtotSDD; TH1F *hModuleSidePattern = new TH1F("hModuleSidePattern","Modules/Side pattern",modtotSDD,xi,xf); TH2F *hModuleChargeMap[modtotSDD]; //260 dx e 260 sx with A, T, Q TH2F *hModuleCountsMap[modtotSDD]; //260 dx e 260 sx with A, T, Ncounts TH2I *hModuleCarlos = new TH2I("hModuleCarlos","hModuleCarlos",modtotSDD,xi,xf,101,-0.5,100.5); /* TH1F *hModuleSideBL[modtotSDD][anode]; // BL!!! */ //-------histograms definition Char_t *hisnam = new Char_t[50]; Char_t *histit = new Char_t[50]; Char_t *hisnam2 = new Char_t[50]; Char_t *histit2 = new Char_t[50]; Char_t *hisnam3 = new Char_t[50]; for(Int_t imod=0; imod<nSDDmodules;imod++){ for(Int_t isid=0;isid<2;isid++){ Int_t index=2*imod+isid; //260*2 position sprintf(hisnam,"chargeMap%d",index); sprintf(histit,"Total Charge, module number %d",index); hModuleChargeMap[index]=new TH2F(hisnam,histit,256,-0.5,255.5,256,-0.5,255.5); sprintf(hisnam2,"countsMap%d",index); sprintf(histit2,"Number of Counts, module number %d",index); hModuleCountsMap[index] = new TH2F(hisnam2,histit2,256,-0.5,255.5,256,-0.5,255.5); /* for(Int_t ianode=0; ianode<anode; ianode++){ // BL!!! sprintf(hisnam3,"BL_module_%d_%d",index,ianode); //cout<<hisnam3 <<endl; hModuleSideBL[index][ianode] = new TH1F(hisnam3,hisnam3,256,0.,1024.); } */ } } TString strFile = iFile; strFile += "?EventType=7"; AliRawReader *rd = new AliRawReaderDate(strFile.Data(),FirstEvt); // open run Int_t evCounter = 0; do{ // start loop on events if(++evCounter > MaxEvts) { cout << MaxEvts << " events read, stop" << endl; evCounter--; break; } cout << "Read Event: " << evCounter+FirstEvt-1 << endl; rd->RequireHeader(kFALSE); rd->Reset(); // reset the current position to the beginning of the event Int_t nSkip = 0; // number of skipped signals AliITSRawStreamSDD s(rd); //This class provides access to ITS SDD digits in raw data. Int_t iddl; Int_t isddmod; Int_t moduleSDD; gStyle->SetPalette(1); while(s.Next()){ //read the next raw digit; returns kFALSE if there is no digit left if(s.IsCompletedModule()) continue; if(s.IsCompletedDDL()) continue; iddl=rd->GetDDLID()-2; // -2 is temporary for test raw data isddmod=s.GetModuleNumber(iddl,s.GetCarlosId()); //this is the FEE Carlos //cout<<"DDLID= "<<iddl <<"; Module number= " <<isddmod <<endl; if(isddmod >= imodoffset) { hModulePattern->Fill(isddmod-imodoffset); // 0 to 259 so 240 to 499 moduleSDD=2*(isddmod-imodoffset)+s.GetChannel(); hModuleSidePattern->Fill(moduleSDD); // 0 to 519 hModuleCarlos->Fill(isddmod-imodoffset,s.GetCarlosId()); //cout << "anode " << s.GetCoord1() << ", time bin: " << s.GetCoord2() << ", charge: " << s.GetSignal() << endl; Int_t coord1 = s.GetCoord1(); Int_t coord2 = s.GetCoord2(); Int_t signal = s.GetSignal(); hModuleChargeMap[moduleSDD]->Fill(coord2, coord1,signal); hModuleCountsMap[moduleSDD]->Fill(coord2, coord1 ); //hModuleSideBL[moduleSDD][coord1]->Fill(signal); // BL !!! } else { nSkip++; } } cout << "End of Event " << evCounter+FirstEvt-1 << ", " << nSkip << " wrong module numbers" << endl; } while(rd->NextEvent()); // end loop on events delete rd; cout << "end after " << evCounter << " events" << endl; /* TNtuple *Baseline = new TNtuple("Baseline","Baseline","HalfModule:Anode:Mean:RMS"); // BL!!! Float_t meanBL; Float_t rmsBL; */ for(Int_t i=0; i<modtotSDD; i++){ if(hModuleSidePattern->GetBinContent(i+1)){ //check if they're not empty hModuleChargeMap[i]->GetXaxis()->SetTitle("Time Bin"); hModuleChargeMap[i]->GetYaxis()->SetTitle("Anode"); hModuleCountsMap[i]->GetXaxis()->SetTitle("Time Bin"); hModuleCountsMap[i]->GetYaxis()->SetTitle("Anode"); /* for(Int_t ianode=0; ianode<anode; ianode++ ){ // BL!!! hModuleSideBL[i][ianode]->GetXaxis()->SetTitle("ADC counts"); hModuleSideBL[i][ianode]->GetYaxis()->SetTitle("#"); meanBL = hModuleSideBL[i][ianode]->GetMean(); rmsBL = hModuleSideBL[i][ianode]->GetRMS(); gaussfitBL = hModuleSideBL[i][ianode]->Fit("gaus"); Baseline->Fill(i,ianode,meanBL,rmsBL); } */ } } hModuleSidePattern->GetXaxis()->SetTitle("2*(Module Number-1)+Side"); hModuleSidePattern->GetYaxis()->SetTitle("Counts"); hModulePattern->GetXaxis()->SetTitle("Module Number"); hModulePattern->GetYaxis()->SetTitle("Counts"); //-------store Histograms cout << "Store Histograms" << endl; TString oFileName(iFile); oFileName.Append(".root"); TFile *oFile = TFile::Open(oFileName,"recreate"); hModulePattern->Write(); hModuleSidePattern->Write(); hModuleCarlos->Write(); for(Int_t i=0; i<modtotSDD; i++){ if(hModuleSidePattern->GetBinContent(i+1)){ //check if they're not empty hModuleChargeMap[i]->Write(); hModuleCountsMap[i]->Write(); /* for(Int_t ianode=0; ianode<anode; ianode++ ){ // BL!!! hModuleSideBL[i][ianode]->Write(); Baseline->Write(); } */ } } oFile->Close(); cout << "Clear memory" << endl; for(Int_t imod=0; imod<nSDDmodules;imod++){ for(Int_t isid=0;isid<2;isid++){ Int_t index=2*imod+isid; //260*2 position delete hModuleChargeMap[index]; delete hModuleCountsMap[index]; /* for(Int_t ianode=0; ianode<anode; ianode++ ){ // BL!!! delete hModuleSideBL[index][ianode]; delete Baseline; } */ } } delete hModulePattern; delete hModuleSidePattern; delete hModuleCarlos; }
void makePUM0Table() { const TString l1_input = "/mnt/hadoop/cms/store/user/luck/L1Emulator/minbiasHIanalyzer_withregions.root"; TFile *lFile = TFile::Open(l1_input); TTree *l1Tree = (TTree*)lFile->Get("L1UpgradeAnalyzer/L1UpgradeTree"); Int_t l1_event, l1_run; Int_t l1_num; Int_t region_hwPt[NREG], region_hwEta[NREG], region_hwPhi[NREG], region_tauVeto[NREG]; l1Tree->SetBranchAddress("event",&l1_event); l1Tree->SetBranchAddress("run",&l1_run); l1Tree->SetBranchAddress("nRegions",&l1_num); l1Tree->SetBranchAddress("region_hwPt",region_hwPt); l1Tree->SetBranchAddress("region_hwEta",region_hwEta); l1Tree->SetBranchAddress("region_hwPhi",region_hwPhi); l1Tree->SetBranchAddress("region_tauVeto",region_tauVeto); const TString forest_input = "/mnt/hadoop/cms/store/user/luck/L1Emulator/minbiasForest_merged_v2/HiForest_PbPb_Data_minbias_fromSkim.root"; TFile *fFile = TFile::Open(forest_input); TTree *fEvtTree = (TTree*)fFile->Get("hiEvtAnalyzer/HiTree"); TTree *fSkimTree = (TTree*)fFile->Get("skimanalysis/HltTree"); Int_t f_evt, f_run, f_lumi; Int_t hiBin; fEvtTree->SetBranchAddress("evt",&f_evt); fEvtTree->SetBranchAddress("run",&f_run); fEvtTree->SetBranchAddress("lumi",&f_lumi); fEvtTree->SetBranchAddress("hiBin",&hiBin); Int_t pcollisionEventSelection, pHBHENoiseFilter; fSkimTree->SetBranchAddress("pcollisionEventSelection",&pcollisionEventSelection); fSkimTree->SetBranchAddress("pHBHENoiseFilter",&pHBHENoiseFilter); TFile *outFile = new TFile("HI_PUM0_evtsel_out.root","RECREATE"); std::map<Long64_t, Long64_t> kmap; // choose loop over l1 tree first (smaller) //std::cout << "Begin making map." << std::endl; Long64_t l_entries = l1Tree->GetEntries(); for(Long64_t j = 0; j < l_entries; ++j) { l1Tree->GetEntry(j); Long64_t key = makeKey(l1_run, l1_event); std::pair<Long64_t,Long64_t> p(key,j); kmap.insert(p); } //std::cout << "Finished making map." << std::endl; outFile->cd(); TH1I *hists[22][18]; // [eta][pu bin], arbitrary value of 18 for # bins in pu for(int i = 0; i < 22; ++i) for(int j = 0; j < 18; ++j) { hists[i][j] = new TH1I(Form("hist_%d_%d",i,j),"", 1024,0,1024); } TH2I *centPUM = new TH2I("cenPUM","",200,0,200,396,0,396); int count = 0; Long64_t entries = fEvtTree->GetEntries(); for(Long64_t j = 0; j < entries; ++j) { //if(j % 10000 == 0) // printf("%lld / %lld\n",j,entries); fEvtTree->GetEntry(j); Long64_t key = makeKey(f_run, f_evt); std::map<Long64_t,Long64_t>::const_iterator got = kmap.find(key); if(got == kmap.end() ) { continue; } else { l1Tree->GetEntry(got->second); kmap.erase(key); count++; fSkimTree->GetEntry(j); if((pcollisionEventSelection == 1) && (pHBHENoiseFilter == 1)) { //int pubin = (int) ( (double)hiBin * (18.0/200.0)); int PUM0 = 0; for(int i = 0; i < NREG; ++i) { if(region_hwPt[i] > 0) ++PUM0; } int pubin = PUM0/22; if(pubin == 18) pubin = 17; //special case for every region firing for(int i = 0; i < NREG; ++i) { hists[region_hwEta[i]][pubin]->Fill(region_hwPt[i]); } centPUM->Fill(hiBin,PUM0); } } } std::cout << "cms.vdouble("; TH1D *hists_eta[22]; for(int i = 0; i < 22; ++i) { hists_eta[i] = new TH1D(Form("hists_eta_%d",i),"",18,0,17); for(int j = 0; j < 18; ++j) { double Mean = hists[i][j]->GetMean(); double MeanError = hists[i][j]->GetMeanError(); hists_eta[i]->SetBinContent(j,Mean); hists_eta[i]->SetBinError(j,MeanError); std::cout << Mean*0.5; if(!((i == 21) && (j == 17))) std::cout << ", "; } } std::cout << ")" << std::endl; for(int i = 0; i < 22; ++i) { hists_eta[i]->Write(); for(int j = 0; j < 18; ++j) { hists[i][j]->Write(); } } centPUM->Write(); //std::cout << "Matching entries: " << count << std::endl; lFile->Close(); fFile->Close(); outFile->Close(); }