From bd295b0b878246093f75f78ae94a204ed0849071 Mon Sep 17 00:00:00 2001
From: Buddhini Waidyawansa <buddhini@jlab.org>
Date: Tue, 11 Feb 2014 15:32:20 -0500
Subject: [PATCH] Add THcRasterRawHit, THcRasterBeam classes.  Add
 raster_test.C script.   THcRasterRawHit class to helps with the decoding of
 the raster      signals via THcHitList class.   THcRasteredBeam class derives
 from THaApparatus to handle rastered beam.   Modify Makefile and
 HallC_LinkDef.h to compile new classes

---
 Makefile                   |   5 +-
 examples/PARAM/hcana.param |   5 +-
 examples/raster_test.C     |  61 ++++++----
 src/HallC_LinkDef.h        |   3 +
 src/THcRaster.cxx          | 236 +++++++++++++++++++++++++++++++------
 src/THcRaster.h            |  44 ++++---
 src/THcRasterRawHit.cxx    |  85 +++++++++++++
 src/THcRasterRawHit.h      |  45 +++++++
 src/THcRasteredBeam.cxx    |  73 ++++++++++++
 src/THcRasteredBeam.h      |  31 +++++
 10 files changed, 517 insertions(+), 71 deletions(-)
 create mode 100644 src/THcRasterRawHit.cxx
 create mode 100644 src/THcRasterRawHit.h
 create mode 100644 src/THcRasteredBeam.cxx
 create mode 100644 src/THcRasteredBeam.h

diff --git a/Makefile b/Makefile
index b03e0e4..14cc55c 100644
--- a/Makefile
+++ b/Makefile
@@ -24,7 +24,10 @@ SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
 	src/THcRawShowerHit.cxx \
 	src/THcAerogel.cxx src/THcAerogelHit.cxx \
 	src/THcCherenkov.cxx src/THcCherenkovHit.cxx \
-	src/THcFormula.cxx
+	src/THcFormula.cxx\
+	src/THcRaster.cxx\
+	src/THcRasteredBeam.cxx\
+	src/THcRasterRawHit.cxx
 
 # Name of your package. 
 # The shared library that will be built will get the name lib$(PACKAGE).so
diff --git a/examples/PARAM/hcana.param b/examples/PARAM/hcana.param
index 3251627..2149ebb 100644
--- a/examples/PARAM/hcana.param
+++ b/examples/PARAM/hcana.param
@@ -8,6 +8,8 @@ hhodo_plane_names = "1x 1y 2x 2y"
 
 hcal_num_layers = 4
 
+rraster_num_signals = 4
+
 # Exclusion band width for the calorimeter's fiducial volume.
 hcal_fv_delta = 5.
 
@@ -83,4 +85,5 @@ hcer_tot_pmts = 2
 
 # parameter list for the raster
 # Maybe we can add this to geabm.param later ?
