source: trunk/examples/novice/gemc/src/identifier.cc

Last change on this file was 807, checked in by garnier, 16 years ago

update

File size: 2.4 KB
Line 
1// %%%%%%%%%%
2// G4 headers
3// %%%%%%%%%%
4#include "G4UnitsTable.hh"
5
6// %%%%%%%%%%%%
7// gemc headers
8// %%%%%%%%%%%%
9#include "detector.h"
10#include "identifier.h"
11
12// %%%%%%%%%%%
13// C++ headers
14// %%%%%%%%%%%
15#include <iostream>
16using namespace std;
17
18
19bool identifier::operator == (const identifier& I) const
20{
21 if(I.name == this->name && I.rule == this->rule && I.id == this->id && fabs(I.time - this->time) <= this->TimeWindow)
22    return true;
23 else
24  return false;
25}
26
27
28bool identifier::operator < (const identifier& I) const
29{
30 if(this->name == I.name)
31    if(this->id < I.id)     return true;
32    if(this->time < I.time) return true;
33
34 return false;
35}
36
37bool identifier::operator > (const identifier& I) const
38{
39 if(this->name == I.name)
40    if(this->id > I.id)     return true;
41    if(this->time > I.time) return true;
42
43 return false;
44}
45
46
47ostream &operator<<(ostream &stream, vector<identifier> Iden)
48{
49 for(int i=0; i<Iden.size(); i++)
50 {
51    cout << "      id " << i+1 ;
52    cout << "           " ;
53    cout.width(10);
54    cout << Iden[i].name << " " << Iden[i].id << endl;
55 }
56 cout << "      identifier time:  " <<  Iden[0].time/ns << " ns - TimeWindow: " << Iden[0].TimeWindow/ns << " ns." << endl;
57
58 return stream;
59}
60
61
62#include <cmath>
63vector<int> set_IDshifts(vector<int> maxs)
64{
65 vector<int> y;
66 int  max;
67 for(int i=0; i<maxs.size(); i++)
68 {
69   max = 0;
70   while( ( 1 << max )  <  maxs[i] ) max++;
71   y.push_back( max );
72 }
73 return y;
74}
75
76// Sets the ncopy ID accordingly to Geant4 Volumes copy number
77vector<identifier> SetId(vector<identifier> Iden, G4VTouchable* TH, double time, double TimeWindow)
78{
79  vector<identifier> identity = Iden;
80
81 // Look for "ncopy" flag, set to volume copy number
82 for(int i=0; i<identity.size(); i++)
83 {
84    if(identity[i].rule.find("ncopy") != string::npos)
85    {
86       // h=1 don't need to check volume itself
87       for(int h=0; h<TH-> GetHistoryDepth(); h++)
88       {
89          string pname = TH->GetVolume(h)->GetName();
90          int    pcopy = TH->GetVolume(h)->GetCopyNo();
91          if(pname.find(identity[i].name) != string::npos) identity[i].id = pcopy;
92       }
93    }
94 
95    // Make sure id is not still zero
96    if(identity[i].id == 0) 
97    {
98      cout << " Something is wrong. Identity not completely set." << endl;
99      cout << identity;
100      cout << " Exiting. " << endl;
101      exit(0);
102    }
103    identity[i].time       = time;
104    identity[i].TimeWindow = TimeWindow;
105 }
106
107 return identity;
108}
109
110
111
112
113
Note: See TracBrowser for help on using the repository browser.