source: fact/tools/rootmacros/PulseTemplates/Sample.C@ 14706

Last change on this file since 14706 was 14706, checked in by Jens Buss, 12 years ago
class with methods for producing random number lists for event sampling
  • Property svn:executable set to *
File size: 4.4 KB
Line 
1#include "Sample.h"
2
3Sample::Sample()
4{
5 InitMembers();
6 mpRndNumList = new vector<int>;
7}
8
9Sample::Sample(int size)
10{
11 InitMembers();
12 mpRndNumList = new vector<int>;
13 mpRndNumList->resize(size);
14}
15
16Sample::Sample(vector<int> *RndNumList)
17{
18 InitMembers();
19 mpRndNumList = RndNumList;
20}
21
22Sample::Sample(vector<int> *RndNumList, int size)
23{
24 InitMembers();
25 mpRndNumList = RndNumList;
26 mpRndNumList->resize(size);
27}
28
29Sample::~Sample(void)
30{
31 if (mpRndNumList != NULL)
32 {
33 delete mpRndNumList;
34 }
35}
36
37void Sample::InitMembers()
38{
39 mpRndNumList = NULL;
40 mMinNumber = 0;
41 mMaxNumber = 0;
42 mSampleSize = 0;
43 mSeed = 4357;
44}
45
46//============================================================================
47//ACCESS
48//============================================================================
49void Sample::SetMinNumber(int min){ mMinNumber = min; return;}
50void Sample::SetMaxNumber(int max){ mMaxNumber = max; return;}
51void Sample::SetSampleSize(int size){mSampleSize = size; return;}
52void Sample::SetSeed(int seed)
53{
54 mSeed = seed;
55 mRandom.SetSeed(mSeed);
56 return;
57}
58int Sample::GetMinNumber(){return mMinNumber;}
59int Sample::GetMaxNumber(){return mMaxNumber;}
60int Sample::GetSampleSize(){return mSampleSize;}
61int Sample::GetSeed(){return mSeed;}
62
63void Sample::GetRndListValues(vector<int> *RndNumList)
64{
65 vector<int>::iterator it;
66
67 for ( it=mpRndNumList->begin() ; it < mpRndNumList->end(); it++ )
68 {
69 RndNumList->push_back(*it);
70 }
71
72 return;
73}
74
75vector<int>* Sample::GetRndListPtr()
76{
77 return mpRndNumList;
78}
79
80//============================================================================
81//OPERATIONS
82//============================================================================
83int
84Sample::GenerateRandomInt(
85 int min,
86 int max)
87{
88 int rndNum = min + mRandom.Integer(max - min);
89 cout << rndNum << endl;
90 return rndNum;
91}
92
93int
94Sample::GenerateRandomInt()
95{
96 return GenerateRandomInt( mMinNumber, mMaxNumber );
97// return 0;
98}
99
100void
101Sample::GenerateSample()
102{
103 GenerateSample( mpRndNumList, mMinNumber, mMaxNumber, mSampleSize);
104 return;
105}
106
107void
108Sample::GenerateSample(
109 vector<int>* sampleVector,
110 int min,
111 int max,
112 int size)
113{
114 if ( size > max - min)
115 {
116 cout << "sample size is larger than range of sample, will set size to range" << endl;
117 size = max - min + 1;
118 }
119 //resize destination vector for pulled numbers
120 sampleVector->resize(size);
121
122 //calculate qunatity of numbers in range
123 int qunatityOfNumbers = max - min + 1;
124
125 //crate a vector list of ordered numbers in defined range
126 vector<int> listOfNumbers;
127 listOfNumbers.resize(qunatityOfNumbers);
128
129 //fill a list of ordered numbers in defined range
130 for (int i = min; i <= max; i++)
131 {
132 listOfNumbers.at(i)=i;
133 }
134
135 //container to fill in numbers with ordering
136 set<int> sampleSet;
137
138 //container for insert result
139 bool result;
140 for (int i = 0; i < size; i++)
141 {
142 int randomNumber = GenerateRandomInt( 0, qunatityOfNumbers-i);
143 result = sampleSet.insert(listOfNumbers.at(randomNumber)).second;
144 if (result)
145 {
146// cout << "rndNR " << randomNumber << endl;
147 listOfNumbers.erase(listOfNumbers.begin()+randomNumber);
148 }
149 else if (!result)
150 {
151 cout << " pulled number exists, pulling again" << endl;
152 i--;
153 }
154 }
155
156 set<int>::iterator it;
157
158 int counter = 0;
159 for ( it=sampleSet.begin() ; it != sampleSet.end(); it++ )
160 {
161 sampleVector->at(counter)=*it;
162 counter++;
163 }
164
165 return;
166}
167
168void
169Sample::BootstrapSample()
170{
171 BootstrapSample( mpRndNumList, mMinNumber, mMaxNumber, mSampleSize );
172
173 return;
174}
175
176void
177Sample::BootstrapSample(
178 vector<int> *sampleVector,
179 int numMinEvent,
180 int numMaxEvent,
181 int size)
182{
183 sampleVector->resize(size);
184
185 multiset<int> sampleSet;
186
187 for (int i = 0; i < size; i++)
188 {
189 int randomNumber = GenerateRandomInt( numMinEvent, numMaxEvent);
190 sampleSet.insert(randomNumber);
191 }
192
193 multiset<int>::iterator it;
194
195// set<int>::iterator it;
196
197 int counter = 0;
198 for ( it=sampleSet.begin() ; it != sampleSet.end(); it++ )
199 {
200 sampleVector->at(counter)=*it;
201 counter++;
202 }
203
204 return;
205}
Note: See TracBrowser for help on using the repository browser.