-graster_channels = "xsync xsig ysync ysig"
+
+rraster_signal_names = "xsync xsig ysync ysig"
diff --git a/examples/raster_test.C b/examples/raster_test.C
index b15f529..407b027 100644
--- a/examples/raster_test.C
+++ b/examples/raster_test.C
@@ -2,82 +2,103 @@
 {
 
   //
-  //  Steering script to test hodoscope decoding
+  //  Steering script to test raster signal decoding
   //
   
   Int_t RunNumber=50017;
   char* RunFileNamePattern="daq04_%d.log.0";
   
+ 
+  // Open the database
+  //
   gHcParms->Define("gen_run_number", "Run Number", RunNumber);
   gHcParms->AddString("g_ctp_database_filename", "DBASE/test.database");
-  
   gHcParms->Load(gHcParms->GetString("g_ctp_database_filename"), RunNumber);
 
-  // g_ctp_parm_filename and g_decode_map_filename should now be defined
-
+  
+  // Open and load parameter files
+  //
   gHcParms->Load(gHcParms->GetString("g_ctp_parm_filename"));
-
-  // Constants not in ENGINE PARAM files that we want to be
-  // configurable
+  // parameters not found in usual engine parameter files
   gHcParms->Load("PARAM/hcana.param");
 
-  // Generate db_cratemap to correspond to map file contents
+  
+  //  Generate db_cratemap to correspond to map file contents
+  //  make_cratemap.pl scripts reads a Hall C style MAP file and output a 
+  //  Hall A style crate map DB file 
+  //
   char command[100];
   sprintf(command,"./make_cratemap.pl < %s > db_cratemap.dat",gHcParms->GetString("g_decode_map_filename"));
   system(command);
 
+
   // Load the Hall C style detector map
+  //
   gHcDetectorMap=new THcDetectorMap();
   gHcDetectorMap->Load(gHcParms->GetString("g_decode_map_filename"));
 
-  // Set up the equipment to be analyzed.
 
+  // Set up the equipment to be analyzed.
+  //
+  // HMS and its detectors
   THaApparatus* HMS = new THcHallCSpectrometer("H","HMS");
   gHaApps->Add( HMS );
-
   // Add hodoscope
   HMS->AddDetector( new THcHodoscope("hod", "Hodoscope" ));
   HMS->AddDetector( new THcShower("cal", "Shower" ));
   HMS->AddDetector( new THcDC("dc", "Drift Chambers" ));
-  THcAerogel* aerogel = new THcAerogel("aero", "Aerogel Cerenkov" );
-  HMS->AddDetector( aerogel );
-  THcCherenkov* cherenkov = new THcCherenkov("cher", "Gas Cerenkov" );
-  HMS->AddDetector( cherenkov );
+  HMS->AddDetector( new THcAerogel("aero", "Aerogel Cerenkov" ));
+  HMS->AddDetector( new THcCherenkov("cher", "Gas Cerenkov" ));
+
+
+  // Beamline and its detectors
+  THaApparatus * BEAM = new THcRasteredBeam("rb","Beamline");
+  gHaApps->Add( BEAM );
+
 
   // Set up the analyzer - we use the standard one,
   // but this could be an experiment-specific one as well.
   // The Analyzer controls the reading of the data, executes
   // tests/cuts, loops over Acpparatus's and PhysicsModules,
   // and executes the output routines.
+  //
   THcAnalyzer* analyzer = new THcAnalyzer;
   
 
   // A simple event class to be output to the resulting tree.
   // Creating your own descendant of THaEvent is one way of
   // defining and controlling the output.
+  //
   THaEvent* event = new THaEvent;
   
+  
   // Define the run(s) that we want to analyze.
   // We just set up one, but this could be many.
+  // 
   char RunFileName[100];
   sprintf(RunFileName,RunFileNamePattern,RunNumber);
   THaRun* run = new THaRun(RunFileName);
 
+  
   // Eventually need to learn to skip over, or properly analyze
   // the pedestal events
-  run->SetEventRange(1,5000);//  Physics Event number, does not
-                                // include scaler or control events
+  //
+  run->SetEventRange(1,2);//  Physics Event number, does not
+                           // include scaler or control events
 
   // Define the analysis parameters
-  analyzer->SetEvent( event );
-  analyzer->SetOutFile( "hodtest.root" );
+  //
+  analyzer->SetEvent(event);
+  analyzer->SetOutFile("raster_test.root");
   analyzer->SetOdefFile("output.def");
-  analyzer->SetCutFile("hodtest_cuts.def");        // optional
+  // analyzer->SetCutFile("rastertest_cuts.def");        // optional
   analyzer->SetCountMode(2);// Counter event number same as gen_event_ID_number
   
   // File to record cuts accounting information
   //  analyzer->SetSummaryFile("summary_example.log"); // optional
   
-  analyzer->Process(run);     // start the actual analysis
+  // start the actual analysis
+  //
+  analyzer->Process(run);     
   analyzer->PrintReport("report.template","report.out");
 }
diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h
index 4992343..fed124a 100644
--- a/src/HallC_LinkDef.h
+++ b/src/HallC_LinkDef.h
@@ -48,5 +48,8 @@
 #pragma link C++ class THcCherenkov+;
 #pragma link C++ class THcCherenkovHit+;
 #pragma link C++ class THcFormula+;
