246 lines
6.0 KiB
C
Executable File
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;
|
|
}
|
|
}
|
|
|
|
|
|
};
|