Go to the documentation of this file.00001
00002
00003
00004
00005
00007 #include "SimG4CMS/Forward/interface/BscNumberingScheme.h"
00008
00009 #include "CLHEP/Units/GlobalSystemOfUnits.h"
00010 #include "globals.hh"
00011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00012
00013 BscNumberingScheme::BscNumberingScheme() {
00014 LogDebug("BscSim") << " Creating BscNumberingScheme" ;
00015 }
00016
00017 BscNumberingScheme::~BscNumberingScheme() {
00018 LogDebug("BscSim") << " Deleting BscNumberingScheme" ;
00019 }
00020
00021 int BscNumberingScheme::detectorLevel(const G4Step* aStep) const {
00022
00023
00024 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
00025 int level = 0;
00026 if (touch) level = ((touch->GetHistoryDepth())+1);
00027 return level;
00028 }
00029
00030 void BscNumberingScheme::detectorLevel(const G4Step* aStep, int& level,
00031 int* copyno, G4String* name) const {
00032
00033
00034 if (level > 0) {
00035 const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
00036 for (int ii = 0; ii < level; ii++) {
00037 int i = level - ii - 1;
00038 name[ii] = touch->GetVolume(i)->GetName();
00039 copyno[ii] = touch->GetReplicaNumber(i);
00040 }
00041 }
00042 }
00043
00044 unsigned int BscNumberingScheme::getUnitID(const G4Step* aStep) const {
00045
00046 unsigned intindex=0;
00047 int level = detectorLevel(aStep);
00048
00049 LogDebug("BscSim") << "BscNumberingScheme number of levels= " << level;
00050
00051
00052 if (level > 0) {
00053 int* copyno = new int[level];
00054 G4String* name = new G4String[level];
00055 detectorLevel(aStep, level, copyno, name);
00056
00057 int det = 0;
00058 int zside = 0;
00059 int station = 0;
00060 for (int ich=0; ich < level; ich++) {
00061
00062 if(name[ich] == "BSC1" ||name[ich] == "BSC2" ) {
00063 zside = copyno[ich]-1;
00064 } else if(name[ich] == "BSCTrap") {
00065 det = 0;
00066 station = 2*(copyno[ich]-1);
00067 } else if(name[ich] == "BSCTubs") {
00068 det = 1;
00069 station = copyno[ich]-1;
00070 } else if(name[ich] == "BSCTTop") {
00071 ++station;
00072 } else if(name[ich] == "BSC2Pad"){
00073 det = 2;
00074 station = copyno[ich]-1;
00075 }
00076
00077 LogDebug("BscSim") << "BscNumberingScheme " << "ich=" << ich <<"copyno"
00078 << copyno[ich] << "name=" << name[ich];
00079
00080 }
00081 intindex = packBscIndex (zside,det, station);
00082 LogDebug("BscSim") << "BscNumberingScheme : det " << det << " zside "
00083 << zside << " station " << station
00084 << " UnitID 0x" << std::hex << intindex << std::dec;
00085
00086 for (int ich = 0; ich < level; ich++)
00087 LogDebug("BscSim") <<" name = " << name[ich] <<" copy = " << copyno[ich];
00088 LogDebug("BscSim") << " packed index = 0x" << std::hex << intindex
00089 << std::dec;
00090
00091 delete[] copyno;
00092 delete[] name;
00093 }
00094
00095 return intindex;
00096
00097 }
00098
00099 unsigned BscNumberingScheme::packBscIndex(int zside,int det, int station){
00100 unsigned int idx = 6 << 28;
00101 idx += (zside<<5)&32;
00102 idx += (det<<3)&24;
00103 idx += (station&7);
00104 LogDebug("BscSim") << "Bsc packing: det " << det
00105 << " zside " << zside << " station " << station
00106 << "-> 0x" << std::hex << idx << std::dec;
00107
00108
00109 return idx;
00110 }
00111
00112 void BscNumberingScheme::unpackBscIndex(const unsigned int& idx) {
00113 int zside, det, station;
00114 zside = (idx&32)>>5;
00115 det = (idx&24)>>3;
00116 station = idx&7;
00117 LogDebug("BscSim") << " Bsc unpacking: 0x " << std::hex << idx << std::dec
00118 << " -> det " << det << " zside " << zside
00119 << " station " << station ;
00120 }