/* ======================================================================== *\ ! ! * ! * 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 12/2000 ! ! Copyright: MAGIC Software Development, 2000-2001 ! ! \* ======================================================================== */ ///////////////////////////////////////////////////////////////////////////// // // // MPedestalCam // // // // Hold the Pedestal information for all pixels in the camera // // // ///////////////////////////////////////////////////////////////////////////// #include "MPedestalCam.h" #include "MPedestalPix.h" #include #include "MLog.h" #include "MLogManip.h" #include "MGeomCam.h" ClassImp(MPedestalCam); using namespace std; // -------------------------------------------------------------------------- // // Default constructor. Creates a MPedestalPix object for each pixel // MPedestalCam::MPedestalCam(const char *name, const char *title) : fNumTotSlices(0), fNumExtractSlices(0), fUseHists(kFALSE) { fName = name ? name : "MPedestalCam"; fTitle = title ? title : "Storage container for all Pedestal Information in the camera"; fArray = new TClonesArray("MPedestalPix", 1); } // -------------------------------------------------------------------------- // // Delete the array conatining the pixel pedest information // MPedestalCam::~MPedestalCam() { delete fArray; } // -------------------------------------------------------------------------- // // Set the size of the camera // void MPedestalCam::InitSize(const UInt_t i) { fArray->ExpandCreate(i); } // -------------------------------------------------------------------------- // // This function returns the current size of the TClonesArray // independently if the MPedestalPix is filled with values or not. // // Get the size of the MPedestalCam // Int_t MPedestalCam::GetSize() const { return fArray->GetEntriesFast(); } // -------------------------------------------------------------------------- // // Get i-th pixel (pixel number) // MPedestalPix &MPedestalCam::operator[](Int_t i) { return *static_cast(fArray->UncheckedAt(i)); } // -------------------------------------------------------------------------- // // Get i-th pixel (pixel number) // MPedestalPix &MPedestalCam::operator[](Int_t i) const { return *static_cast(fArray->UncheckedAt(i)); } void MPedestalCam::Clear(Option_t *o) { fArray->ForEach(TObject, Clear)(); fNumTotSlices = 0; fNumExtractSlices = 0; } void MPedestalCam::InitUseHists() { fArray->ForEach(MPedestalPix, InitUseHists)(); fUseHists = kTRUE; } void MPedestalCam::Print(Option_t *o) const { *fLog << all << GetDescriptor() << ":" << endl; int id = 0; TIter Next(fArray); MPedestalPix *pix; while ((pix=(MPedestalPix*)Next())) { id++; if (!pix->IsValid()) continue; *fLog << id-1 << ": "; *fLog << pix->GetPedestal() << " " << pix->GetPedestalRms() << endl; } } Float_t MPedestalCam::GetPedestalMin(const MGeomCam *geom) const { if (fArray->GetEntries() <= 0) return 50.; Float_t minval = (*this)[0].GetPedestalRms(); for (Int_t i=1; iGetEntries(); i++) { const MPedestalPix &pix = (*this)[i]; Float_t testval = pix.GetPedestalRms(); if (geom) testval *= geom->GetPixRatio(i); if (testval < minval) minval = testval; } return minval; } Float_t MPedestalCam::GetPedestalMax(const MGeomCam *geom) const { if (fArray->GetEntries() <= 0) return 50.; Float_t maxval = (*this)[0].GetPedestalRms(); for (Int_t i=1; iGetEntries(); i++) { const MPedestalPix &pix = (*this)[i]; Float_t testval = pix.GetPedestalRms(); if (geom) testval *= geom->GetPixRatio(i); if (testval > maxval) maxval = testval; } return maxval; } Bool_t MPedestalCam::GetPixelContent(Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type) const { if (!(*this)[idx].IsValid()) return kFALSE; if (idx == 559) return kFALSE; const Float_t ped = (*this)[idx].GetPedestal(); const Float_t rms = (*this)[idx].GetPedestalRms(); const Float_t pederr = rms/TMath::Sqrt((Float_t)fNumTotSlices); const Float_t rmserr = rms/TMath::Sqrt((Float_t)fNumTotSlices/2.); const Float_t mean = (*this)[idx].GetMean() / (Float_t)fNumExtractSlices; const Float_t meanerr = (*this)[idx].GetMeanErr() / (Float_t)fNumExtractSlices; const Float_t sigma = (*this)[idx].GetSigma() / TMath::Sqrt((Float_t) fNumExtractSlices); const Float_t sigmaerr = (*this)[idx].GetSigmaErr() / TMath::Sqrt((Float_t) fNumExtractSlices); switch (type) { case 0: val = ped; break; case 1: val = pederr; break; case 2: val = rms; break; case 3: val = rmserr; break; case 4: // if ((*this)[idx].IsFitValid()) val = mean; // else // return kFALSE; break; case 5: // if ((*this)[idx].IsFitValid()) val = meanerr; // else // return kFALSE; break; case 6: // if ((*this)[idx].IsFitValid()) val = sigma; // else // return kFALSE; break; case 7: // if ((*this)[idx].IsFitValid()) val = sigmaerr; // else // return kFALSE; break; case 8: // if ((*this)[idx].IsFitValid()) val = (*this)[idx].GetProb(); // else // return kFALSE; break; case 9: // if ((*this)[idx].IsFitValid()) val = 2.*(ped-mean)/(ped+mean); // else // return kFALSE; break; case 10: val = TMath::Sqrt((pederr*pederr + meanerr*meanerr) * (ped*ped + mean*mean)) *2./(ped+mean)/(ped+mean); break; case 11: val = 2.*(pederr - meanerr)/(pederr + meanerr); break; case 12: val = 2.*(rms-sigma)/(rms+sigma); break; case 13: val = TMath::Sqrt((rmserr*rmserr + sigmaerr*sigmaerr) * (rms*rms + sigma*sigma)) *2./(rms+sigma)/(rms+sigma); break; case 14: // if ((*this)[idx].IsFitValid()) val = 2.*(rmserr - sigmaerr)/(rmserr + sigmaerr); // else // return kFALSE; break; default: return kFALSE; } return kTRUE; } void MPedestalCam::DrawPixelContent(Int_t idx) const { (*this)[idx].Draw(); }