+#pragma link C++ class THcRaster+;
+#pragma link C++ class THcRasteredBeam+;
+#pragma link C++ class THcRasterRawHit+;
 
 #endif
diff --git a/src/THcRaster.cxx b/src/THcRaster.cxx
index b81396e..9bc4f52 100644
--- a/src/THcRaster.cxx
+++ b/src/THcRaster.cxx
@@ -12,12 +12,22 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "THcRaster.h"
-#include "THcHitList.h"
+#include "THaEvData.h"
+#include "THaDetMap.h"
+
+
+#include "THcParmList.h"
+#include "THcGlobals.h"
+#include "THaGlobals.h"
+
+
+//#include "THcHitList.h"
 
 #include <cstring>
 #include <cstdio>
 #include <cstdlib>
 #include <iostream>
+#include <fstream>
 
 
 using namespace std;
@@ -27,83 +37,239 @@ THcRaster::THcRaster( const char* name, const char* description,
 		      THaApparatus* apparatus ) :
   THaBeamDet(name,description,apparatus)
 {
-  // // Initializing channels
+  fAnalyzePedestals = 0;
+  fRawPos[0]=0;
+  fRawPos[1]=0;
+
   // fRasterXADC = new TClonesArray("THcSignalHit",16);
   // fRasterYADC = new TClonesArray("THcSignalHit",16);
 }
 
-//_____________________________________________________________________________
-THcRaster::THcRaster( ) :
-  THaBeamDet()
-{
-  // Default constructor
-}
 
 //_____________________________________________________________________________
-THcRaster::~THRaster()
+THcRaster::~THcRaster()
 {
   // Distructor
 }
 
+
 //_____________________________________________________________________________
 void THcRaster::ClearEvent(){
+  // nothing for now
+}
+
+//_____________________________________________________________________________
+void THcRaster::InitializeReconstruction()
+{
 
-  // do nothing for now
 }
+  
+
 
 //_____________________________________________________________________________
