Files
JFCalibration/sls_detector_calibration/jungfrauPixelMask.C

246 lines
6.0 KiB
C
Executable File

#include <algorithm> // std::count
#include "TCanvas.h"
#include "TH2F.h"
class jungfrauPixelMask {
private:
public:
TH2F* pixel_mask2d;
TCanvas* maskcanvas;
jungfrauPixelMask() {
cout << "jungfrauPixelMask constructed" << endl;
}
void initialisePixelMask(bool* mask) {
std::fill_n(mask, NCH, true); // initialise with true (not masked)
cout << "jungfrauPixelMask initialised" << endl;
}
int getNMasked(bool* mask) {
return count(mask, mask + NCH, false);
}
void maskPixel(int pixel, bool *mask) {
mask[pixel]= false;
}
void maskChip(int chip, bool* mask) {
if (chip < 1 || chip > 8){
cout << "expected chip number 1-8" << endl;
}
for (int i=0; i<NCH; i++) {
if (chipOfPixel(i) == chip) {
mask[i] = false;
}
}
}
void maskSupercolumn(int chip, int sc, bool* mask) {
if (chip < 1 || chip > 8 || sc < 1 || sc > 4){
cout << "expected chip number 1-8 and supercolumn number 1-4" << endl;
}
for (int i=0; i<NCH; i++) {
if (chipOfPixel(i) == chip){
if (supercolumnOfPixel(i) == sc) {
mask[i] = false;
}
}
}
}
void maskColumn(int chip, int c, bool* mask) {
if (chip < 1 || chip > 8 || c < 0 || c >= NC){
cout << "expected chip number 1-8 and column number 0--(NC-1)" << endl;
}
for (int i=0; i<NCH; i++) {
if (chipOfPixel(i) == chip){
if (i%NC == c){
mask[i] = false;
}
}
}
}
void maskChipEdges(bool* mask) {
for (int i=0; i<NCH; i++) {
if (i%1024 == 0 ||
i%1024 == 255 ||
i%1024 == 256 ||
i%1024 == 511 ||
i%1024 == 512 ||
i%1024 == 767 ||
i%1024 == 768 ||
i%1024 == 1023 ||
i/1024 == 0 ||
i/1024 == 255 ||
i/1024 == 256 ||
i/1024 == 511) {
mask[i] = false;
}
}
}
void maskNeighbours(bool* mask) {
bool tmp_mask [NCH];
std::fill_n(tmp_mask, NCH, true);
for (int i=0; i<NCH; i++) {
if (mask[i] == false) {
tmp_mask[i] = false;
if (i<1024) { // bottom
if (i==0) { // bottom left corner
tmp_mask[i+1] = false;
tmp_mask[i+1024] = false;
tmp_mask[i+1024+1] = false;
} else if (i==1023) { // bottom right corner
tmp_mask[i-1] = false;
tmp_mask[i+1024] = false;
tmp_mask[i+1024-1] = false;
} else { // bottom centre
tmp_mask[i-1] = false;
tmp_mask[i+1] = false;
tmp_mask[i+1024-1] = false;
tmp_mask[i+1024] = false;
tmp_mask[i+1024+1] = false;
}
} else if (i>=523264){ // top
if (i==523264){ // top left corner
tmp_mask[i+1] = false;
tmp_mask[i-1024] = false;
tmp_mask[i-1024+1] = false;
} else if (i==524287){ // top right corner
tmp_mask[i-1] = false;
tmp_mask[i-1024] = false;
tmp_mask[i-1024-1] = false;
} else { // top center
tmp_mask[i+1] = false;
tmp_mask[i-1] = false;
tmp_mask[i-1024+1] = false;
tmp_mask[i-1024] = false;
tmp_mask[i-1024-1] = false;
}
} else if ((i%1024)==0) { // left hand side center
tmp_mask[i+1] = false;
tmp_mask[i+1024] = false;
tmp_mask[i+1024+1] = false;
tmp_mask[i-1024] = false;
tmp_mask[i-1024+1] = false;
} else if ((i%1024)==1023) { // right hand side center
tmp_mask[i-1] = false;
tmp_mask[i+1024] = false;
tmp_mask[i+1024-1] = false;
tmp_mask[i-1024] = false;
tmp_mask[i-1024-1] = false;
} else { // center
tmp_mask[i-1] = false;
tmp_mask[i+1] = false;
tmp_mask[i+1024-1] = false;
tmp_mask[i+1024] = false;
tmp_mask[i+1024+1] = false;
tmp_mask[i-1024-1] = false;
tmp_mask[i-1024] = false;
tmp_mask[i-1024+1] = false;
}
}
}
for (int i = 0; i < NCH; i++) {
mask[i] = tmp_mask[i];
}
}
void maskIfGainNot(int expected, uint16_t *imagedata, bool* mask) {
// if gain of a pixel is not as expected, mask pixel
for (int i = 0; i<NCH; i++) {
if (((imagedata[i]&0xc000) >> 14) != expected) {
mask[i] = false;
//cout << "gain is " << ((imagedata[i]&0xc000) >> 14) << " not " << expected << " as expected so masking" << endl;
}
}
}
void maskFromPedestal(bool* mask, double* pedestals, double* pedestalRMSs) {
// if pedestal RMS is outside limits, mask pixel
for (int i = 0; i<NCH; i++) {
if (pedestalRMSs[i] > 100 || pedestals[i] < 1000 || pedestals[i] > 4000) {
mask[i] = false;
}
}
}
void maskIfPedeRMSG0GreaterThan(bool* mask, double* pedestalG0RMSs, int val) {
for (int i = 0; i < NCH; i++) {
if (pedestalG0RMSs[i] > val) {
mask[i] = false;
}
}
}
void maskIfPedestalStep(uint16_t *imagedata, uint16_t* last_frame, bool* mask, int step) {
for (int i = 0; i < NCH; i++) {
if ( fabs(last_frame[i] - (imagedata[i]&0x3fff)) > step) {
mask[i] = false;
}
}
}
void plotPixelMask(bool* mask, string fileName) {
pixel_mask2d = new TH2F("pixel_mask2d","",NC,-0.5,NC-0.5,NR,-0.5,NR-0.5);
for (int i = 0; i < NCH; i++) {
if (mask[i] == false) {
pixel_mask2d->Fill(i%NC,i/NC,1);
}
}
maskcanvas = new TCanvas("maskcanvas","",150,10,800,400);
maskcanvas->SetLeftMargin(0.1);
maskcanvas->SetRightMargin(0.13);
maskcanvas->SetTopMargin(0.08);
maskcanvas->SetBottomMargin(0.15);
pixel_mask2d->GetXaxis()->SetTitle("Column");
pixel_mask2d->GetYaxis()->SetTitle("Row");
pixel_mask2d->GetYaxis()->SetTitleOffset(0.7);
pixel_mask2d->Draw("colz");
maskcanvas->SaveAs(fileName.c_str());
maskcanvas->Close();
pixel_mask2d->Delete();
}
void saveMask(bool* mask, string fileName) {
ofstream maskfile (fileName.c_str());
if (maskfile.is_open()) {
cout << "saving pixel mask" << endl;
for (int i=0; i<NCH; i++){
maskfile << mask[i] << " " ;
}
maskfile.close();
} else {
cout << "Unable to open file" << endl;
}
}
bool readMask(bool* mask, string fileName) {
ifstream maskfile(fileName.c_str());
if (maskfile.is_open()) {
cout << "reading pixel mask" << endl;
for (int i = 0; i < NCH; ++i) {
maskfile >> mask[i];
}
return true;
} else {
cout << "Unable to open pixel mask" << endl;
return false;
}
}
};