From df51989c03cee671135bba3f6b191d37e66718e2 Mon Sep 17 00:00:00 2001
From: Astrid Munnich <astrid.muennich@cern.ch>
Date: Thu, 2 Aug 2012 14:46:40 +0000
Subject: [PATCH] first version of LP1, tpc prototype at DESY. still needs
correct pads on modules.
---
DDExamples/ILDExDet/compact/LP1.xml | 143 ++++++++++++++++++
DDExamples/ILDExDet/src/compact/LP1_geo.cpp | 113 ++++++++++++++
DDExamples/ILDExReco/CMakeLists.txt | 2 +
DDExamples/ILDExReco/RecoLP1.cpp | 57 +++++++
DDExamples/ILDExReco/src/GearTPC.cpp | 21 ++-
DDExamples/ILDExTest/TestILDTPC.cpp | 4 +-
DDExamples/ILDExTest/TestTPCPrototype.cpp | 4 +-
DDExamples/ILDExTest/reference_TestILDTPC.txt | 2 +-
.../ILDExTest/reference_TestTPCPrototype.txt | 2 +-
9 files changed, 337 insertions(+), 11 deletions(-)
create mode 100644 DDExamples/ILDExDet/compact/LP1.xml
create mode 100644 DDExamples/ILDExDet/src/compact/LP1_geo.cpp
create mode 100644 DDExamples/ILDExReco/RecoLP1.cpp
diff --git a/DDExamples/ILDExDet/compact/LP1.xml b/DDExamples/ILDExDet/compact/LP1.xml
new file mode 100644
index 000000000..6952c7f0e
--- /dev/null
+++ b/DDExamples/ILDExDet/compact/LP1.xml
@@ -0,0 +1,143 @@
+<lccdd xmlns:compact="http://www.lcsim.org/schemas/compact/1.0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
+
+ <info name="LP1"
+ title="Large TPC Prototype LP1"
+ author="Astrid Muennich"
+ status="development"
+ version="$Id: compact.xml,v 1.3 2010/12/02 16:34:00 grefe Exp $">
+ <comment>compact discription of simple TPC prototype</comment>
+ </info>
+
+ <includes>
+ <gdmlFile ref="elements.xml"/>
+ <gdmlFile ref="materials.xml"/>
+ <pyBuilder ref="../drivers"/>
+ </includes>
+
+ <define>
+ <constant name="world_side" value="40*m"/>
+ <constant name="world_x" value="world_side/2"/>
+ <constant name="world_y" value="world_side/2"/>
+ <constant name="world_z" value="world_side/2"/>
+ <constant name="CrossingAngle" value="0.020"/>
+
+ <constant name="TPC_zhalf" value="300*mm"/>
+ <constant name="TPC_outer_radius" value="363.35*mm"/>
+ <constant name="TPC_inner_radius" value="0*mm"/>
+ <constant name="TPC_outer_thickness" value="0*mm"/>
+ <constant name="TPC_endcap_thickness" value="45*mm"/>
+ <constant name="TPC_center_x" value="1503.615*mm"/>
+
+ <constant name="tracking_region_radius" value="TPC_outer_radius + 1.0"/>
+ <constant name="tracking_region_zmax" value="TPC_zhalf + 1.0"/>
+ </define>
+
+ <materials>
+ <material name="Graphite">
+ <D value="1.7" unit="g/cm3"/>
+ <composite n="1" ref="C"/>
+ </material>
+ </materials>
+
+ <limits>
+ <limitset name="cal_limits">
+ <limit name="step_length_max" particles="*" value="5.0" unit="mm" />
+ </limitset>
+ </limits>
+
+ <display>
+ <vis name="TPCVis" alpha="1.0" r="0" g="1.0" b="0.0" showDaughters="true" visible="false"/>
+ <vis name="TPCEndplateVis" alpha="1.0" r="0" g="1.0" b="0.0" showDaughters="false" visible="true"/>
+ <vis name="TPCModuleVis" alpha="1.0" r="0" g="0.0" b="1.0" showDaughters="false" visible="true"/>
+ <vis name="TPCSupportVis" alpha="1.0" r="0" g="0.4" b="0.4" showDaughters="false" visible="true"/>
+ <vis name="TPCGasVis" alpha="0.5" r="0.7" g="0" b="0" showDaughters="false" visible="false"/>
+ </display>
+
+ <detectors>
+ <comment>Trackers</comment>
+
+
+ <detector name="TPC" type="LP1" vis="TPCVis" id="3">
+ <tubs rmin="TPC_inner_radius" rmax="TPC_outer_radius" zhalf="TPC_zhalf"/>
+
+ <material name="Air"/>
+
+
+ <detector name="TPC_OuterWall" type="TubeSegment" reflect="false" vis="TPCSupportVis" id="3">
+ <material name="Carbon" />
+ <tubs rmin="TPC_outer_radius - TPC_outer_thickness" rmax="TPC_outer_radius" zhalf="TPC_zhalf"/>
+ <position x="1503.615" y="0" z="TPC_zhalf"/>
+ <rotation x="0" y="0" z="0"/>
+ </detector>
+
+ <detector name="TPC_EndPlate" type="TubeSegment" reflect="false" vis="TPCEndPlateVis" id="0">
+ <material name="Carbon" />
+ <tubs rmin="TPC_inner_radius" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="0.5*TPC_endcap_thickness"/>
+ <position x="1503.615" y="0" z="2*TPC_zhalf+0.5*TPC_endcap_thickness"/>
+ <rotation x="0" y="0" z="0"/>
+
+ <modules name="TPC_Module" vis="TPCModuleVis">
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="0">
+ <position x="-171.615-1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z="- 8.3870 / 2. - 3.0"/>
+ </module>
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="1">
+ <position x="-171.615-1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z=" - 8.3870 / 2. + 5.39"/>
+ </module>
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="2">
+ <position x="-1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z=" - 8.3870 / 2. - 8.50"/>
+ </module>
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="3">
+ <position x="-1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z="- 8.3870 / 2. - 0.11"/>
+ </module>
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="4">
+ <position x="-1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z=" - 8.3870 / 2. + 8.27 "/>
+ </module>
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="5">
+ <position x="172.5-1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z=" - 8.3870 / 2. - 5.0"/>
+ </module>
+ <module type ="TubeSegment" rmin="1430" rmax="1600" phi0="8.387*deg" pads="PadLayout0" id="6">
+ <position x="172.5-1503.615" y="" z="0"/>
+ <rotation x="0" y="0" z="- 8.3870 / 2. + 3.39"/>
+ </module>
+ </modules>
+ </detector>
+
+
+ <detector name="TPC_GasVolume" type="TubeSegment" reflect="false" vis="TPCGasVis" id="4">
+ <material name="Argon"/>
+ <tubs rmin="TPC_inner_radius" rmax="TPC_outer_radius-TPC_outer_thickness" zhalf="TPC_zhalf"/>
+ <position x="1503.615" y="0" z="TPC_zhalf"/>
+ <rotation x="0" y="0" z="0"/>
+ </detector>
+
+ <detector name="TPC_Cathode" type="TubeSegment" reflect="false" vis="TPCSupportVis" id="5">
+ <material name="Argon"/>
+ <tubs rmin="TPC_inner_radius" rmax="TPC_outer_radius" zhalf="0.5"/>
+ <position x="1503.615" y="0" z="0"/>
+ <rotation x="0" y="0" z="0"/>
+ </detector>
+ </detector>
+
+ </detectors>
+
+ <readouts>
+ <readout name="PadLayout0">
+ <segmentation type="ProjectiveCylinder" phiBins="617" thetaBins="21"/>
+ <id>system:6</id>
+ </readout>
+ </readouts>
+
+ <fields>
+ <field type="Solenoid" name="GlobalSolenoid" inner_field="5.0"
+ outer_field="-1.5" zmax="SolenoidCoilOuterZ"
+ outer_radius="SolenoidalFieldRadius" />
+ </fields>
+</lccdd>
diff --git a/DDExamples/ILDExDet/src/compact/LP1_geo.cpp b/DDExamples/ILDExDet/src/compact/LP1_geo.cpp
new file mode 100644
index 000000000..5722531e7
--- /dev/null
+++ b/DDExamples/ILDExDet/src/compact/LP1_geo.cpp
@@ -0,0 +1,113 @@
+// $Id:$
+//====================================================================
+// AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------
+//
+// Author : A.Muennich
+//
+//====================================================================
+
+#include "DD4hep/DetFactoryHelper.h"
+#include "DD4hep/Detector.h"
+#include "TPCModuleData.h"
+#include "TPCModule.h"
+#include "FixedPadAngleDiskLayout.h"
+
+using namespace std;
+using namespace DD4hep;
+using namespace DD4hep::Geometry;
+
+static Ref_t create_element(LCDD& lcdd, const xml_h& e, SensitiveDetector& sens) {
+ xml_det_t x_det = e;
+ xml_comp_t x_tube (x_det.child(_X(tubs)));
+ string name = x_det.nameStr();
+ Material mat (lcdd.material(x_det.materialStr()));
+ //if data is needed do this
+ // Value<TNamed,TPCData>* tpcData = new Value<TNamed,TPCData>();
+ // DetElement tpc(tpcData, name, x_det.typeStr());
+ // tpcData->id = x_det.id();
+ //else do this
+ DetElement tpc (name,x_det.typeStr(),x_det.id());
+ Tube tpc_tub(x_tube.rmin(),x_tube.rmax(),x_tube.zhalf());
+ Volume tpc_vol(name+"_envelope_volume", tpc_tub, mat);
+
+ for(xml_coll_t c(e,_X(detector)); c; ++c) {
+ xml_comp_t px_det (c);
+ xml_comp_t px_tube (px_det.child(_X(tubs)));
+ xml_dim_t px_pos (px_det.child(_X(position)));
+ xml_dim_t px_rot (px_det.child(_X(rotation)));
+ xml_comp_t px_mat (px_det.child(_X(material)));
+ string part_nam(px_det.nameStr());
+ Material part_mat(lcdd.material(px_mat.nameStr()));
+ DetElement part_det(part_nam,px_det.typeStr(),px_det.id());
+ Tube part_tub(px_tube.rmin(),px_tube.rmax(),px_tube.zhalf());
+ Volume part_vol(part_nam,part_tub,part_mat);
+ Position part_pos(px_pos.x(),px_pos.y(),px_pos.z());
+ Rotation part_rot(px_rot.x(),px_rot.y(),px_rot.z());
+ bool reflect = px_det.reflect();
+
+ part_vol.setVisAttributes(lcdd,px_det.visStr());
+ //Endplate
+ if(part_det.id()== 0){
+ //modules
+ int mdcount=0;
+ for(xml_coll_t m(px_det,_X(modules)); m; ++m) {
+ xml_comp_t modules (m);
+ string m_name = modules.nameStr();
+ for(xml_coll_t r(modules,_X(module)); r; ++r) {
+ xml_comp_t mod(r);
+ int modID=mod.id();
+ //shape of module
+ double rmin=mod.rmin();
+ double rmax=mod.rmax();
+ double DeltaPhi=mod.phi0();
+ double zhalf=px_tube.zhalf();
+ string m_nam=m_name+_toString(modID,"_M%d");
+ Volume mr_vol(m_nam,Tube(rmin,rmax,zhalf,DeltaPhi),part_mat);
+ Material mr_mat(lcdd.material(px_mat.nameStr()));
+ Readout xml_pads(lcdd.readout(mod.padType()));
+ //placing modules
+ DetElement module(part_det,m_nam,modID);
+ xml_dim_t px_modpos (mod.child(_X(position)));
+ Position mod_pos(px_modpos.x(),px_modpos.y(),px_modpos.z());
+ xml_dim_t px_modrot (mod.child(_X(rotation)));
+ Rotation mod_rot(px_modrot.x(),px_modrot.y(),px_modrot.z()*M_PI/180);
+ PlacedVolume m_phv = part_vol.placeVolume(mr_vol,mod_pos,mod_rot);
+ m_phv.addPhysVolID("module",modID);
+ module.setPlacement(m_phv);
+
+ module.setReadout(xml_pads);
+ // Readout and placement must be present before adding extension,
+ // since they are aquired internally for optimisation reasons. (MF)
+ module.addExtension<PadLayout>(new FixedPadAngleDiskLayout(module));
+ }//modules
+ }//module groups
+ }//endplate
+
+ PlacedVolume part_phv = tpc_vol.placeVolume(part_vol,part_pos,part_rot);
+ part_phv.addPhysVolID(part_nam,px_det.id());
+ part_det.setPlacement(part_phv);
+ tpc.add(part_det);
+ //now reflect it
+ if(reflect){
+ Position r_pos(px_pos.x(),px_pos.y(),-px_pos.z());
+ //Attention: rotation is given in euler angles
+ Rotation r_rot(M_PI,0,M_PI);
+ // Volume part_vol_r(lcdd,part_nam+"_negativ",part_tub,part_mat);
+ PlacedVolume part_phv2 = tpc_vol.placeVolume(part_vol,r_pos,r_rot);
+ part_phv2.addPhysVolID(part_nam+"_negativ",px_det.id()+1);
+ // needs a copy function for DetElement
+ // DetElement rdet(lcdd,part_nam+"_negativ",px_det.typeStr(),px_det.id()+1);
+ DetElement rdet = part_det.clone(part_nam+"_negativ",px_det.id()+1);
+ rdet.setPlacement(part_phv2);
+ tpc.add(rdet);
+ }
+ }//subdetectors
+ tpc_vol.setVisAttributes(lcdd, x_det.visStr());
+ PlacedVolume phv = lcdd.pickMotherVolume(tpc).placeVolume(tpc_vol);
+ tpc.setPlacement(phv);
+ return tpc;
+}
+
+//first argument is the type from the xml file
+DECLARE_DETELEMENT(LP1,create_element)
diff --git a/DDExamples/ILDExReco/CMakeLists.txt b/DDExamples/ILDExReco/CMakeLists.txt
index c882324d2..8f2155a94 100644
--- a/DDExamples/ILDExReco/CMakeLists.txt
+++ b/DDExamples/ILDExReco/CMakeLists.txt
@@ -7,6 +7,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/DDCore/include
add_executable(ILDExReco ILDExReco.cpp src/GearTPC.cpp)
add_executable(RecoTPCPrototype RecoTPCPrototype.cpp src/GearTPC.cpp)
+add_executable(RecoLP1 RecoLP1.cpp src/GearTPC.cpp)
add_executable(TPCDigitisation TPCDigitisation.cpp src/GearTPC.cpp)
add_executable(TPCHitReco TPCHitReco.cpp src/GearTPC.cpp)
add_executable(CalculateTPCPadBinning CalculateTPCPadBinning.cpp src/GearTPC.cpp)
@@ -14,6 +15,7 @@ add_executable(TPCToySimulation TPCToySimulation.cpp src/GearTPC.cpp)
add_executable(TPCMaterialScan TPCMaterialScan.cpp src/GearTPC.cpp)
target_link_libraries(ILDExReco DD4hepCore ILDEx ${ROOT_LIBRARIES})
target_link_libraries(RecoTPCPrototype DD4hepCore ILDEx ${ROOT_LIBRARIES})
+target_link_libraries(RecoLP1 DD4hepCore ILDEx ${ROOT_LIBRARIES})
target_link_libraries(TPCDigitisation DD4hepCore ILDEx ${ROOT_LIBRARIES})
target_link_libraries(TPCHitReco DD4hepCore ILDEx ${ROOT_LIBRARIES})
target_link_libraries(CalculateTPCPadBinning DD4hepCore ILDEx ${ROOT_LIBRARIES})
diff --git a/DDExamples/ILDExReco/RecoLP1.cpp b/DDExamples/ILDExReco/RecoLP1.cpp
new file mode 100644
index 000000000..41b6386bd
--- /dev/null
+++ b/DDExamples/ILDExReco/RecoLP1.cpp
@@ -0,0 +1,57 @@
+
+//====================================================================
+// Test application for LP1 functionality
+//--------------------------------------------------------------------
+//
+// Author : A.Muennich
+//
+//
+//====================================================================
+
+#include "DD4hep/LCDD.h"
+#include <iostream>
+#include <vector>
+#include <string>
+#include "GearTPC.h"
+#include "TPCModuleData.h"
+
+
+using namespace std;
+using namespace DD4hep;
+using namespace Geometry;
+
+#include "TPCModuleData.h"
+
+
+int main(int argc,char** argv) {
+
+ LCDD& lcdd = LCDD::getInstance();
+ lcdd.fromCompact(argv[1]);
+
+ GearTPC tpc(lcdd.detector("TPC"));
+ cout << "Gear TPC functionality:"<<endl;
+ cout << "-----> Outer Radius:\t " << tpc.getOuterRadius() << endl;
+ cout << "-----> DriftLength:\t " << tpc.getMaxDriftLength() << endl;
+
+ cout << "-----> EndplateThickness 0:\t " << tpc.getEndPlateThickness(0) <<endl;
+ cout << "-----> EndplateZPosition 0:\t "<< tpc.getEndPlateZPosition(0)<<endl;
+
+// int npads=0;
+// for(int p=0;p<mymods.size();p++)
+// npads+=tpc.getModule(p,0).getNPads();
+// cout << "-----> NPads EP0:\t " << npads << endl;
+ cout << "-----> Inside Module (0,0):\t "<<tpc.isInsideModule(0,0,0)<<endl;
+ cout << "-----> Nearest Module (0,0):\t "<<tpc.getNearestModule(0,0,0).getID()<<endl;
+ cout << "TPC Module functionality:"<<endl;
+
+ std::vector<TPCModule> mymods=tpc.getModules(0);
+ cout << "-----> NModules EP0:\t " << mymods.size()<< endl;
+
+ for(int m=0;m<mymods.size();m++)
+ {
+ TPCModule mod=mymods[m];
+ cout<<mod.id()<<" "<<mod.getNPads()<<endl;
+ }
+
+ return 0;
+}
diff --git a/DDExamples/ILDExReco/src/GearTPC.cpp b/DDExamples/ILDExReco/src/GearTPC.cpp
index dcaebbcca..a7f2563a9 100644
--- a/DDExamples/ILDExReco/src/GearTPC.cpp
+++ b/DDExamples/ILDExReco/src/GearTPC.cpp
@@ -44,11 +44,22 @@ namespace DD4hep {
}
double GearTPC::getMaxDriftLength() const {
- DetElement gas = child("TPC_GasVolume");
- if(!gas.isValid())
- throw OutsideGeometryException("TPC gas volume not found!");
- Tube tube = gas.volume().solid();
- return tube->GetDz();
+ //defined as distance between cathode and endplate surface
+ //for now assume symmetric setups, meaining if there are two endplates
+ //they are symmetric around the cathode
+ DetElement cathode = child("TPC_Cathode");
+ if(!cathode.isValid())
+ throw OutsideGeometryException("TPC cathode not found!");
+ //positions in z
+ TGeoMatrix *nm=cathode.placement()->GetMatrix();
+ const Double_t *trans=nm->GetTranslation();
+ double z_ep=getEndPlateZPosition(0);
+ double z_cath=trans[2];
+ //thickness in z
+ double th_ep=getEndPlateThickness(0);
+ Tube tube_cathode=cathode.volume().solid();
+ double th_cath=tube_cathode->GetDz();
+ return fabs(z_ep-z_cath)-(th_ep+th_cath);
}
double GearTPC::getEndPlateThickness(int endplate) const {
diff --git a/DDExamples/ILDExTest/TestILDTPC.cpp b/DDExamples/ILDExTest/TestILDTPC.cpp
index be4f54e09..60188339a 100644
--- a/DDExamples/ILDExTest/TestILDTPC.cpp
+++ b/DDExamples/ILDExTest/TestILDTPC.cpp
@@ -46,9 +46,9 @@ int main(int argc,char** argv) {
myfile << "FAILED tpc.getOuterRadius(): 1800!="<<tpc.getOuterRadius()<< endl;
failures++;
}
- if( fabs( tpc.getMaxDriftLength() -2497 )> myPrecision)
+ if( fabs( tpc.getMaxDriftLength() -2496.5 )> myPrecision)
{
- myfile << "FAILED tpc.getMaxDriftLength(): 2497!=" << tpc.getMaxDriftLength()<<endl;
+ myfile << "FAILED tpc.getMaxDriftLength(): 2496.5!=" << tpc.getMaxDriftLength()<<endl;
failures++;
}
if(fabs(tpc.getEndPlateThickness(0) - 1.5) > myPrecision)
diff --git a/DDExamples/ILDExTest/TestTPCPrototype.cpp b/DDExamples/ILDExTest/TestTPCPrototype.cpp
index 4b834122a..dfb075a36 100644
--- a/DDExamples/ILDExTest/TestTPCPrototype.cpp
+++ b/DDExamples/ILDExTest/TestTPCPrototype.cpp
@@ -48,9 +48,9 @@ int main(int argc,char** argv) {
myfile<<"FAILED tpc.getOuterRadius(): 500!="<<tpc.getOuterRadius()<<endl;
failures++;
}
- if(fabs(tpc.getMaxDriftLength()-497)>myPrecision)
+ if(fabs(tpc.getMaxDriftLength()-996.5)>myPrecision)
{
- myfile<<"FAILED tpc.getMaxDriftLength(): 497!="<<tpc.getMaxDriftLength()<<endl;
+ myfile<<"FAILED tpc.getMaxDriftLength(): 996.5!="<<tpc.getMaxDriftLength()<<endl;
failures++;
}
if(fabs(tpc.getEndPlateThickness(0)-1.5)>myPrecision)
diff --git a/DDExamples/ILDExTest/reference_TestILDTPC.txt b/DDExamples/ILDExTest/reference_TestILDTPC.txt
index b6913e486..dc42305de 100644
--- a/DDExamples/ILDExTest/reference_TestILDTPC.txt
+++ b/DDExamples/ILDExTest/reference_TestILDTPC.txt
@@ -1,7 +1,7 @@
Gear TPC functionality:
-----> Inner Radius: 350
-----> Outer Radius: 1800
------> DriftLength: 2497
+-----> DriftLength: 2496.5
-----> EndplateThickness 0: 1.5
-----> EndplateZPosition 0: 2498.5
-----> EndplateThickness 1: 1.5
diff --git a/DDExamples/ILDExTest/reference_TestTPCPrototype.txt b/DDExamples/ILDExTest/reference_TestTPCPrototype.txt
index 41f5c01f5..7fae1ffd5 100644
--- a/DDExamples/ILDExTest/reference_TestTPCPrototype.txt
+++ b/DDExamples/ILDExTest/reference_TestTPCPrototype.txt
@@ -1,6 +1,6 @@
Gear TPC functionality:
-----> Outer Radius: 500
------> DriftLength: 497
+-----> DriftLength: 996.5
-----> EndplateThickness 0: 1.5
-----> EndplateZPosition 0: 998.5
-----> Exception test: OutsideGeometryException: TPC endplate not found!
--
GitLab