- #include "TFile.h"
- #include "TH2D.h"
- #include <iostream>
- #include <fstream>
- #include <iomanip>
- #include <vector>
- #include <algorithm>
- #include "TROOT.h"
- #include "TKey.h"
- #include "TIterator.h"
-
- /*
- ......................................................................
- Author: Hella Snoek (hella.snoek@cern.ch)
- Date: 22.07.2014
-
- Simple ROOT analysis code to analyse the pixel hit maps for
- - DEAD: no hits
- - HOT: too many hits
- - LOW: too few hits
- pixel hits.
-
- A pixel cell is compared to its 8 neighbouring (exception for pixel on
- the edge below) pixel cells. The 2 highest and 2 lowest hit counts
- are removed before making an average of the surrounding pixel cells.
- The minimum required count in a cell for the analysis is 20.
- A HOT cell is 40 times higher than the average.
- A LOW cell is 4 std deviations (sqrt) lower.
-
- For the cells on the edge of the sensor the highest and lowest hits
- are not removed for the average.
-
- Three text files are produced. With the format
- col row
-
- Run this code as:
- root -b -q PixelMapAnalysis.cpp+\(\"inputfilename\",\"outputname\"\)
- or
- root -b -q PixelMapAnalysis.cpp+\(\"inputfilename\",\"outputname\",true\)
- for the verbose version.
-
- or call it with a hitmap:
- .L PixelMapAnalysis.cpp+
- PixelMapAnalysis(yourTH2D,"outputname",true);
-
-
- ......................................................................
- */
-
- using namespace std;
-
- void PixelMapAnalysis(TH2D* hist, const char* outname, bool verbose=false){
-
- ofstream deadF(Form("%s_dead.txt",outname));
- ofstream hotF(Form("%s_hot.txt",outname));
- ofstream lowF(Form("%s_low.txt",outname));
-
- for (int col=0;col<256;col++){
- for (int row=0;row<256;row++){
- double count = hist->GetBinContent(col+1,row+1);
-
- if (count ==0 ) {
- if (verbose) std::cout << "DEAD " << col << " " << row << endl;
- deadF << setw(3) << col << " " << row << endl;
- continue;
- }
-
- vector<double> neighbours{
- hist->GetBinContent(col,row),
- hist->GetBinContent(col+1,row),
- hist->GetBinContent(col+2,row),
- hist->GetBinContent(col,row+1),
- hist->GetBinContent(col+2,row+1),
- hist->GetBinContent(col,row+2),
- hist->GetBinContent(col+1,row+2),
- hist->GetBinContent(col+2,row+2)
- } ;
- std::sort( neighbours.begin(),neighbours.end());
-
- if (col>0&&col<255&&row>0&&row<255) {
- neighbours.erase(neighbours.begin(),neighbours.begin()+2);
- neighbours.erase(neighbours.end()-2,neighbours.end());
-
- double total(0.);
- for (uint i=0;i<neighbours.size();i++) {
- // cout << neighbours[i] << " " ;
- total=total+neighbours[i];
- // cout << total<< " ";
- }
-
- if (count >10*total) {
- if (verbose) std::cout << "HOT " << col << " " << row << endl;
- hotF << setw(3) << col << " "<< row << endl;
- continue;
- }
- if (count>20 && (count)<(total/neighbours.size()-4*sqrt(total/neighbours.size()))){
- if (verbose) std::cout << "LOW " << col << " " << row << endl;
- lowF << setw(3) << col << " " << row << endl;
- continue;
- }
- }
-
- else {
- std::sort( neighbours.begin(),neighbours.end());
- while(neighbours.front()==0) neighbours.erase(neighbours.begin());
- double total(0);
- for (uint i=0;i<neighbours.size();i++) {
- total=total+neighbours[i];
- }
- if (count >10*total) {
- if (verbose) std::cout << "HOT " << col << " " << row << endl;
- hotF << setw(3) << col << " " << row << endl;
- continue;
- }
- if (count>20 && (count)<(total/neighbours.size()-4*sqrt(total/neighbours.size()))){
- if (verbose) std::cout << "LOW " << col << " " << row << endl;
- lowF << setw(3) << col << " " << row << endl;
- continue;
- }
- }
- }
- }
- deadF.close();
- hotF.close();
- lowF.close();
- }
-
-
- void PixelMapAnalysis(const char* filename, const char* outname, bool verbose=false){
-
- cout << "opening filename" << filename << endl;
- TFile file(filename,"read");
- file.GetDirectory("Tb/TbHitMonitor/HitMap")->GetListOfKeys()->Print();
-
- TIter nextkey(file.GetDirectory("Tb/TbHitMonitor/HitMap")->GetListOfKeys());
-
- TKey *key;
-
- while((key= (TKey*) nextkey())) {
- TH2D *hist = (TH2D*) key->ReadObj();
- std::cout << "-------Now processing: " << key->GetName() << "-----------" <<endl;
- PixelMapAnalysis(hist,Form("%s_%s",outname,key->GetName()),verbose);
- }
- }