Go to the documentation of this file.00001 #include "SimG4CMS/Tracker/interface/TouchableToHistory.h"
00002 #include "DetectorDescription/Core/interface/DDExpandedView.h"
00003 #include "DetectorDescription/Core/interface/DDFilteredView.h"
00004 #include "DetectorDescription/Core/interface/DDCompactView.h"
00005 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00006
00007
00008 #include "G4TransportationManager.hh"
00009 #include "G4Navigator.hh"
00010 #include "G4VTouchable.hh"
00011 #include "G4TouchableHistory.hh"
00012
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014
00015
00016
00017 void TouchableToHistory::buildAll(){
00018 if (alreadySet) return;
00019 alreadySet = true;
00020
00021 G4Navigator* theStdNavigator = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking();
00022 G4Navigator theNavigator;
00023 theNavigator.SetWorldVolume(theStdNavigator->GetWorldVolume());
00024
00025
00026 std::vector<const GeometricDet*> allSensitiveDets;
00027 myGeomDet->deepComponents(allSensitiveDets);
00028 edm::LogInfo("TrackerSimInfoNumbering")<<" TouchableTo History: got "<<allSensitiveDets.size()<<" sensitive detectors from TrackerMapDDDtoID.";
00029
00030 for ( std::vector<const GeometricDet*>::const_iterator it = allSensitiveDets.begin();
00031 it != allSensitiveDets.end();
00032 ++it)
00033 {
00034 DDTranslation const & t = (*it)->translation();
00035 theNavigator.LocateGlobalPointAndSetup(G4ThreeVector(t.x(),t.y(),t.z()));
00036 G4TouchableHistory * hist = theNavigator.CreateTouchableHistory();
00037 TouchableToHistory::Nav_Story st = touchableToNavStory(hist);
00038
00039 #ifdef DEBUG
00040 u_int32_t oldsize = myDirectMap.size();
00041 #endif
00042
00043 myMap[st] = nav_type((*it)->navType().begin(),(*it)->navType().end());
00044 myDirectMap[st] = (*it)->geographicalID();
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 delete hist;
00057
00058 }
00059 edm::LogInfo("TrackerSimInfoNumbering")<<" TouchableToHistory: mapped "<<myDirectMap.size()<<" detectors to G4.";
00060
00061 if (myDirectMap.size() != allSensitiveDets.size()){
00062 edm::LogError("TrackerSimInfoNumbering")<<" ERROR: DDD sensitive detectors do not match Geant4 ones.";
00063
00064 abort();
00065 }
00066
00067
00068 }
00069
00070 DDFilteredView& TouchableToHistory::getFilteredView(const G4VTouchable& t, DDFilteredView& f){
00071 if (alreadySet == false)
00072 buildAll();
00073 f.goTo(myMap[touchableToNavStory(&t)]);
00074 return f;
00075 }
00076 TouchableToHistory::nav_type TouchableToHistory::getNavType(const G4VTouchable& t){
00077 if (alreadySet == false)
00078 edm::LogError("TrackerSimInfoNumbering")<<" NOT READY ";
00079 return myMap[touchableToNavStory(&t)];
00080 }
00081
00082 TouchableToHistory::Nav_Story TouchableToHistory::getNavStory(DDFilteredView& i){
00083 if (alreadySet == false) buildAll();
00084 DDTranslation t = i.translation();
00085
00086 G4Navigator* theStdNavigator = G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking();
00087 G4Navigator theNavigator;
00088 theNavigator.SetWorldVolume(theStdNavigator->GetWorldVolume());
00089
00090 theNavigator.LocateGlobalPointAndSetup(G4ThreeVector(t.x(),t.y(),t.z()));
00091 G4TouchableHistory* hist = theNavigator.CreateTouchableHistory();
00092 TouchableToHistory::Nav_Story temp = touchableToNavStory(hist);
00093 delete hist;
00094 return (temp);
00095 }
00096
00097 TouchableToHistory::Nav_Story TouchableToHistory::touchableToNavStory(const G4VTouchable *v) {
00098 static G4String tobinactive("TOBInactive");
00099 Nav_Story temp;
00100 #ifdef DEBUG
00101 std::vector<int> debugint;
00102 std::vector<std::string> debugstring;
00103 #endif
00104 int levels = v->GetHistoryDepth();
00105
00106 for (int k=0; k<=levels; k++){
00107 if (v->GetVolume(k)->GetLogicalVolume()->GetName() != tobinactive) {
00108 temp.push_back(
00109 std::pair<int,std::string>
00110 (v->GetVolume(k)->GetCopyNo(),
00111 v->GetVolume(k)->GetLogicalVolume()->GetName()));
00112 #ifdef DEBUG
00113 debugint.push_back(v->GetVolume(k)->GetCopyNo());
00114 debugstring.push_back(v->GetVolume(k)->GetLogicalVolume()->GetName());
00115 #endif
00116 }
00117 }
00118 #ifdef DEBUG
00119
00120 for(u_int32_t jj=0;jj<debugstring.size();jj++)LogDebug("TrackerSimDebugNumbering")<<" "<<debugstring[jj];
00121 #endif
00122 return temp;
00123 }
00124
00125 TouchableToHistory::nav_type TouchableToHistory::touchableToNavType(const G4VTouchable* v) {
00126 if (alreadySet == false)
00127 buildAll();
00128
00129 dumpG4VPV(v);
00130
00131 return myMap[touchableToNavStory(v)];
00132 }
00133
00134 int TouchableToHistory::touchableToInt(const G4VTouchable* v) {
00135 if (alreadySet == false)
00136 buildAll();
00137
00138 dumpG4VPV(v);
00139
00140 LogDebug("TrackerSimDebugNumbering")<<" Returning: "<< myDirectMap[touchableToNavStory(v)]<<std::endl;
00141
00142 return myDirectMap[touchableToNavStory(v)];
00143 }
00144
00145 void TouchableToHistory::dumpG4VPV(const G4VTouchable* v){
00146 int levels = v->GetHistoryDepth();
00147
00148 LogDebug("TrackerSimDebugNumbering")<<" NAME : "<<v->GetVolume()->GetLogicalVolume()->GetName();
00149 for (int k=0; k<=levels; k++){
00150 LogDebug("TrackerSimInfoNumbering") <<" Hist: "<< v->GetVolume(k)->GetLogicalVolume()->GetName()<<
00151 " Copy "<< v->GetVolume(k)->GetCopyNo();
00152 }
00153 }
00154