#include <iostream.h>

#include "TClonesArray.h"
#include "TString.h"
#include "TRandom.h"

#include "MRawPixel.h"

#include "Mdefine.h"

//==========
// MRawPixel 
//    
// One Event in the Camera of MAGIC consists of measurements of different
// Photomultiplier. The measurements are taken with FADCs. So the raw 
// informations of one pixel are the ADC values of the FADCs. MAGIC will
// measure the amplitude of one Photomulitplier in different branches 
// - one high and one low gain branch. The first is for small signals, the 
// other for big signals. With this method it is possible to increase the 
// dynamic range.  
//
// The Class MRawPixel is used to manage this raw information. 
//
// The data members are described in detail here: 
//
// ---------
//
// UShort_t     usPixelId     ;   
//
// This is to identify the Pixel.
// The Camera consists of CAMERA_PIXELS Pixels. Each one has a specific Id.
// The center of the camera is zero and a spiral numbering is chosen.
//
// To reduce the amount of data, we store the information of the 
// low-gain-branch of the Fadc´s only if there is a signal in. Then the 
// usPixelId is:
//                   usPixelId = 10000 + PixelId   . 
//
// For the high gain Fadc values the rule is:
//                   usPixelId = PixelId . 
//
//
// ---------
//
// UChar_t      ucPixelStatus ;   
//
// The PixelStatus may contain information if the Pixel has triggered 
// this event. Also the kind of gain-branch (high or low) may be indicated 
// by one bit of the ucPixelStatus. etc
//
// ---------
//
// UChar_t      aucFadc[ FADC_SLICES ]  ; 
//
// The values of FADC_SLICES fadc-slices. This is the information of the 
// measured ADC values for one branch (high gain or low gain). The typ of 
// branch is indicated in the usPixelNumber and in the ucPixelStatus.

ClassImp(MRawPixel) 



MRawPixel::MRawPixel() {
  //
  //  The default constructor sets all members to zero. 
  //
    
    usPixelId     = 0 ; 
    ucPixelStatus = 0 ; 
    
    for (Int_t i = 0; i<FADC_SLICES; i++) 
      aucFadc[i]   = 0 ; 
}


MRawPixel::MRawPixel(UShort_t PId) {
  //
  //  constructor II  overloaded
  //
  //  Parameter is the PixelId. All other data member are set to zero
  
  usPixelId     = PId ; 
  ucPixelStatus = 0 ; 
  
  for (Int_t i = 0; i<FADC_SLICES; i++) 
    aucFadc[i]   = 0 ; 
}


MRawPixel::MRawPixel(UShort_t usPId, UChar_t ucSt, UChar_t ucF[]) {
  //
  // constructor III overloaded 
  //
  // parameters are PixelId, Status and an array with Fadc numbers.
  
  usPixelId     = usPId ; 
  ucPixelStatus = ucSt  ; 
  
  for (Int_t i = 0; i<FADC_SLICES; i++) 
    aucFadc[i]   = ucF[i] ; 
}
MRawPixel::~MRawPixel(){
  //
  //  default destructor
  //
}

void MRawPixel::Clear() {
  //
  //  Sets the data member back to zero
  //
  usPixelId     = 0 ; 
  ucPixelStatus = 0 ; 
  
  for (Int_t i = 0; i<FADC_SLICES; i++) 
    aucFadc[i]   = 0 ; 
} 


void MRawPixel::Print() 
{
  //
  //  This member function prints all Data of one Pixel on screen. 
  //

  cout << endl << "PixId " << usPixelId          ; 
  cout << " Stat " << (Int_t) ucPixelStatus << " --> "     ;

  for (Int_t i=0 ; i<FADC_SLICES ; i++ ) {
    cout<<" / " << (int) aucFadc[i] ; 
  } 
}
  
UShort_t MRawPixel::GetPixelId() {
  //
  // returns back the PixelId of the Pixel
  //
  return usPixelId;
}

UChar_t MRawPixel::GetFadcSlice( Int_t iSli ) {
  //
  // returns back the fadc content of the slice iSli 
  //
  return ( aucFadc[iSli] ) ; 
}






