void plotPedestalAnalysis(string inputFileName, string outputDIR, bool testDoubleGaussianChannels){ system(("mkdir -p "+outputDIR).c_str()); setTDRStyle(); gROOT->SetBatch(kTRUE); TFile* inputFile = TFile::Open(inputFileName.c_str(),"READ"); inputFile->cd(); TTree* tree = (TTree*) inputFile->Get("pedestalFullNoise"); uint32_t detid,fedKey; uint16_t fecCrate,fecSlot, fecRing, ccuAdd, ccuChan, lldChannel, fedId, fedCh, apvId, stripId; float fitChi2Probab, kSProbab, jBProbab, aDProbab, fitChi2; float noiseSkewness, noiseKurtosis; float fitGausMean, fitGausSigma, fitGausNormalization; float fitGausMeanError, fitGausSigmaError, fitGausNormalizationError; vector<float>* noiseDistribution = 0; vector<float>* noiseDistributionError = 0; float nBin, xMin, xMax; tree->SetBranchStatus("*",kFALSE); tree->SetBranchStatus("detid",kTRUE); tree->SetBranchStatus("fedKey",kTRUE); tree->SetBranchStatus("fecCrate",kTRUE); tree->SetBranchStatus("fecSlot",kTRUE); tree->SetBranchStatus("fecRing",kTRUE); tree->SetBranchStatus("ccuAdd",kTRUE); tree->SetBranchStatus("ccuChan",kTRUE); tree->SetBranchStatus("lldChannel",kTRUE); tree->SetBranchStatus("fedId",kTRUE); tree->SetBranchStatus("fedCh",kTRUE); tree->SetBranchStatus("apvId",kTRUE); tree->SetBranchStatus("stripId",kTRUE); tree->SetBranchStatus("fitChi2",kTRUE); tree->SetBranchStatus("fitChi2Probab",kTRUE); tree->SetBranchStatus("kSProbab",kTRUE); tree->SetBranchStatus("jBProbab",kTRUE); tree->SetBranchStatus("aDProbab",kTRUE); tree->SetBranchStatus("fitGausNormalization",kTRUE); tree->SetBranchStatus("fitGausMean",kTRUE); tree->SetBranchStatus("fitGausSigma",kTRUE); tree->SetBranchStatus("fitGausNormalizationError",kTRUE); tree->SetBranchStatus("fitGausMeanError",kTRUE); tree->SetBranchStatus("fitGausSigmaError",kTRUE); tree->SetBranchStatus("noiseSkewness",kTRUE); tree->SetBranchStatus("noiseKurtosis",kTRUE); tree->SetBranchStatus("noiseDistribution",kTRUE); tree->SetBranchStatus("noiseDistributionError",kTRUE); tree->SetBranchStatus("nBin",kTRUE); tree->SetBranchStatus("xMin",kTRUE); tree->SetBranchStatus("xMax",kTRUE); tree->SetBranchAddress("detid",&detid); tree->SetBranchAddress("fedKey",&fedKey); tree->SetBranchAddress("fecCrate",&fecCrate); tree->SetBranchAddress("fecSlot",&fecSlot); tree->SetBranchAddress("fecRing",&fecRing); tree->SetBranchAddress("ccuAdd",&ccuAdd); tree->SetBranchAddress("ccuChan",&ccuChan); tree->SetBranchAddress("lldChannel",&lldChannel); tree->SetBranchAddress("fedId",&fedId); tree->SetBranchAddress("fedCh",&fedCh); tree->SetBranchAddress("apvId",&apvId); tree->SetBranchAddress("stripId",&stripId); tree->SetBranchAddress("fitGausNormalization",&fitGausNormalization); tree->SetBranchAddress("fitGausMean",&fitGausMean); tree->SetBranchAddress("fitGausSigma",&fitGausSigma); tree->SetBranchAddress("fitGausNormalizationError",&fitGausNormalizationError); tree->SetBranchAddress("fitGausMeanError",&fitGausMeanError); tree->SetBranchAddress("fitGausSigmaError",&fitGausSigmaError); tree->SetBranchAddress("fitChi2",&fitChi2); tree->SetBranchAddress("fitChi2Probab",&fitChi2Probab); tree->SetBranchAddress("noiseSkewness",&noiseSkewness); tree->SetBranchAddress("noiseKurtosis",&noiseKurtosis); tree->SetBranchAddress("kSProbab",&kSProbab); tree->SetBranchAddress("aDProbab",&aDProbab); tree->SetBranchAddress("jBProbab",&jBProbab); tree->SetBranchAddress("noiseDistribution",&noiseDistribution); tree->SetBranchAddress("noiseDistributionError",&noiseDistributionError); tree->SetBranchAddress("nBin",&nBin); tree->SetBranchAddress("xMin",&xMin); tree->SetBranchAddress("xMax",&xMax); TFile* badStripsNFilledBins = new TFile((outputDIR+"/badStripsNFilledBins.root").c_str(),"RECREATE"); TFile* badKsTest = new TFile((outputDIR+"/badStripsKsTest.root").c_str(),"RECREATE"); TFile* badjBTest = new TFile((outputDIR+"/badStripsjBTest.root").c_str(),"RECREATE"); TFile* badChi2Test = new TFile((outputDIR+"/badStripsChi2Test.root").c_str(),"RECREATE"); TFile* badaDTest = new TFile((outputDIR+"/badStripsaDTest.root").c_str(),"RECREATE"); TFile* badCombinedTest = new TFile((outputDIR+"/badStripsCombined.root").c_str(),"RECREATE"); TFile* badJBNotKSTest = new TFile((outputDIR+"/badStripsjBNotKS.root").c_str(),"RECREATE"); TFile* badaDNotKSandjBTest = new TFile((outputDIR+"/badStripaDNotKSNotjB.root").c_str(),"RECREATE"); TFile* badChi2NotKSandjBandaDTest = new TFile((outputDIR+"/badStripsChi2NotKsandjBandaD.root").c_str(),"RECREATE"); long int nbadNFilledBins = 0; long int nbadKsTest = 0; long int nbadjBTest = 0; long int nbadaDTest = 0; long int nbadChi2Test = 0; long int nbadCombinedTest = 0; long int nbadJBNotKSTest = 0; long int nbadaDNotKSandjBTest = 0; long int nbadChi2NotKSandjBandaDTest = 0; long int nbadDoublePeakDistance = 0; long int nbadDoublePeakAshman = 0; long int nbadDoublePeakChi2 = 0; long int nbadDoublePeakAmplitude = 0; long int nbadDoublePeakBimodality = 0; long int nbadDoublePeakCombined = 0; TCanvas* canvas = new TCanvas("canvas","canvas",600,650); map<uint32_t,uint32_t> moduleDenominator; map<uint32_t,uint32_t> moduleNumerator; // map<uint32_t,uint32_t> moduleNonEdgeNumerator; // map<uint32_t,uint32_t> moduleAPVEdgeNumerator; map<uint32_t,uint32_t> moduleNumeratorFilledBins; map<uint32_t,uint32_t> moduleNumeratorKS; map<uint32_t,uint32_t> moduleNumeratorJB; map<uint32_t,uint32_t> moduleNumeratorDoublePeak; vector<TrackerStrip> badStrip; TH1F* noiseHist = NULL; TF1* noiseFit = NULL; TF1* noiseFit2Gaus = NULL; TFitResultPtr result; TH1F* chi2Distance = new TH1F("chi2Distance","",100,0,1); chi2Distance->Sumw2(); TH1F* peakDistance = new TH1F("peakDistance","",100,0,3); peakDistance->Sumw2(); TH1F* ashmanDistance = new TH1F("ashmanDistance","",100,0,5); ashmanDistance->Sumw2(); TH1F* bimodalityDistance = new TH1F("bimodalityDistance","",100,0,1); bimodalityDistance->Sumw2(); TH1F* amplitudeRatioDistance = new TH1F("amplitudeRatioDistance","",100,0,3); amplitudeRatioDistance->Sumw2(); TFile* multiPeakChannelsChi2 = new TFile((outputDIR+"/multiPeakChannelsChi2.root").c_str(),"RECREATE"); TFile* multiPeakChannelsDistance = new TFile((outputDIR+"/multiPeakChannelsDistance.root").c_str(),"RECREATE"); TFile* multiPeakChannelsAshman = new TFile((outputDIR+"/multiPeakChannelsAshman.root").c_str(),"RECREATE"); TFile* multiPeakChannelsAmplitude = new TFile((outputDIR+"/multiPeakChannelsAmplitude.root").c_str(),"RECREATE"); TFile* multiPeakChannelsBimodality = new TFile((outputDIR+"/multiPeakChannelsBimodality.root").c_str(),"RECREATE"); TFile* multiPeakChannelsCombined = new TFile((outputDIR+"/multiPeakChannelsCombined.root").c_str(),"RECREATE"); int nonNullBins = 0; float chi2Ratio = 0; float distance = 0; float ashman = 0; float bimodality = 0; float amplitudeRatio = 0; bool isfound = false; string fedKeyStr ; TString name ; std::map<string,string> fitParam; for(long int iChannel = 0; iChannel < tree->GetEntries(); iChannel++){ tree->GetEntry(iChannel); cout.flush(); if(iChannel %10000 == 0) cout<<"\r"<<"iChannel "<<100*double(iChannel)/(tree->GetEntries()/reductionFactor)<<" % "; if(iChannel > double(tree->GetEntries())/reductionFactor) break; // skip problematic fed id isfound = false; for(auto skipfed : skipFEDid){ if(fedId == skipfed) isfound = true; } if(isfound) continue; // make selections to identify bad noisy channels (not gaussian ones) std::stringstream stream; stream << std::hex << fedKey; fedKeyStr = stream.str(); if(fedKeyStr.size() == 4) name = Form("fecCrate%d_fecSlot%d_fecRing%d_ccuAdd%d_ccuCh%d_fedKey0x0000%s_lldCh%d_apv%d_strip%d",fecCrate,fecSlot,fecRing,ccuAdd,ccuChan,fedKeyStr.c_str(),lldChannel,apvId,stripId); else if(fedKeyStr.size() == 5) name = Form("fecCrate%d_fecSlot%d_fecRing%d_ccuAdd%d_ccuCh%d_fedKey0x000%s_lldCh%d_apv%d_strip%d",fecCrate,fecSlot,fecRing,ccuAdd,ccuChan,fedKeyStr.c_str(),lldChannel,apvId,stripId); fitParam.clear(); stringstream sMean; sMean << std::scientific << fitGausMean; fitParam["fitGausMean"] = sMean.str(); stringstream sSigma; sSigma << std::scientific << fitGausSigma; fitParam["fitGausSigma"] = sSigma.str(); stringstream sSkew; sSkew << std::scientific << noiseSkewness; fitParam["noiseSkewness"] = sSkew.str(); stringstream sKurt; sKurt << std::scientific << noiseKurtosis; fitParam["noiseKurtosis"] = sKurt.str(); stringstream sKS; sKS << std::scientific << kSProbab; fitParam["kSProbab"] = sKS.str(); stringstream sJB; sJB << std::scientific << jBProbab; fitParam["jBProbab"] = sJB.str(); stringstream sChi2; sChi2 << std::scientific << fitChi2Probab; fitParam["fitChi2Probab"] = sChi2.str(); stringstream sAD; sAD << std::scientific << aDProbab; fitParam["aDProbab"] = sAD.str(); moduleDenominator[detid] = moduleDenominator[detid]+1; if(noiseHist == NULL){ noiseHist = new TH1F ("noiseHist","",nBin,xMin,xMax); noiseHist->Sumw2(); } noiseHist->Reset(); for(int iBin = 0; iBin < noiseDistribution->size(); iBin++){ noiseHist->SetBinContent(iBin+1,noiseDistribution->at(iBin)); noiseHist->SetBinError(iBin+1,noiseDistributionError->at(iBin)); } if(noiseFit == NULL) noiseFit = new TF1 ("noiseFist","gaus(0)",xMin,xMax); noiseFit->SetRange(xMin,xMax); noiseFit->SetParameters(fitGausNormalization,fitGausMean,fitGausSigma); noiseFit->SetParError(0,fitGausNormalizationError); noiseFit->SetParError(1,fitGausMeanError); noiseFit->SetParError(2,fitGausSigmaError); nonNullBins = 0; for(int iBin = 0; iBin < noiseHist->GetNbinsX(); iBin++){ if(noiseHist->GetBinContent(iBin+1) != 0) nonNullBins++; } if(nonNullBins < nFilledBinSelection or noiseHist->GetRMS() < minimumRMS){ badStripsNFilledBins->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); nbadNFilledBins++; moduleNumeratorFilledBins[detid] +=1; continue; } if(kSProbab < quantile3sigma){ badKsTest->cd(); nbadKsTest++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); moduleNumeratorKS[detid] += 1; } if(jBProbab < quantile5sigma){ badjBTest->cd(); nbadjBTest++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); } if(fitChi2Probab < quantile4sigma){ badChi2Test->cd(); nbadChi2Test++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); } if(aDProbab < quantile3sigma){ badaDTest->cd(); nbadaDTest++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); } if(jBProbab < quantile5sigma and kSProbab > quantile3sigma and kSProbab < quantile){ badJBNotKSTest->cd(); nbadJBNotKSTest++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); moduleNumeratorJB[detid] += 1; } if(aDProbab < quantile3sigma and jBProbab > quantile5sigma and kSProbab > quantile3sigma and kSProbab < quantile){ badaDNotKSandjBTest->cd(); nbadaDNotKSandjBTest++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); } if(fitChi2Probab < quantile4sigma and jBProbab > quantile5sigma and kSProbab > quantile3sigma and kSProbab < quantile and aDProbab > quantile3sigma){ badChi2NotKSandjBandaDTest->cd(); nbadChi2NotKSandjBandaDTest++; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); } if(kSProbab < quantile3sigma or (kSProbab > quantile3sigma and kSProbab < quantile and jBProbab < quantile5sigma) or (kSProbab > quantile3sigma and kSProbab < quantile and jBProbab > quantile5sigma and aDProbab < quantile3sigma) or (kSProbab > quantile3sigma and kSProbab < quantile and jBProbab > quantile5sigma and aDProbab > quantile3sigma and fitChi2Probab < quantile4sigma)){ badCombinedTest->cd(); nbadCombinedTest++; moduleNumerator[detid] = moduleNumerator[detid]+1; //if(stripId == 1 or stripId == 128) // moduleAPVEdgeNumerator[detid] = moduleAPVEdgeNumerator[detid]+1; //else // moduleNonEdgeNumerator[detid] = moduleNonEdgeNumerator[detid]+1; storeOutputCanvas(canvas,noiseHist,noiseFit,name,fitParam); name = Form("fecCrate%d_fecSlot%d_fecRing%d_ccuAdd%d_ccuCh%d_fedKey0x0000%s_lldCh%d_apv%d_strip%d",fecCrate,fecSlot,fecRing,ccuAdd,ccuChan,fedKeyStr.c_str(),lldChannel,apvId,stripId); badStrip.push_back(TrackerStrip(fecCrate,fecSlot,fecRing,ccuAdd,ccuChan,uint32_t(atoi(fedKeyStr.c_str())),lldChannel,apvId,stripId)); //try to identify double peaked channels if(testDoubleGaussianChannels){ if(noiseFit2Gaus == NULL) // double gaussian in which the sigma is constrained to be the same --> identifing clear two peak channels noiseFit2Gaus = new TF1("dgaus","[0]*exp(-((x-[1])*(x-[1]))/(2*[2]*[2]))+[3]*exp(-((x-[4])*(x-[4]))/(2*[5]*[5]))",xMin,xMax); noiseFit2Gaus->SetRange(xMin,xMax); noiseFit2Gaus->SetParameter(0,fitGausNormalization/2); noiseFit2Gaus->SetParameter(3,fitGausNormalization/2); noiseFit2Gaus->SetParameter(1,1.); noiseFit2Gaus->SetParameter(4,-1.); noiseFit2Gaus->SetParameter(2,fitGausSigma); noiseFit2Gaus->SetParameter(5,fitGausSigma); noiseFit2Gaus->SetParLimits(1,0.,xMax); noiseFit2Gaus->SetParLimits(4,xMin,0); result = noiseHist->Fit(noiseFit2Gaus,"QSR"); chi2Ratio = 0; distance = 0; ashman = 0; bimodality = 0; amplitudeRatio = 0; if(result.Get() or noiseHist->Integral() == 0){ //compute the chi2 ratio chi2Ratio = 0.5*ROOT::Math::chisquared_cdf_c((fitChi2/(result->Ndf()+3))/(result->Chi2()/result->Ndf()),1); chi2Distance->Fill(chi2Ratio); distance = fabs(noiseFit2Gaus->GetParameter(1)-noiseFit2Gaus->GetParameter(4))/(2*sqrt(noiseFit2Gaus->GetParameter(2)*noiseFit2Gaus->GetParameter(5))); peakDistance->Fill(distance); ashman = TMath::Power(2,0.5)*abs(noiseFit2Gaus->GetParameter(1)-noiseFit2Gaus->GetParameter(4))/(sqrt(pow(noiseFit2Gaus->GetParameter(2),2)+pow(noiseFit2Gaus->GetParameter(5),2))); ashmanDistance->Fill(ashman); if(nonNullBins > 3) bimodality = (noiseHist->GetSkewness()*noiseHist->GetSkewness()+1)/(noiseHist->GetKurtosis()+3*(nonNullBins-1)*(nonNullBins-1)/((nonNullBins-2)*(nonNullBins-3))); else bimodality = (noiseHist->GetSkewness()*noiseHist->GetSkewness()+1)/(noiseHist->GetKurtosis()); bimodalityDistance->Fill(bimodality); amplitudeRatio = std::min(noiseFit2Gaus->GetParameter(0),noiseFit2Gaus->GetParameter(3))/std::max(noiseFit2Gaus->GetParameter(0),noiseFit2Gaus->GetParameter(3)); amplitudeRatioDistance->Fill(amplitudeRatio); if(distance > 1){ multiPeakChannelsDistance->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,noiseFit2Gaus,name); nbadDoublePeakDistance++; } if(ashman > 2){ multiPeakChannelsAshman->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,noiseFit2Gaus,name); nbadDoublePeakAshman++; } if(chi2Ratio < 0.05){ multiPeakChannelsChi2->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,noiseFit2Gaus,name); nbadDoublePeakChi2++; } if(amplitudeRatio > 0.85){ multiPeakChannelsAmplitude->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,noiseFit2Gaus,name); nbadDoublePeakAmplitude++; } if(bimodality > 0.55){ multiPeakChannelsBimodality->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,noiseFit2Gaus,name); nbadDoublePeakBimodality++; } if(ashman > 2 && amplitudeRatio > 0.85){ multiPeakChannelsCombined->cd(); storeOutputCanvas(canvas,noiseHist,noiseFit,noiseFit2Gaus,name); nbadDoublePeakCombined++; moduleNumeratorDoublePeak[detid]++; } } } } } // plot the chi2 and peak distance if(testDoubleGaussianChannels){ storeOutputCanvas(canvas,chi2Distance,"chi2TestStatistics",outputDIR); storeOutputCanvas(canvas,peakDistance,"peakDistanceTestStatistics",outputDIR); storeOutputCanvas(canvas,ashmanDistance,"ashmanTestStatistics",outputDIR); storeOutputCanvas(canvas,amplitudeRatioDistance,"amplitudeRatioDistance",outputDIR); storeOutputCanvas(canvas,bimodalityDistance,"bimodalityDistance",outputDIR); } std::cout<<std::endl; badStripsNFilledBins->Close(); badKsTest->Close(); badaDTest->Close(); badjBTest->Close(); badChi2Test->Close(); badCombinedTest->Close(); badJBNotKSTest->Close(); badaDNotKSandjBTest->Close(); badChi2NotKSandjBandaDTest->Close(); multiPeakChannelsCombined->Close(); ////// multiPeakChannelsChi2->Close(); multiPeakChannelsDistance->Close(); multiPeakChannelsAshman->Close(); multiPeakChannelsAmplitude->Close(); multiPeakChannelsBimodality->Close(); cout<<"#### Bad Nfilled bins "<<nbadNFilledBins<<" --> "<<double(nbadNFilledBins)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad KS Test Channels "<<nbadKsTest<<" ---> "<<double(nbadKsTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad JB Test Channels "<<nbadjBTest<<" ---> "<<double(nbadjBTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad AD Test Channels "<<nbadaDTest<<" ---> "<<double(nbadaDTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad Chi2 Test Channels "<<nbadChi2Test<<" ---> "<<double(nbadChi2Test)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad JB but not KS Test Channels "<<nbadJBNotKSTest<<" ---> "<<double(nbadJBNotKSTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad AD but not KS and not JB Test Channels "<<nbadaDNotKSandjBTest<<" ---> "<<double(nbadaDNotKSandjBTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad Chi2 but not KS and JB and AD Test Channels "<<nbadChi2NotKSandjBandaDTest<<" ---> "<<double(nbadChi2NotKSandjBandaDTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"#### Bad Combined Test Channels "<<nbadCombinedTest<<" ---> "<<double(nbadCombinedTest)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; if(testDoubleGaussianChannels){ cout<<"###############################"<<endl; cout<<"#### Multiple peak finder ####"<<endl; cout<<"##############################"<<endl; cout<<"Two peak by Chi2 "<<nbadDoublePeakChi2<<" --> "<<double(nbadDoublePeakChi2)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"Two peak by Distance "<<nbadDoublePeakDistance<<" --> "<<double(nbadDoublePeakDistance)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"Two peak by Ashman "<<nbadDoublePeakAshman<<" --> "<<double(nbadDoublePeakAshman)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"Two peak by Amplitude "<<nbadDoublePeakAmplitude<<" --> "<<double(nbadDoublePeakAmplitude)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"Two peak by Bimodality "<<nbadDoublePeakBimodality<<" --> "<<double(nbadDoublePeakBimodality)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; cout<<"Two peak by Combibed "<<nbadDoublePeakCombined<<" ---> "<<double(nbadDoublePeakCombined)/(tree->GetEntries()/reductionFactor)<<" % "<<endl; } /// -------> ofstream channelMap ((outputDIR+"/fractionOfGoodChannels.txt").c_str()); for(auto module : moduleDenominator) channelMap << module.first <<" "<< 1. - double(moduleNumerator[module.first])/double(moduleDenominator[module.first]) << "\n"; channelMap.close(); /// -------> ofstream nchannelMapFilledBins ((outputDIR+"/numberBadChannelsFilledBins.txt").c_str()); for(auto module : moduleNumeratorFilledBins) nchannelMapFilledBins << module.first <<" "<< moduleNumeratorFilledBins[module.first] << "\n"; nchannelMapFilledBins.close(); /// -------> ofstream nchannelMap ((outputDIR+"/numberBadChannels.txt").c_str()); for(auto module : moduleNumerator) nchannelMap << module.first <<" "<< moduleNumerator[module.first] << "\n"; nchannelMap.close(); /// -------> // ofstream nNonEdgechannelMap ((outputDIR+"/numberBadChannelsNonEdge.txt").c_str()); // for(auto module : moduleNonEdgeNumerator) // nNonEdgechannelMap << module.first <<" "<< moduleNonEdgeNumerator[module.first] << "\n"; // nNonEdgechannelMap.close(); /// -------> // ofstream nAPVEdgechannelMap ((outputDIR+"/numberBadChannelsAPVEdge.txt").c_str()); // for(auto module : moduleAPVEdgeNumerator) // nAPVEdgechannelMap << module.first <<" "<< moduleAPVEdgeNumerator[module.first] << "\n"; // nAPVEdgechannelMap.close(); /// -------> ofstream nchannelMapKS ((outputDIR+"/numberBadChannelsKS.txt").c_str()); for(auto module : moduleNumeratorKS) nchannelMapKS << module.first <<" "<< moduleNumeratorKS[module.first] << "\n"; nchannelMapKS.close(); /// -------> ofstream nchannelMapJB ((outputDIR+"/numberBadChannelsJB.txt").c_str()); for(auto module : moduleNumeratorJB) nchannelMapJB << module.first <<" "<< moduleNumeratorKS[module.first] << "\n"; nchannelMapJB.close(); /// -------> ofstream nchannelMapDoublePeak ((outputDIR+"/numberBadChannelsDoublePeak.txt").c_str()); for(auto module : moduleNumeratorDoublePeak) nchannelMapDoublePeak << module.first <<" "<< moduleNumeratorDoublePeak[module.first] << "\n"; nchannelMapDoublePeak.close(); // ------> detailed info of bad strips ofstream badStripDump ((outputDIR+"/badStripDump.txt").c_str()); for(auto badstrip : badStrip){ badStripDump<< badstrip.fecCrate_<<" "<<badstrip.fecSlot_<<" "<<badstrip.fecRing_<<" "<<badstrip.ccuAdd_<<" "<<badstrip.ccuCh_<<" "<<badstrip.fedKey_<<" "<<badstrip.lldCh_<<" "<<badstrip.apvid_<<" "<<badstrip.stripid_<<" \n"; } badStripDump.close(); }
void fullPedestalAnalysis(string inputDIR, string outputDIR, string inputCablingMap, string outputFileName){ gROOT->ProcessLine("gErrorIgnoreLevel = 1"); // open the file and prepare the cluster tree, adding the other trees as frined --> memory consuming std::cout<<"##################################"<<std::endl; std::cout<<"###### fullPedestalAnalysis ######"<<std::endl; std::cout<<"##################################"<<std::endl; clock_t tStart = clock(); // prepare style and load macros setTDRStyle(); gROOT->SetBatch(kTRUE); system(("mkdir -p "+outputDIR).c_str()); ifstream file; std::cout<<"### Make input file list"<<std::endl; system(("find "+inputDIR+" -name \"*.root\" > file.temp").c_str()); std::ifstream infile; string line; vector<string> fileList; infile.open("file.temp",ifstream::in); if(infile.is_open()){ while(!infile.eof()){ getline(infile,line); if(line != "" and TString(line).Contains(".root") and line !="\n"){ fileList.push_back(line); } } } system("rm file.temp"); std::sort(fileList.begin(),fileList.end()); TFile* cablingFile = TFile::Open(inputCablingMap.c_str(),"READ"); cablingFile->cd(); TTree* readoutMap = (TTree*) cablingFile->FindObjectAny("readoutMap"); TTreeReader reader(readoutMap); TTreeReaderValue<uint32_t> detid (reader,"detid"); TTreeReaderValue<uint16_t> fecCrate (reader,"fecCrate"); TTreeReaderValue<uint16_t> fecSlot (reader,"fecSlot"); TTreeReaderValue<uint16_t> fecRing (reader,"fecRing"); TTreeReaderValue<uint16_t> ccuAdd (reader,"ccuAdd"); TTreeReaderValue<uint16_t> ccuChan (reader,"ccuChan"); TTreeReaderValue<uint16_t> lldChannel (reader,"lldChannel"); TTreeReaderValue<uint16_t> fedId (reader,"fedId"); TTreeReaderValue<uint16_t> fedCh (reader,"fedCh"); // output tree TFile* ouputTreeFile = new TFile((outputDIR+"/"+outputFileName).c_str(),"RECREATE"); ouputTreeFile->cd(); ouputTreeFile->SetCompressionLevel(0); TTree* outputTree = new TTree("pedestalFullNoise","pedestalFullNoise"); // branches uint32_t detid_,fedKey_; uint16_t fecCrate_,fecSlot_, fecRing_, ccuAdd_, ccuChan_, lldChannel_, fedId_, fedCh_, apvId_, stripId_; float noiseMean_,noiseRMS_, noiseSkewness_, noiseKurtosis_; float fitChi2_, fitChi2Probab_, fitStatus_; float fitGausMean_, fitGausSigma_, fitGausNormalization_; float fitGausMeanError_, fitGausSigmaError_, fitGausNormalizationError_; float noiseIntegral3Sigma_, noiseIntegral3SigmaFromFit_; float noiseIntegral4Sigma_, noiseIntegral4SigmaFromFit_; float noiseIntegral5Sigma_, noiseIntegral5SigmaFromFit_; float kSValue_, kSProbab_, jBValue_, jBProbab_, aDValue_, aDProbab_; vector<float> noiseDistribution_, noiseDistributionError_; float xMin_, xMax_, nBin_ ; outputTree->Branch("detid",&detid_,"detid/i"); outputTree->Branch("fedKey",&fedKey_,"fedKey/i"); outputTree->Branch("fecCrate",&fecCrate_,"fecCrate/s"); outputTree->Branch("fecSlot",&fecSlot_,"fecSlot/s"); outputTree->Branch("fecRing",&fecRing_,"fecRing/s"); outputTree->Branch("ccuAdd",&ccuAdd_,"ccuAdd/s"); outputTree->Branch("ccuChan",&ccuChan_,"ccuChan/s"); outputTree->Branch("lldChannel",&lldChannel_,"lldChannel/s"); outputTree->Branch("fedId",&fedId_,"fedId/s"); outputTree->Branch("fedCh",&fedCh_,"fedCh/s"); outputTree->Branch("apvId",&apvId_,"apvId/s"); outputTree->Branch("stripId",&stripId_,"stripId/s"); outputTree->Branch("noiseMean",&noiseMean_,"noiseMean/F"); outputTree->Branch("noiseRMS",&noiseRMS_,"noiseRMS/F"); outputTree->Branch("noiseSkewness",&noiseSkewness_,"noiseSkewness/F"); outputTree->Branch("noiseKurtosis",&noiseKurtosis_,"noiseKurtosis/F"); outputTree->Branch("fitGausNormalization",&fitGausNormalization_,"fitGausNormalization/F"); outputTree->Branch("fitGausMean",&fitGausMean_,"fitGausMean/F"); outputTree->Branch("fitGausSigma",&fitGausSigma_,"fitGausSigma/F"); outputTree->Branch("fitGausNormalizationError",&fitGausNormalizationError_,"fitGausNormalizationError/F"); outputTree->Branch("fitGausMeanError",&fitGausMeanError_,"fitGausMeanError/F"); outputTree->Branch("fitGausSigmaError",&fitGausSigmaError_,"fitGausSigmaError/F"); outputTree->Branch("fitChi2",&fitChi2_,"fitChi2/F"); outputTree->Branch("fitChi2Probab",&fitChi2Probab_,"fitChi2Probab/F"); outputTree->Branch("fitStatus",&fitStatus_,"fitStatus_F"); outputTree->Branch("noiseIntegral3Sigma",&noiseIntegral3Sigma_,"noiseIntegral3Sigma/F"); outputTree->Branch("noiseIntegral3SigmaFromFit",&noiseIntegral3SigmaFromFit_,"noiseIntegral3SigmaFromFit/F"); outputTree->Branch("noiseIntegral4Sigma",&noiseIntegral4Sigma_,"noiseIntegral4Sigma/F"); outputTree->Branch("noiseIntegral4SigmaFromFit",&noiseIntegral4SigmaFromFit_,"noiseIntegral4SigmaFromFit/F"); outputTree->Branch("noiseIntegral5Sigma",&noiseIntegral4Sigma_,"noiseIntegral5Sigma/F"); outputTree->Branch("noiseIntegral5SigmaFromFit",&noiseIntegral4SigmaFromFit_,"noiseIntegral5SigmaFromFit/F"); outputTree->Branch("kSValue",&kSValue_,"kSValue/F"); outputTree->Branch("jBValue",&jBValue_,"jBValue/F"); outputTree->Branch("aDValue",&aDValue_,"aDValue/F"); outputTree->Branch("kSProbab",&kSProbab_,"kSProbab/F"); outputTree->Branch("jBProbab",&jBProbab_,"jBProbab/F"); outputTree->Branch("aDProbab",&aDProbab_,"aDProbab/F"); outputTree->Branch("xMin",&xMin_,"xMin/F"); outputTree->Branch("xMax",&xMax_,"xMax/F"); outputTree->Branch("nBin",&nBin_,"nBin/F"); bool histoBranches = false; // Loop on the file list to extract each histogram 2D DQM histo with full noise distribution TH1F* histoNoiseStrip = NULL; TF1* fitFunc = NULL; TH1F* randomHisto = NULL; TFitResultPtr result; for(auto file : fileList){ cout<<"input file: "<<file<<endl; TFile* inputFile = TFile::Open(file.c_str(),"READ"); inputFile->cd(); // take into account that the DQM file structure for strips is always the same --> use cabling map to browse the histograms reader.SetEntry(0); TH2* histoNoise = NULL; long int iChannel = 0; int noFitResult = 0; while(reader.Next()){ cout.flush(); if(iChannel %10 == 0) cout<<"\r"<<"iChannel "<<100*double(iChannel)/(readoutMap->GetEntries()/reductionFactor)<<" % "; if(iChannel > double(readoutMap->GetEntries())/reductionFactor) break; iChannel++; TString objName; uint32_t fedKey = SiStripFedKey(*fedId,SiStripFedKey::feUnit(*fedCh),SiStripFedKey::feChan(*fedCh)).key(); std::stringstream stream; stream << std::hex << fedKey; string fedKeyStr = stream.str(); if(fedKeyStr.size() == 4) objName = Form("DQMData/SiStrip/ControlView/FecCrate%d/FecSlot%d/FecRing%d/CcuAddr%d/CcuChan%d/ExpertHisto_PedsFullNoise_FedKey0x0000%s_LldChannel%d_Noise2D",*fecCrate,*fecSlot,*fecRing,*ccuAdd,*ccuChan,fedKeyStr.c_str(),*lldChannel); else if(fedKeyStr.size() == 5) objName = Form("DQMData/SiStrip/ControlView/FecCrate%d/FecSlot%d/FecRing%d/CcuAddr%d/CcuChan%d/ExpertHisto_PedsFullNoise_FedKey0x000%s_LldChannel%d_Noise2D",*fecCrate,*fecSlot,*fecRing,*ccuAdd,*ccuChan,fedKeyStr.c_str(),*lldChannel); else cerr<<"hex number to short "<<fedKeyStr<<" --> please check "<<endl; inputFile->GetObject(objName.Data(),histoNoise); // extract single strip noise histogram --> loop on the y-axis uint16_t apvID = 0; uint16_t stripID = 0; if(histoNoiseStrip == 0 or histoNoiseStrip == NULL){ histoNoiseStrip = new TH1F ("histoNoiseStrip","",histoNoise->GetNbinsX(),histoNoise->GetXaxis()->GetXmin(),histoNoise->GetXaxis()->GetXmax()); histoNoiseStrip->Sumw2(); } for(int iBinY = 0; iBinY < histoNoise->GetNbinsY(); iBinY++){ histoNoiseStrip->Reset(); histoNoiseStrip->SetDirectory(0); // two multiplexed APV per line if(iBinY < histoNoise->GetNbinsY()/2) apvID = 1; else apvID = 2; // strip id stripID++; if(stripID > 128) stripID = 1; // loop on x-axis bin for(int iBinX = 0; iBinX < histoNoise->GetNbinsX(); iBinX++){ histoNoiseStrip->SetBinContent(iBinX+1,histoNoise->GetBinContent(iBinX+1,iBinY+1)); histoNoiseStrip->SetBinError(iBinX+1,histoNoise->GetBinError(iBinX+1,iBinY+1)); } // to initialize branches detid_ = 0; fedKey_ = 0; fecCrate_ = 0; fecSlot_ = 0; fecRing_ = 0; ccuAdd_ = 0; ccuChan_ = 0; lldChannel_ = 0; fedId_ = 0; fedCh_ = 0; apvId_ = 0; stripId_ = 0; noiseMean_ = 0.; noiseRMS_ = 0.; noiseSkewness_ = 0.; noiseKurtosis_ = 0.; fitGausMean_ = 0.; fitGausSigma_ = 0.;fitGausNormalization_ = 0.; fitGausMeanError_ = 0.; fitGausSigmaError_ = 0.;fitGausNormalizationError_ = 0.; fitChi2_ = 0.; fitChi2Probab_ = 0.; fitStatus_ = -1.; noiseIntegral3Sigma_ = 0.; noiseIntegral3SigmaFromFit_ = 0.; noiseIntegral4Sigma_ = 0.; noiseIntegral4SigmaFromFit_ = 0.; noiseIntegral5Sigma_ = 0.; noiseIntegral5SigmaFromFit_ = 0.; kSProbab_ = 0.; jBProbab_ = 0.; kSValue_ = 0.; jBValue_ = 0.; aDValue_= 0.; aDProbab_ = 0.; nBin_ = 0.; xMin_ = 0.; xMax_ = 0.; // basic info detid_ = *detid; fedKey_ = fedKey; fecCrate_ = *fecCrate; fecSlot_ = *fecSlot; fecRing_ = *fecRing; ccuAdd_ = *ccuAdd; ccuChan_ = *ccuChan; lldChannel_ = *lldChannel; fedId_ = *fedId; fedCh_ = *fedCh; apvId_ = apvID; stripId_ = stripID; // basic info of nioise distribution noiseMean_ = histoNoiseStrip->GetMean(); noiseRMS_ = histoNoiseStrip->GetRMS(); noiseSkewness_ = histoNoiseStrip->GetSkewness(); noiseKurtosis_ = histoNoiseStrip->GetKurtosis(); float integral = histoNoiseStrip->Integral(); noiseIntegral3Sigma_ = (histoNoiseStrip->Integral(histoNoiseStrip->FindBin(noiseMean_+noiseRMS_*3),histoNoiseStrip->GetNbinsX()+1) + histoNoiseStrip->Integral(0,histoNoiseStrip->FindBin(noiseMean_-noiseRMS_*3)))/integral; noiseIntegral4Sigma_ = (histoNoiseStrip->Integral(histoNoiseStrip->FindBin(noiseMean_+noiseRMS_*4),histoNoiseStrip->GetNbinsX()+1) + histoNoiseStrip->Integral(0,histoNoiseStrip->FindBin(noiseMean_-noiseRMS_*4)))/integral; noiseIntegral5Sigma_ = (histoNoiseStrip->Integral(histoNoiseStrip->FindBin(noiseMean_+noiseRMS_*5),histoNoiseStrip->GetNbinsX()+1) + histoNoiseStrip->Integral(0,histoNoiseStrip->FindBin(noiseMean_-noiseRMS_*5)))/integral; // make a gaussian fit if(fitFunc == NULL or fitFunc == 0){ fitFunc = new TF1 ("fitFunc","gaus(0)",histoNoise->GetXaxis()->GetXmin(),histoNoise->GetXaxis()->GetXmax()); } fitFunc->SetRange(histoNoise->GetXaxis()->GetXmin(),histoNoise->GetXaxis()->GetXmax()); fitFunc->SetParameters(histoNoiseStrip->Integral(),noiseMean_,noiseRMS_); result = histoNoiseStrip->Fit(fitFunc,"QSR"); if(result.Get()){ fitStatus_ = result->Status(); fitGausNormalization_ = fitFunc->GetParameter(0); fitGausMean_ = fitFunc->GetParameter(1); fitGausSigma_ = fitFunc->GetParameter(2); fitGausNormalizationError_ = fitFunc->GetParError(0); fitGausMeanError_ = fitFunc->GetParError(1); fitGausSigmaError_ = fitFunc->GetParError(2); fitChi2_ = result->Chi2(); fitChi2Probab_ = result->Prob(); noiseIntegral3SigmaFromFit_ = (histoNoiseStrip->Integral(histoNoiseStrip->FindBin(noiseMean_+fitGausSigma_*3),histoNoiseStrip->GetNbinsX()+1) + histoNoiseStrip->Integral(0,histoNoiseStrip->FindBin(noiseMean_-fitGausSigma_*3)))/histoNoiseStrip->Integral(); noiseIntegral4SigmaFromFit_ = (histoNoiseStrip->Integral(histoNoiseStrip->FindBin(noiseMean_+fitGausSigma_*4),histoNoiseStrip->GetNbinsX()+1) + histoNoiseStrip->Integral(0,histoNoiseStrip->FindBin(noiseMean_-fitGausSigma_*4)))/histoNoiseStrip->Integral(); noiseIntegral5SigmaFromFit_ = (histoNoiseStrip->Integral(histoNoiseStrip->FindBin(noiseMean_+fitGausSigma_*5),histoNoiseStrip->GetNbinsX()+1) + histoNoiseStrip->Integral(0,histoNoiseStrip->FindBin(noiseMean_-fitGausSigma_*5)))/histoNoiseStrip->Integral(); jBValue_ = (histoNoiseStrip->Integral()/6)*(noiseSkewness_*noiseSkewness_+(noiseKurtosis_*noiseKurtosis_)/4); jBProbab_ = ROOT::Math::chisquared_cdf_c(jBValue_,2); if(randomHisto == 0 or randomHisto == NULL) randomHisto = (TH1F*) histoNoiseStrip->Clone("randomHisto"); randomHisto->Reset(); randomHisto->SetDirectory(0); if(integral != 0){ if(generateRandomDistribution){ randomHisto->FillRandom("fitFunc",histoNoiseStrip->Integral()); kSValue_ = histoNoiseStrip->KolmogorovTest(randomHisto,"MN"); kSProbab_ = histoNoiseStrip->KolmogorovTest(randomHisto,"N"); aDValue_ = histoNoiseStrip->AndersonDarlingTest(randomHisto,"T"); aDProbab_ = histoNoiseStrip->AndersonDarlingTest(randomHisto); } else{ randomHisto->Add(fitFunc); kSValue_ = histoNoiseStrip->KolmogorovTest(randomHisto,"MN"); kSProbab_ = histoNoiseStrip->KolmogorovTest(randomHisto,"N"); // AD test ROOT::Fit::BinData data1; ROOT::Fit::BinData data2; ROOT::Fit::FillData(data1,histoNoiseStrip,0); data2.Initialize(randomHisto->GetNbinsX()+1,1); for(int ibin = 0; ibin < randomHisto->GetNbinsX(); ibin++){ if(histoNoiseStrip->GetBinContent(ibin+1) != 0 or randomHisto->GetBinContent(ibin+1) >= 1) data2.Add(randomHisto->GetBinCenter(ibin+1),randomHisto->GetBinContent(ibin+1),randomHisto->GetBinError(ibin+1)); } double probab; double value; ROOT::Math::GoFTest::AndersonDarling2SamplesTest(data1,data2,probab,value); aDValue_ = value; aDProbab_ = probab; } } } else noFitResult++; if(not histoBranches){ noiseDistribution_.clear(); noiseDistributionError_.clear(); outputTree->Branch("noiseDistribution","vector<float>",&noiseDistribution_); outputTree->Branch("noiseDistributionError","vector<float>",&noiseDistributionError_); histoBranches = true; } // set histogram noiseDistribution_.clear(); noiseDistributionError_.clear(); for(int iBin = 0; iBin < histoNoiseStrip->GetNbinsX(); iBin++){ noiseDistribution_.push_back(histoNoiseStrip->GetBinContent(iBin+1)); noiseDistributionError_.push_back(histoNoiseStrip->GetBinError(iBin+1)); } nBin_ = histoNoiseStrip->GetNbinsX(); xMin_ = histoNoise->GetXaxis()->GetBinLowEdge(1); xMax_ = histoNoise->GetXaxis()->GetBinLowEdge(histoNoise->GetNbinsX()+1); // fill all branches for each strip ouputTreeFile->cd(); outputTree->Fill(); } } inputFile->Close(); std::cout<<std::endl; cout<<"No fit results found for "<<100*double(noFitResult)/iChannel<<endl; } outputTree->BuildIndex("detid"); outputTree->Write(outputTree->GetName(),TObject::kOverwrite); ouputTreeFile->Close(); cablingFile->Close(); /* Do your stuff here */ cout<<"Time taken: "<<(double)(clock() - tStart)/CLOCKS_PER_SEC<<endl; }