From 8de0fd11fc573c495e8e917d3f501bd14a0056f2 Mon Sep 17 00:00:00 2001
From: Markus Frank <markus.frank@cern.ch>
Date: Mon, 3 Jun 2013 11:41:35 +0000
Subject: [PATCH] Fix problems with invalid volume ids

---
 .../ILDExDet/src/compact/ILDExSIT_geo.cpp      | 18 +++++++++---------
 .../ILDExDet/src/compact/ILDExVXD_geo.cpp      | 15 ++++++++-------
 DDG4/src/Geant4Converter.cpp                   |  9 ++-------
 3 files changed, 19 insertions(+), 23 deletions(-)

diff --git a/DDExamples/ILDExDet/src/compact/ILDExSIT_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExSIT_geo.cpp
index aa3a06520..efb9ddf72 100644
--- a/DDExamples/ILDExDet/src/compact/ILDExSIT_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/ILDExSIT_geo.cpp
@@ -18,12 +18,12 @@ using namespace DD4hep;
 using namespace DD4hep::Geometry;
   
 static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
-  xml_det_t   x_det = e;
-  string      name  = x_det.nameStr();
-  DetElement  sit(name,x_det.id());
-  Volume      mother = lcdd.pickMotherVolume(sit);
-  
-  
+  xml_det_t    x_det = e;
+  string       name  = x_det.nameStr();
+  DetElement   sit(name,x_det.id());
+  Assembly     assembly(name+"_assembly");
+  PlacedVolume pv;
+
   // setup the encoder
   UTIL::BitField64 encoder( ILDCellID0::encoder_string ) ;
   encoder.reset() ;  // reset to 0
@@ -75,11 +75,11 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
       // place the volume and set the cellID0 - will be set to the copyNo in Geant4Converter
       encoder[ILDCellID0::module]  = j  ;
       int cellID0 = encoder.lowWord() ;
-
-      mother.placeVolume(laddervol,pos,Rotation(0,0,j*dphi)).addPhysVolID("CellID0", cellID0 )  ;
-
+      assembly.placeVolume(laddervol,pos,Rotation(0,0,j*dphi)).addPhysVolID("CellID0", cellID0 )  ;
    }
   }
+  pv = lcdd.pickMotherVolume(sit).placeVolume(assembly);
+  sit.setPlacement(pv);
   return sit;
 }
 
diff --git a/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp b/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp
index 41c789c86..3a50a2c10 100644
--- a/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp
+++ b/DDExamples/ILDExDet/src/compact/ILDExVXD_geo.cpp
@@ -18,16 +18,16 @@ using namespace DD4hep;
 using namespace DD4hep::Geometry;
 
 static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
-  DetElement  vxd;
-  xml_det_t   x_det = e;
-  string      name  = x_det.nameStr();
+  DetElement   vxd;
+  xml_det_t    x_det = e;
+  string       name  = x_det.nameStr();
+  Assembly     assembly(name+"_assembly");
+  PlacedVolume pv;
 
   VXDData* vxd_data = new VXDData();
   vxd.assign(vxd_data,name,x_det.typeStr());
   vxd_data->id = x_det.id();
 
-  Volume      mother = lcdd.pickMotherVolume(vxd);    
-
   // setup the encoder
   UTIL::BitField64 encoder( ILDCellID0::encoder_string ) ;
   encoder.reset() ;  // reset to 0
@@ -133,11 +133,12 @@ static Ref_t create_element(LCDD& lcdd, xml_h e, SensitiveDetector sens)  {
       encoder[ILDCellID0::module]  = j  ;
       int cellID0 = encoder.lowWord() ;
 
-      mother.placeVolume(laddervol,pos, rot   ).addPhysVolID("CellID0", cellID0 )  ;
+      assembly.placeVolume(laddervol,pos, rot   ).addPhysVolID("CellID0", cellID0 )  ;
     }
-    
     vxd.setVisAttributes(lcdd, x_det.visStr(),laddervol);
   }
+  pv = lcdd.pickMotherVolume(vxd).placeVolume(assembly);
+  vxd.setPlacement(pv);
   return vxd;
 }
 
diff --git a/DDG4/src/Geant4Converter.cpp b/DDG4/src/Geant4Converter.cpp
index 9852c3b4e..78608c25e 100644
--- a/DDG4/src/Geant4Converter.cpp
+++ b/DDG4/src/Geant4Converter.cpp
@@ -411,7 +411,6 @@ void* Geant4Converter::handlePlacement(const string& name, const TGeoNode* node)
   G4PVPlacement* g4    = info.g4Placements[node];
   if ( !g4 )   {
     TGeoMatrix*      trafo = node->GetMatrix();
-
     int              copy  = node->GetNumber();
 
     // if the CellID0 volID is defined for the volume we 
@@ -428,16 +427,12 @@ void* Geant4Converter::handlePlacement(const string& name, const TGeoNode* node)
 	copy = it->second ;
     }
     //--------------------------------------------------------
-
-
     G4LogicalVolume* vol   = info.g4Volumes[node->GetVolume()];
     G4LogicalVolume* mot   = info.g4Volumes[node->GetMotherVolume()];
     if ( trafo ) {
       const Double_t*  trans = trafo->GetTranslation();
-      const Value<TGeoNodeMatrix,PlacedVolume::Object>* obj = 
-	dynamic_cast<const Value<TGeoNodeMatrix,PlacedVolume::Object>* >(node);
       if ( 0 == vol ) {
-	cout << "FATAL: Unknown G4 volume:" << (void*)obj << " " << obj->GetName() << endl; 
+	cout << "FATAL: Unknown G4 volume:" << (void*)node << " " << node->GetName() << endl; 
       }
       else if ( trafo->IsRotation() )    {
 	const Double_t*  rot   = trafo->GetRotationMatrix();
@@ -647,7 +642,7 @@ void* Geant4Converter::printSensitive(const TNamed* sens_det, const set<const TG
   G4GeometryInfo& info = data();
   Geant4SensitiveDetector* g4 = info.g4SensDets[sens_det];
   ConstVolumeSet& volset = info.sensitives[sens_det];
-  SensitiveDetector sd = Ref_t(sens_det);
+  SensitiveDetector   sd = Ref_t(sens_det);
   bool verbose = sd.verbose();
 
   if ( verbose )    {
-- 
GitLab