/* ======================================================================== *\ ! ! * ! * This file is part of MARS, the MAGIC Analysis and Reconstruction ! * Software. It is distributed to you in the hope that it can be a useful ! * and timesaving tool in analysing Data of imaging Cerenkov telescopes. ! * It is distributed WITHOUT ANY WARRANTY. ! * ! * Permission to use, copy, modify and distribute this software and its ! * documentation for any purpose is hereby granted without fee, ! * provided that the above copyright notice appear in all copies and ! * that both that copyright notice and this permission notice appear ! * in supporting documentation. It is provided "as is" without express ! * or implied warranty. ! * ! ! ! Author(s): Thomas Bretz 1/2004 ! ! Copyright: MAGIC Software Development, 2000-2004 ! ! \* ======================================================================== */ ///////////////////////////////////////////////////////////////////////////// // // MBadPixelsCam // // // Storage container to store bad pixel of the camera... // ///////////////////////////////////////////////////////////////////////////// #include "MBadPixelsCam.h" #include #include #include "MLog.h" #include "MLogManip.h" #include "MBadPixelsPix.h" ClassImp(MBadPixelsCam); using namespace std; // -------------------------------------------------------------------------- // // Default constructor. // MBadPixelsCam::MBadPixelsCam(const char *name, const char *title) { fName = name ? name : "MBadPixelsCam"; fTitle = title ? title : ""; fArray = new TClonesArray("MBadPixelsPix", 1); } // -------------------------------------------------------------------------- // // Delete the array conatining the bad pixel information // MBadPixelsCam::~MBadPixelsCam() { delete fArray; } // -------------------------------------------------------------------------- // // Set the size of the camera // void MBadPixelsCam::InitSize(const UInt_t i) { fArray->ExpandCreate(i); } // -------------------------------------------------------------------------- // // Get the size of the MBadPixelsCam // Int_t MBadPixelsCam::GetSize() const { return fArray->GetEntriesFast(); } // -------------------------------------------------------------------------- // // Copy 'constructor' // void MBadPixelsCam::Copy(TObject &object) const { MBadPixelsCam &cam = (MBadPixelsCam&)object; const Int_t n = GetSize(); if (n==0) return; cam.InitSize(n); for (int i=0; i(fArray->UncheckedAt(i)); } // -------------------------------------------------------------------------- // // Get i-th pixel (pixel number) // const MBadPixelsPix &MBadPixelsCam::operator[](Int_t i) const { return *static_cast(fArray->UncheckedAt(i)); } // -------------------------------------------------------------------------- // // Merge two MBadPixelsCam together, see also MBadPixelsPix::Merge // void MBadPixelsCam::Merge(const MBadPixelsCam &cam) { const Int_t n = cam.GetSize(); if (n==0) { *fLog << warn << "MBadPixelsCam::Merge: Container empty." << endl; return; } if (GetSize()==0) InitSize(n); if (n!=GetSize()) { *fLog << warn << "MBadPixelsCam::Merge: Size mismatch... ignored." << endl; return; } for (int i=0; iForEach(TObject, Clear)(); } // -------------------------------------------------------------------------- // // Print the contents of all bad pixels // void MBadPixelsCam::Print(Option_t *o) const { *fLog << all << GetDescriptor() << ":" << endl; fArray->ForEach(TObject, Print)(); } // -------------------------------------------------------------------------- // // Read from an ascii file of the format: // pixel1 pixel2 pixel3 pixel4 // while pixel1,2,3,4 are the pixel indices used in the software. // // To read the pixels corresponding to a given run you can give run!=0 // and a file of the format: // 1234: 17 193 292 // 1235: 17 193 292 293 // void MBadPixelsCam::AsciiRead(ifstream &fin, UInt_t run=0) { Int_t len; TString str; while (1) { str.ReadLine(fin); if (!fin) return; Int_t r; const Int_t n = sscanf(str.Data(), " %d : %n", &r, &len); if (n!=1) return; if (run==0 || run && (UInt_t)r==run) break; } str.Remove(0, len); while (1) { Int_t idx; const Int_t n = sscanf(str.Data(), " %d %n", &idx, &len); if (n!=1) break; str.Remove(0, len); if (idx>=GetSize()) InitSize(idx); (*this)[idx].SetUnsuitableRun(); } } // -------------------------------------------------------------------------- // // Write the information into an ascii file. If a run-number is given the // run-number will lead the line. // Bool_t MBadPixelsCam::AsciiWrite(ostream &fout, UInt_t run=0) const { if (run) fout << run << ":"; for (int i=0; i