Skip to content
Snippets Groups Projects
DDTECPhiAlgo.cpp 3.28 KiB
Newer Older
//==========================================================================
//  AIDA Detector description implementation 
//--------------------------------------------------------------------------
// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
// All rights reserved.
//
// For the licensing terms see $DD4hepINSTALL/LICENSE.
// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
//
// Author     : M.Frank
//
//==========================================================================
//
// Specialized generic detector constructor
// 
//==========================================================================

// Framework include files
#include "DD4hep/DetFactoryHelper.h"
#include "DD4hep/Printout.h"
#include "DDCMS/DDCMSPlugins.h"

// C/C++ include files
#include <sstream>

using namespace std;
using namespace dd4hep;
using namespace dd4hep::cms;

static long algorithm(Detector& /* description */,
                      ParsingContext& ctxt,
                      xml_h e,
                      SensitiveDetector& /* sens */)
{
  stringstream  str;
  Namespace     ns(ctxt, e, true);
  AlgoArguments args(ctxt, e);
  Volume        mother      = ns.volume(args.parentName());
  Volume        child       = ns.volume(args.childName());
  double        startAngle  = args.value<double>("StartAngle");  //Start angle
  double        incrAngle   = args.value<double>("IncrAngle");   //Increment in angle
  double        zIn         = args.value<double>("ZIn");         //z position for the even ones
  double        zOut        = args.value<double>("ZOut");        //z position for the odd  ones
  int           number      = args.value<double>("Number");      //Number of copies
  int           startCopyNo = args.find("StartCopyNo") ? args.value<int>("StartCopyNo") : 1; //Start copy number
  int           incrCopyNo  = args.find("IncrCopyNo") ? args.value<int>("IncrCopyNo") : 1;  //Increment in copy number

  str << "debug: Parameters for "
      << "positioning--" << "\tStartAngle " 
      << startAngle/CLHEP::deg << "\tIncrAngle " 
      << incrAngle/CLHEP::deg << "\tZ in/out " << zIn << ", " 
      << zOut 	      << "\tCopy Numbers " << number 
      << " Start/Increment " << startCopyNo << ", " 
      << incrCopyNo;
  printout(ctxt.debug_algorithms ? ALWAYS : DEBUG,"DDTECPhiAlgo",str);
  str << "debug: Parent " << mother.name() 
      << "\tChild " << child.name() << " NameSpace " 
      << ns.name;
  printout(ctxt.debug_algorithms ? ALWAYS : DEBUG,"DDTECPhiAlgo",str);

  if (number > 0) {
    double theta  = 90.*CLHEP::deg;
    int    copyNo = startCopyNo;
    for (int i=0; i<number; i++) {
      double phix = startAngle + i*incrAngle;
      double phiy = phix + 90.*CLHEP::deg;
      Rotation3D rotation = make_rotation3D(theta, phix, theta, phiy, 0, 0);
      Position   tran(0., 0., (i%2 == 0) ? zIn : zOut);
      /* PlacedVolume pv = */ mother.placeVolume(child,Transform3D(rotation,tran));
      str << "test: " << child.name() <<" number "
          << copyNo << " positioned in " << mother.name() <<" at "
          << tran << " with " << rotation;
      printout(ctxt.debug_algorithms ? ALWAYS : DEBUG,"DDTECPhiAlgo",str);
      copyNo += incrCopyNo;
    }
  }
  return 1;
}

// first argument is the type from the xml file
DECLARE_DDCMS_DETELEMENT(track_DDTECPhiAlgo,algorithm)