//###################################################

using namespace std;
#pragma implementation
#include "TString.h"
#include <fstream>
#include "hades.h"
#include "hspectrometer.h"
#include "hrichgeometrypar.h"
#include "hrichdetector.h"
#include "hparhadasciifileio.h"

ClassImp(HRichGeometryPar)


//----------------------------------------------------------------------------
 HRichGeometryPar::HRichGeometryPar(const char* name,const char* title,
                                   const char* context)
                : HRichParSet(name,title,context) {
  fSectorsNr = 0;
  for (Int_t i = 0; i < 6; i++) fSectorActive[i] = 0;
  fColumns = 0;
  fRows = 0;
  fLab = 0;
  fDistanceWiresPads = 0.;
  fSectorShift = 0.;
}
//============================================================================

//----------------------------------------------------------------------------
 HRichGeometryPar::~HRichGeometryPar()
{
  clear(); 
}
//============================================================================

//----------------------------------------------------------------------------
 Int_t HRichGeometryPar::getSectorsNr() {
 return fSectorsNr;
}
//============================================================================

//----------------------------------------------------------------------------
 Int_t HRichGeometryPar::getSector(Int_t s) {
 return fSectorActive[s];
}
//============================================================================

//----------------------------------------------------------------------------
 Int_t HRichGeometryPar::getColumns() {
 return fColumns;
}
//============================================================================

//----------------------------------------------------------------------------
 Int_t HRichGeometryPar::getRows() {
 return fRows;
}
//============================================================================

//----------------------------------------------------------------------------
 Int_t HRichGeometryPar::getPadsNr() {
 return (fColumns*fRows);
}
//============================================================================

//----------------------------------------------------------------------------
 Int_t HRichGeometryPar::getPadStatus(Int_t padnr) {
 return fPads.getPad(padnr)->getPadActive();
}
//============================================================================

//----------------------------------------------------------------------------
 Bool_t HRichGeometryPar::initAscii(HParHadAsciiFileIo* pHadAsciiFile) {

 using namespace HadAsciiAuxiliaryFunctions;
 if (!pHadAsciiFile) return kFALSE;

 HRichDetector *pRichDet = (HRichDetector*)gHades->getSetup()->getDetector("Rich");
 
 Bool_t status = kTRUE;
 Int_t i;

 try {

  HAsciiKey &mydata = *pHadAsciiFile->GetKeyAscii();

  mydata.SetActiveSection("RICH detector layout");

  for (i = 0; i < 6; i++) {
   fSectorActive[i] = pRichDet->getModule(i,0);
   if (fSectorActive[i] > 0) fSectorsNr++;
  }
  if (fSectorsNr > 0) {
   fColumns = pRichDet->getColumns();
   fRows = pRichDet->getRows();
  }
  fDistanceWiresPads = mydata.ReadFloat("Distance between wire and pad planes");
  fSectorShift = mydata.ReadFloat("Sector shift");


  // sector parameters
  for (i = 0; i < 6; i++)
   if (fSectorActive[i] > 0) {
    fSectors[i].setSectorId(i);
    switch (i) {
     case 0: fSectors[i].setPhi(90.);
             break;
     case 1: fSectors[i].setPhi(150.);
             break;
     case 2: fSectors[i].setPhi(210.);
             break;
     case 3: fSectors[i].setPhi(270.);
             break;
     case 4: fSectors[i].setPhi(330.);
             break;
     case 5: fSectors[i].setPhi(30.);
             break;
    }
   }

  if (fSectorsNr > 0) {
   // pads parameters
   fPads.initAscii(pHadAsciiFile);
   // frame parameters
   fFrame.initAscii(pHadAsciiFile);
   // wires parameters
   fWires.initAscii(pHadAsciiFile);
  }

  initParameters();

 } // eof try block

 catch (Bool_t ret) {
  status = ret;
 }
 catch (...) {
  status = kFALSE;
  ErrorMsg(2,"HRichGeometryPar::initAscii",1,"Unidentified exception catched.");
 }

 if (status)
  ErrorMsg(0,"HRichGeometryPar::initAscii",
   1,"Container 'RichGeometryParameters' has been read from ASCII file.");

 return status;
}
//============================================================================