-// ReadDatabase:  if detectors cant be added to detmap 
 Int_t THcRaster::ReadDatabase( const TDatime& date )
 {
-  static const char* const here = "THcRaster::ReadDatabase";
 
-  InitializeReconstruction();
+  // Read parameters such as calibration factor, of this detector from the database.
+  // static const char* const here = "THcRaster::ReadDatabase";
+ 
+  // InitializeReconstruction();
+
+  // char prefix[2];
+
+  // cout << " THcRaster::ReadDatabase GetName() called " << GetName() << endl;
+
+  // prefix[0]=tolower(GetName()[0]);
+  // prefix[1]='\0';
+
 
-  char prefix[2];
+  // string names;
+  // DBRequest list[]={
+  //   {"raster_channel_name",&names,kString},
+  //   {"raster_channel_number",&names,kString},
+  //   {0}
+  // };
 
-  cout << " GetName() " << GetName() << endl;
+  // // get the channel assignments from the parameter file
+  // gHcParms->LoadParmValues((DBRequest*)&list,prefix);
 
-  prefix[0]=tolower(GetName()[0]);
-  prefix[1]='\0';
+  // std::cout <<"Raster channel no : " << std::endl;
+  // std::cout <<" X signal channel = "<<fChNO[0]<<std::endl;
+  // std::cout <<" Y signal channel = "<<fChNO[1]<<std::endl;
 
-  string channelNames;
-  DBRequest channellist[]={
-    {"graster_channels",&channelNames,kString},
-    {0}
-  };
 
-  // get the channel list from the parameter file
-  gHcParms->LoadParmValues((DBRequest*)&channellist,prefix);
-  std::cout << "Raster channel list : " << channellist << std::endl;
+  // std::vector<string> channel_names = vsplit(names);
+  // Int_t NChannels = channel_names.size();
+  // for(Int_t i=0;i<NChannels;i++) {
+  //   //  fPlaneNames[i] = new char[plane_names[i].length()];
+  //   //  strcpy(fPlaneNames[i], plane_names[i].c_str());
+  //   //std::cout<<" channel = "<<channel_names.at(i)<<std::endl;
+  //   std::cout<<" Channel numbers = "<<
+  // }
 
-  vector<string> channel_names = vsplit(channellist);
 
-  Int_t NChannels = channel_names.size_of();
-  for(Int_t i=0;i<NChannels;i++) {
-    //  fPlaneNames[i] = new char[plane_names[i].length()];
-    //  strcpy(fPlaneNames[i], plane_names[i].c_str());
-    std::cout<<" channel = "<<channel_names.at(i)<<std::endl;
+  // Read the detector map file
+
+  // Based on the ungly method used in THaRaster class. I have no idea
+  // how to do this more elegantly.
+  // Buddhini
+  // const int LEN=100;
+  // char buf[LEN];
+  //  FILE* fi = OpenFile( date );
+  // if( !fi ) return kFileError;
+
+  // fDetMap->Clear();
+  // int first_chan, crate, dummy, slot, first, last, modulid;
+  // std::cout<<"$$$$$$$$$$$$ THcRaster detmap"<<std::endl;
+  // do {
+  //   fgets( buf, LEN, fi);
+  //   sscanf(buf,"%d %d %d %d %d %d %d",&first_chan, &crate, &dummy, &slot, &first, &last, &modulid);
+
+  //   std::cout<<"$$$$$$$$$$$$ "<<crate<<std::endl;
+
+  //   // if (first_chan>=0) {
+  //   //   if ( fDetMap->AddModule (crate, slot, first, last, first_chan )<0) {
+  //   // 	Error( Here(here), "Couldnt add Raster to DetMap!");
+  //   // 	fclose(fi);
+  //   // 	return kInitError;
+  //   //   }
+  //   // }
+  // } while (first_chan>=0);
+
+
+
+
+  return kOK;
+
+}
+
+//_____________________________________________________________________________
+THaAnalysisObject::EStatus THcRaster::Init( const TDatime& date )
+{
+  cout << "THcRaster::Init()" << endl;
+
+  THcHitList::InitHitList(fDetMap,"THcRasterRawHit",4);
+
+  EStatus status;
+  if( (status = THaBeamDet::Init( date )) )
+    return fStatus=status;
+
+  // Fill detector map with RASTER type channels
+  if( gHcDetectorMap->FillMap(fDetMap, "RASTER") < 0 ) {
+    static const char* const here = "Init()";
+    Error( Here(here), "Error filling detectormap for %s.", 
+  	   "RASTER");
+    return kInitError;
   }
 
-return kOK 
+  return fStatus = kOK;
 
 }
 
+
+//_____________________________________________________________________________
+void THcRaster::AccumulatePedestals(TClonesArray* rawhits)
+{
+  // Extract data from the hit list, accumulating into arrays for
+  // calculating pedestals
+
+}
+
+
+//_____________________________________________________________________________
+void THcRaster::CalculatePedestals( )
+{
+ // Use the accumulated pedestal data to calculate pedestals
+}
+
+
 //_____________________________________________________________________________
 Int_t THcRaster::Decode( const THaEvData& evdata )
 {
+  cout << "THcRaster::Decode()" << endl;
+
+  // clears the event structure
+  // loops over all channels defined in the detector map
+  // copies raw data into local variables
+  // performs pedestal subtraction
+
+  ClearEvent();
+
   // Get the Hall C style hitlist (fRawHitList) for this event
-  // empty for now while I work on reading the channel map.
+  Int_t fNhits = THcHitList::DecodeToHitList(evdata);
+  std::cout<<"$$$$ Hits.."<<fNhits<<std::endl;
+
+  // // Get the pedestals
+  // if(gHaCuts->Result("Pedestal_event")) {
+  //   Int_t nexthit = 0;
+  //   AccumulatePedestals(fRawHitList);
+    
+  //   fAnalyzePedestals = 1;	// Analyze pedestals first normal events
+  //   return(0);
+  // }
+  // if(fAnalyzePedestals) {
+  //   CalculatePedestals();
+  //   fAnalyzePedestals = 0;	// Don't analyze pedestals next event
+  // }
+
+  Int_t ihit = 0;
+  std::cout<<"$$$$ Hits.."<<fNhits<<std::endl;
+
+  while(ihit < fNhits) {
+    //std::cout<<"Get raw hit.."<<std::endl;
+    THcRasterRawHit* hit = (THcRasterRawHit *) fRawHitList->At(ihit);
+    fRawADC[0] = hit->fADC_xsig;
+    fRawADC[1] = hit->fADC_ysig;
+
+    for(Int_t i=0;i<2;i++){
+      fRawPos[i] = fRawADC[i]-fPedADC[i];
+      // std::cout<<" Raw ADC = "<<fRawADC[i]
+      // 	       <<" ped = "<<fPedADC[i]
+      // 	       <<" corrected ="<<fRawPos[i]<<std::endl; 
+    }
+  }
+
+  for(Int_t ihit = 0; ihit < fNhits ; ihit++) {
+    THcRasterRawHit* hit = (THcRasterRawHit *) fRawHitList->At(ihit);
+    cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : "
+	 << hit->fADC_xsig << " " << hit->fADC_ysig << " "  <<  hit->fADC_xsync
+	 << " " <<  hit->fADC_ysync << endl;
+  }
+  cout << endl;
+
+  //Get X and Y ADC values
+
 
   return 0;
 
 }
 
+
+
+
+
 //_____________________________________________________________________________
-Int_t THaRaster::Process( ){
+Int_t THcRaster::Process( ){
+
+  /*    From ENGINE/g_analyze_misc.f
+
+	Fast Raster Signals:
+	 ===================
+
+	 gfrx_raw_adc = gmisc_dec_data(14,2)
+	 gfry_raw_adc = gmisc_dec_data(16,2)
+
+	 calculate raster position from ADC value.
+	 
+	 gfrx_adc = gfrx_raw_adc - gfrx_adc_ped
+	 gfry_adc = gfry_raw_adc - gfry_adc_ped
+
+  */
 
   // empty for now while I work on reading the channel map.
-  return o;
+
+
+  return 0;
 }
 
 
diff --git a/src/THcRaster.h b/src/THcRaster.h
index b50e2ec..1d9e838 100644
--- a/src/THcRaster.h
+++ b/src/THcRaster.h
@@ -1,7 +1,6 @@
 #ifndef ROOT_THcRaster
 #define ROOT_THcRaster
 
-
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 // THcRaster                                                                 //
@@ -9,36 +8,53 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "THaBeamDet.h"
+#include "TVector.h"
+#include "TClonesArray.h"
+#include "THcHitList.h"
+#include "THcDetectorMap.h"
+#include "THcRasterRawHit.h"
+#include "THaCutList.h"
 
-class THcRaster : public THaBeamDet {
+class THcRaster : public THaBeamDet, public THcHitList {
 
  public:
 
-  THcRaster( const char* name, const char* description ="" ,
-	     THaApparatus* a = NULL );
+  THcRaster(const char* name, const char* description ="",THaApparatus* a = NULL );
 
-  virtual ~THaRaster();
+  ~THcRaster();
+  EStatus    Init( const TDatime& run_time );
 
-  virtual Int_t      Decode( const THaEvData& );
-  virtual Int_t      Process();
+  Int_t      Decode( const THaEvData& );
+  Int_t      Process();
 
-  virtual TVector3 GetPosition()  const { return fPosition[2]; }
-  virtual TVector3 GetDirection() const { return NULL; } // Hall C we don't use raster direction yet.
+  TVector3 GetPosition()  const { return fPosition[2]; }
+  TVector3 GetDirection() const { return fDirection; } // Hall C we don't use raster direction yet.
 
-  Double_t GetCurrentX() { return fRawPos(0); }
-  Double_t GetCurrentY() { return fRawPos(1); }
+  Double_t GetCurrentX() { return fRawPos[0]; }
+  Double_t GetCurrentY() { return fRawPos[1]; }
 
  protected:
 
+  void InitializeReconstruction();
   void           ClearEvent();
-  virtual Int_t  ReadDatabase( const TDatime& date );
+  Int_t  ReadDatabase( const TDatime& date );
+
+  Double_t       fRawADC[2];     // raw ADC values
+  Double_t       fPedADC[2];     // ADC poedestals 
 
-  TVector        fRawPos[2];        // current in Raster ADCs for position
+  Double_t       fRawPos[2];     // current in Raster ADCs for position
   TVector3       fPosition[2];   // Beam position at 1st, 2nd BPM or at the target (meters)
-  TVector3  fPosOff[2]; // pedestals 
+  TVector3  fPosPed[2]; // pedestals 
+  TVector3  fDirection;  // Beam angle at the target (meters)
+
 
+  // Array to store channel numbers corresponding to X and Ysignals. 0 - X, 1 - Y.
+  Double_t fChN0[2]; 
 
  private:
+  Bool_t fAnalyzePedestals;
+  void CalculatePedestals();
+  void AccumulatePedestals(TClonesArray* rawhits);
 
   ClassDef(THcRaster, 0);	// add THcRaster to ROOT library
 };  
diff --git a/src/THcRasterRawHit.cxx b/src/THcRasterRawHit.cxx
new file mode 100644
index 0000000..e3efc7f
--- /dev/null
+++ b/src/THcRasterRawHit.cxx
@@ -0,0 +1,85 @@
+// Author : Buddhini Waidyawansa
+// Date : 23-01-2014
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcRasterRawHit                                                           //
+//                                                                           //
+// Class representing a single raw hit for the raster                        //
+//                                                                           //
+// Contains the X, Y raster voltage signals and sync signals                 //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+
+#include "THcRasterRawHit.h"
+
+using namespace std;
+
+
+void THcRasterRawHit::SetData(Int_t signal, Int_t data) {
+  if(signal==0) {
+    fADC_xsync = data;
+  } else if (signal==1) {
+    fADC_xsig = data;
+  } else if(signal==2) {
+    fADC_ysync = data;
+  } else if (signal==3) {
+    fADC_ysig = data;
+  }
+}
+
+Int_t THcRasterRawHit::GetData(Int_t signal) {
+  if(signal==1) {
+    return(fADC_xsync);
+  } else if (signal==2) {
+    return(fADC_xsig);
+  } else if(signal==3) {
+    return(fADC_ysync);
+  } else if (signal==4) {
+    return(fADC_ysig);
+  }
+  return(-1); // Actually should throw exception
+}
+
+// Int_t THcRasterRawHit::Compare(const TObject* obj) const
+// {
+//   // Compare to sort by the plane
+//   // There is only one raster so no need for an additional check on the counter
+
+//   const THcRasterRawHit* hit = dynamic_cast<const THcRasterRawHit*>(obj);
+
+//   if(!hit) return -1;
+//   Int_t p1 = fPlane;
+//   Int_t p2 = hit->fPlane;
+//   if(p1 < p2) return -1;
+//   else if(p1 > p2) return 1;
+
+// }
+
+//_____________________________________________________________________________
+THcRasterRawHit& THcRasterRawHit::operator=( const THcRasterRawHit& rhs )
+{
+  // Assignment operator.
+
+  THcRawHit::operator=(rhs);
+  if ( this != &rhs ) {
+    fPlane     = rhs.fPlane;
+    fCounter   = rhs.fCounter;
+    fADC_xsync = rhs.fADC_xsync;
+    fADC_xsig  = rhs.fADC_xsig;
+    fADC_ysync = rhs.fADC_ysync;
+    fADC_ysig  = rhs.fADC_ysig;
+  }
+  return *this;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+ClassImp(THcRasterRawHit)
+
diff --git a/src/THcRasterRawHit.h b/src/THcRasterRawHit.h
new file mode 100644
index 0000000..e30154a
--- /dev/null
+++ b/src/THcRasterRawHit.h
@@ -0,0 +1,45 @@
+#ifndef ROOT_THcRasterRawHit
+#define ROOT_THcRasterRawHit
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcRasterRawHit                                                           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "THcRawHit.h"
+
+class THcRasterRawHit : public THcRawHit {
+
+ public:
+
+ THcRasterRawHit(Int_t plane=0, Int_t counter=0) : THcRawHit(plane, counter), 
+    fADC_xsig(-1), fADC_ysig(-1),
+    fADC_xsync(-1), fADC_ysync(-1) {
+  }
+
+  THcRasterRawHit& operator=( const THcRasterRawHit& );
+  ~THcRasterRawHit() {}
+  
+  void Clear( Option_t* opt="" )
+  { fADC_xsig = -1; fADC_ysig = -1; fADC_xsync = -1; fADC_ysync = -1; }
+  
+  void SetData(Int_t signal, Int_t data);
+  Int_t GetData(Int_t signal);
+  //Int_t Compare(TObject* obj);
+
+  // signals
+  Int_t fADC_xsig;
+  Int_t fADC_ysig;
+  Int_t fADC_xsync;
+  Int_t fADC_ysync;
+
+ protected:
+
+ private:
+
+  ClassDef(THcRasterRawHit, 0);	// Raw hit class for raster data
+};  
+
+#endif
diff --git a/src/THcRasteredBeam.cxx b/src/THcRasteredBeam.cxx
new file mode 100644
index 0000000..b9f77d3
--- /dev/null
+++ b/src/THcRasteredBeam.cxx
@@ -0,0 +1,73 @@
+// Author : Buddhini Waidyawansa
+// Date : 01-08-2014
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcRasteredBeam                                                           //
+//                                                                           //
+//  A class to handle the raster processing tasks                            //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "THcRasteredBeam.h"
+#include "THcRaster.h"
+#include "TMath.h"
+#include "TDatime.h"
+#include "TList.h"
+
+#include "VarDef.h"
+
+//_____________________________________________________________________________
+THcRasteredBeam::THcRasteredBeam( const char* name, const char* description ) :
+    THaBeam( name, description ) 
+{
+  AddDetector( new THcRaster("Raster","raster",this) );
+}
+
+
+//_____________________________________________________________________________
+Int_t THcRasteredBeam::Reconstruct()
+{
+
+  TIter nextDet( fDetectors ); 
+
+  nextDet.Reset();
+
+  // This apparatus assumes that there is only one detector 
+  // in the list. If someone adds detectors by hand, the first 
+  // detector in the list will be used to get the beam position
+  // the others will be processed
+  // -- Iam not sure why the code is written like this. But for now, I am 
+  // going to work with this code as it is since all I need for is to
+  // decode the raster - Buddhini
+
+  
+  if (THaBeamDet* theBeamDet=
+      static_cast<THaBeamDet*>( nextDet() )) {
+    theBeamDet->Process();
+    fPosition = theBeamDet->GetPosition();
+    fDirection = theBeamDet->GetDirection();
+  }
+  else {
+    Error( Here("THcRasteredBeam::Reconstruct"), 
+	   "Beamline Detectors Missing in Detector List" );
+  }
+
+
+  // Process any other detectors that may have been added (by default none)
+  while (THaBeamDet * theBeamDet=
+	 static_cast<THaBeamDet*>( nextDet() )) {
+    theBeamDet->Process();
+  }
+
+  Update();
+
+  return 0;
+
+}
+
+//_____________________________________________________________________________
+ClassImp(THcRasteredBeam)
+
+
+////////////////////////////////////////////////////////////////////////////////
diff --git a/src/THcRasteredBeam.h b/src/THcRasteredBeam.h
new file mode 100644
index 0000000..2e78151
--- /dev/null
+++ b/src/THcRasteredBeam.h
@@ -0,0 +1,31 @@
+#ifndef ROOT_THcRasteredBeam
+#define ROOT_THcRasteredBeam
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcRasteredBeam                                                           //
+// A beam with rastered beam, analyzed event by event using raster currents  //
+// This is identical to THaRasteredBeam except that we need to use THcRaster //
+// For raster signal processing.                                             //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "THaBeam.h"
+
+
+class THcRasteredBeam : public THaBeam {
+
+ public:
+
+  THcRasteredBeam( const char* name, const char* description) ;
+
+  virtual ~THcRasteredBeam(){};
+
+  virtual Int_t Reconstruct() ;
+
+  ClassDef(THcRasteredBeam, 0);	// add THcRasteredBeam to ROOT library
+};  
+
+////////////////////////////////////////////////////////////////////////////////
+
+#endif
-- 
GitLab