CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDG4ProductionCuts.cc
Go to the documentation of this file.
4 
5 #include "G4ProductionCuts.hh"
6 #include "G4RegionStore.hh"
7 
8 #include <algorithm>
9 
10 DDG4ProductionCuts::DDG4ProductionCuts(const G4LogicalVolumeToDDLogicalPartMap& map, int verb) : map_(map), m_Verbosity(verb) {
11  m_KeywordRegion = "CMSCutsRegion";
12  initialize();
13 }
14 
16 }
17 
23 bool dd_is_greater(const std::pair<G4LogicalVolume*, DDLogicalPart> & p1,
24  const std::pair<G4LogicalVolume*, DDLogicalPart> & p2) {
25  bool result = false;
26  if (p1.second.name().ns() > p2.second.name().ns()) {
27  result = true;
28  }
29  if (p1.second.name().ns() == p2.second.name().ns()) {
30  if (p1.second.name().name() > p2.second.name().name()) {
31  result = true;
32  }
33  if (p1.second.name().name() == p2.second.name().name()) {
34  if (p1.first->GetName() > p2.first->GetName()) {
35  result = true;
36  }
37  }
38  }
39  return result;
40 }
41 
43  //
44  // Loop over all DDLP and provide the cuts for each region
45  //
46  for (G4LogicalVolumeToDDLogicalPartMap::Vector::iterator tit = vec_.begin();
47  tit != vec_.end(); tit++){
48  setProdCuts((*tit).second,(*tit).first);
49  }
50 }
51 
52 
54 
56  // sort all root volumes - to get the same sequence at every run of the application.
57  // (otherwise, the sequence will depend on the pointer (memory address) of the
58  // involved objects, because 'new' does no guarantee that you allways get a
59  // higher (or lower) address when allocating an object of the same type ...
60  sort(vec_.begin(),vec_.end(),&dd_is_greater);
61  if ( m_Verbosity > 0 ) {
62  LogDebug("Physics") <<" DDG4ProductionCuts (New) : starting\n"
63  <<" DDG4ProductionCuts : Got "<<vec_.size()
64  <<" region roots.\n"
65  <<" DDG4ProductionCuts : List of all roots:";
66  for ( size_t jj=0; jj<vec_.size(); ++jj)
67  LogDebug("Physics") << " DDG4ProductionCuts : root="
68  << vec_[jj].second.name();
69  }
70 
71  // Now generate all the regions
72  for (G4LogicalVolumeToDDLogicalPartMap::Vector::iterator tit = vec_.begin();
73  tit != vec_.end(); tit++) {
74 
75  std::string regionName;
76  unsigned int num= map_.toString(m_KeywordRegion,(*tit).second,regionName);
77 
78  if (num != 1)
79  throw SimG4Exception("DDG4ProductionCuts: Problem with Region tags.");
80 
81  G4Region * region = getRegion(regionName);
82  region->AddRootLogicalVolume((*tit).first);
83 
84  if ( m_Verbosity > 0 )
85  LogDebug("Physics") << " MakeRegions: added " <<((*tit).first)->GetName()
86  << " to region " << region->GetName();
87  }
88 }
89 
90 
92  G4LogicalVolume* lvol ) {
93 
94  if ( m_Verbosity > 0 )
95  LogDebug("Physics") <<" DDG4ProductionCuts: inside setProdCuts";
96 
97  G4Region * region = 0;
98 
99  std::string regionName;
100  unsigned int num= map_.toString(m_KeywordRegion,lpart,regionName);
101 
102  if (num != 1)
103  throw SimG4Exception("DDG4ProductionCuts: Problem with Region tags.");
104 
105  if ( m_Verbosity > 0 ) LogDebug("Physics") << "Using region " << regionName;
106 
107  region = getRegion(regionName);
108 
109  //
110  // search for production cuts
111  // you must have three of them: e+ e- gamma
112  //
113  double gammacut;
114  double electroncut;
115  double positroncut;
116  int temp = map_.toDouble("ProdCutsForGamma",lpart,gammacut);
117  if (temp != 1){
118  throw SimG4Exception("DDG4ProductionCuts: Problem with Region tags: no/more than one ProdCutsForGamma.");
119  }
120  temp = map_.toDouble("ProdCutsForElectrons",lpart,electroncut);
121  if (temp != 1){
122  throw SimG4Exception("DDG4ProductionCuts: Problem with Region tags: no/more than one ProdCutsForElectrons.");
123  }
124  temp = map_.toDouble("ProdCutsForPositrons",lpart,positroncut);
125  if (temp != 1) {
126  throw SimG4Exception("DDG4ProductionCuts: Problem with Region tags: no/more than one ProdCutsForPositrons.");
127  }
128  //
129  // For the moment I assume all of the three are set
130  //
131  G4ProductionCuts * prodCuts = getProductionCuts(region);
132  prodCuts->SetProductionCut( gammacut, idxG4GammaCut );
133  prodCuts->SetProductionCut( electroncut, idxG4ElectronCut );
134  prodCuts->SetProductionCut( positroncut, idxG4PositronCut );
135  // For recoil use the same cut as for e-
136  prodCuts->SetProductionCut( electroncut, idxG4ProtonCut );
137  if ( m_Verbosity > 0 ) {
138  LogDebug("Physics") << "DDG4ProductionCuts : Setting cuts for "
139  << regionName << "\n Electrons: " << electroncut
140  << "\n Positrons: " << positroncut
141  << "\n Gamma : " << gammacut;
142  }
143 }
144 
145 G4Region * DDG4ProductionCuts::getRegion(const std::string & regName) {
146  G4Region * reg = G4RegionStore::GetInstance()->FindOrCreateRegion (regName);
147  return reg;
148 }
149 
150  G4ProductionCuts * DDG4ProductionCuts::getProductionCuts( G4Region* reg ) {
151 
152  G4ProductionCuts * prodCuts = reg->GetProductionCuts();
153  if( !prodCuts ) {
154  prodCuts = new G4ProductionCuts();
155  reg->SetProductionCuts(prodCuts);
156  }
157  return prodCuts;
158 }
159 
#define LogDebug(id)
G4LogicalVolumeToDDLogicalPartMap map_
bool dd_is_greater(const std::pair< G4LogicalVolume *, DDLogicalPart > &p1, const std::pair< G4LogicalVolume *, DDLogicalPart > &p2)
void setProdCuts(const DDLogicalPart lpart, G4LogicalVolume *lvolume)
unsigned int toDouble(const std::string &name, const KeyType &key, double &value, unsigned int pos=0) const
returns the number specific parameters named &#39;name&#39; and the corrsponding double
Definition: DDMapper.h:119
std::string m_KeywordRegion
G4ProductionCuts * getProductionCuts(G4Region *region)
tuple result
Definition: query.py:137
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:88
double p2[4]
Definition: TauolaWrapper.h:90
unsigned int toString(const std::string &name, const KeyType &key, std::string &value, unsigned int pos=0) const
same as toDouble but for std::string-valued values of named parameters
Definition: DDMapper.h:182
G4LogicalVolumeToDDLogicalPartMap::Vector vec_
DDG4ProductionCuts(const G4LogicalVolumeToDDLogicalPartMap &, int)
G4Region * getRegion(const std::string &region)
double p1[4]
Definition: TauolaWrapper.h:89
Vector all(const std::string &name, const std::string &value) const
get all std::mapped instances which have a specific &#39;name&#39; with value &#39;value&#39;
Definition: DDMapper.h:208