//----------------------------------------------------------------------------
 Bool_t HRichGeometryPar::writeAscii(HParHadAsciiFileIo* pHadAsciiFile) {

 using namespace HadAsciiAuxiliaryFunctions;
 if (!pHadAsciiFile) return kFALSE;

 Bool_t status = kTRUE;

 try {

  HAsciiKey &mydata = *pHadAsciiFile->GetKeyAscii();

  mydata.WriteSection("RICH detector layout");

  mydata.WriteFloat("Distance between wire and pad planes", fDistanceWiresPads);
  mydata.WriteFloat("Sector shift", fSectorShift);

  for (Int_t i = 0; i < 1; i++)
   //if (fSectorActive[i] > 0) {
   // fSectors[i].writeAscii(pHadAsciiFile);
   //}         // this is obsolete

  if (fSectorsNr > 0) {

   // write frame parameters
   fFrame.writeAscii(pHadAsciiFile);
   // write wires parameters
   fWires.writeAscii(pHadAsciiFile);
   // writing pads parameters
   fPads.writeAscii(pHadAsciiFile);
  }

 } // eof try block

 catch (Bool_t ret) {
  status = ret;
 }
 catch (...) {
  status = kFALSE;
  ErrorMsg(2,"HRichGeometryPar::writeAscii",1,"Unidentified exception catched.");
 }

 if (status)
  ErrorMsg(0,"HRichGeometryPar::writeAscii",
   1,"Container 'RichGeometryParameters' has been written to ASCII file.");

 return status;
}
//============================================================================

//----------------------------------------------------------------------------
 void HRichGeometryPar::initParameters() {

  // here we calculate x, y, z in LAB and phi and store it for each pad

  Int_t i, j;
  Float_t x, y, z, xl, yl, zl;
  HLocation loc;
  Float_t len, phi;

  for(i = 0; i < 6; i++)
   if (getSector(i) > 0) {

    for (j = 0; j < getPadsNr(); j++) {

     x = fPads.getPad(j)->getY(); // local y is X in lab before rotation and shift
     y = fPads.getPad(j)->getX(); // local x is Y in lab before rotation and shift
     z = 0.;



     xl = cos(3.141592654*20./180.)*x;
     yl = y;
     zl = sin(3.141592654*20./180.)*x; 

     //   xl += fSectorShift;

     x = cos(3.141592654*fSectors[i].getPhi()/180.)*xl -
         sin(3.141592654*fSectors[i].getPhi()/180.)*yl;
     y = sin(3.141592654*fSectors[i].getPhi()/180.)*xl +
         cos(3.141592654*fSectors[i].getPhi()/180.)*yl; 
     z = zl;

     fPads.getPad(j)->setXYZlab(i, x, y, z);

     len = sqrt(xl*xl + yl*yl);
     phi = 0.;
     if (len > 0) phi = 57.2957795 * acos(xl / len);
     if (yl < 0) phi = -1.*phi;

     phi += fSectors[i].getPhi();

     Float_t sphi = fPads.getPad(j)->getPhi(i);
     if (sphi>0. && sphi-phi>1.e-2)
     {
	 Error("HRichGeometryPar::initParameters","inconsistency between phi from param source and calculated phi (from pad plane coord in mm)");
	 cout<<" ora phi: "<<sphi<<"  calc phi: "<<phi<<endl;
     }
     fPads.getPad(j)->setPhi(i, phi);

     //if (i==5) cout << fPads.getPad(j)->getPadX() << " " << fPads.getPad(j)->getPadY() 
      //              << "    " << phi << "   ...   " << fPads.getPad(j)->getX() 
       //             << " " << fPads.getPad(j)->getY() << endl;

    }
   }                         
}
//============================================================================

//----------------------------------------------------------------------------
 void HRichGeometryPar::Streamer(TBuffer &R__b)
{
   // Stream an object of class HRichGeometryPar.

   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
      HRichParSet::Streamer(R__b);
      R__b >> fSectorsNr;
      R__b.ReadStaticArray(fSectorActive);
      R__b >> fColumns;
      R__b >> fRows;
      R__b >> fLab;
      R__b >> fDistanceWiresPads;
      R__b >> fSectorShift;
      int R__i;
      for (R__i = 0; R__i < 6; R__i++)
         fSectors[R__i].Streamer(R__b);
      fFrame.Streamer(R__b);
      fWires.Streamer(R__b);
      fPads.Streamer(R__b);

      initParameters();

   } else {
      R__b.WriteVersion(HRichGeometryPar::IsA());
      HRichParSet::Streamer(R__b);
      R__b << fSectorsNr;
      R__b.WriteArray(fSectorActive, 6);
      R__b << fColumns;
      R__b << fRows;
      R__b << fLab;
      R__b << fDistanceWiresPads;
      R__b << fSectorShift;
      int R__i;
      for (R__i = 0; R__i < 6; R__i++)
         fSectors[R__i].Streamer(R__b);
      fFrame.Streamer(R__b);
      fWires.Streamer(R__b);                             
      fPads.Streamer(R__b);
   }
}      
//============================================================================

//----------------------------------------------------------------------------
 void HRichGeometryPar::clear() { }
//============================================================================



ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.