36 ClassImp(RooBlindTools);
41 RooBlindTools::RooBlindTools(
const char *stSeedIn, blindMode Mode,
42 Double_t centralValue, Double_t sigmaOffset, Bool_t s2bMode) :
44 _PrecisionOffsetScale(sigmaOffset),
45 _PrecisionCentralValue(centralValue),
55 RooBlindTools::RooBlindTools(
const RooBlindTools& blindTool):
56 _PrecisionOffsetScale(blindTool.getPrecisionOffsetScale()),
57 _PrecisionCentralValue(blindTool.getPrecisionCentralValue()),
58 _mode(blindTool.mode()),
59 _s2bMode(blindTool._s2bMode)
61 setup(blindTool.stSeed());
66 void RooBlindTools::setup(
const char *stSeedIn)
72 _DeltaZOffset = _DeltaZScale*MakeOffset(
"abcdefghijklmnopqrstuvwxyz");
74 _DeltaZSignFlip = MakeSignFlip(
"ijklmnopqrstuvwxyzabcdefgh");
76 _AsymOffset = MakeGaussianOffset(
"opqrstuvwxyzabcdefghijklmn");
78 _AsymSignFlip = MakeSignFlip(
"zyxwvutsrqponmlkjihgfedcba");
82 _DeltaMOffset = _DeltaMScale*MakeOffset(
"opqrstuvwxyzabcdefghijklmn");
84 _MysteryPhase = 3.14159 *
85 MakeOffset(
"wxyzabcdefghijklmnopqrstuv");
88 _PrecisionSignFlip = MakeSignFlip(
"zyxwvutsrqponmlkjihgfedcba");
90 _PrecisionSignFlip = MakeSignFlip(
"klmnopqrstuvwxyzabcdefghij");
93 _PrecisionOffset = _PrecisionOffsetScale*MakeGaussianOffset(
"opqrstuvwxyzabcdefghijklmn");
95 _PrecisionUniform = _PrecisionOffsetScale*MakeOffset(
"jihgfedcbazyxwvutsrqponmlk");
97 _STagConstant = Randomizer(
"fghijklmnopqrstuvwxyzabcde");
103 RooBlindTools::~RooBlindTools(){}
107 Double_t RooBlindTools::HideDeltaZ(Double_t DeltaZ, Double_t STag)
const{
108 Int_t sTag = SignOfTag(STag);
109 Double_t DeltaZPrime = _DeltaZSignFlip*DeltaZ*sTag + _DeltaZOffset;
116 Double_t RooBlindTools::HiDelZPdG(Double_t DeltaZ, Double_t STag, Double_t PdG)
const{
117 Int_t sTag = SignOfTag(STag);
118 Double_t DeltaZPrime = _DeltaZSignFlip*(DeltaZ - PdG)*sTag + _DeltaZOffset;
125 Double_t RooBlindTools::UnHideDeltaZ(Double_t DeltaZPrime, Double_t STag)
const{
126 Int_t sTag = SignOfTag(STag);
127 Double_t DeltaZ = (DeltaZPrime - _DeltaZOffset)/(sTag*_DeltaZSignFlip);
134 Double_t RooBlindTools::UnHiDelZPdG(Double_t DeltaZPrime, Double_t STag, Double_t PdG)
const{
135 Int_t sTag = SignOfTag(STag);
136 Double_t DeltaZ = PdG + (DeltaZPrime - _DeltaZOffset)/(sTag*_DeltaZSignFlip);
143 Double_t RooBlindTools::UnHideAsym(Double_t AsymPrime)
const{
144 if(mode()==dataonly)
return AsymPrime;
146 Double_t Asym = (AsymPrime - _AsymOffset)/_AsymSignFlip;
153 Double_t RooBlindTools::HideAsym(Double_t Asym)
const{
154 if(mode()==dataonly)
return Asym;
156 Double_t AsymPrime = Asym*_AsymSignFlip + _AsymOffset;
163 Double_t RooBlindTools::UnHideDeltaM(Double_t DeltaMPrime)
const{
164 if(mode()==dataonly)
return DeltaMPrime;
166 Double_t DeltaM = DeltaMPrime - _DeltaMOffset;
173 Double_t RooBlindTools::HideDeltaM(Double_t DeltaM)
const{
174 if(mode()==dataonly)
return DeltaM;
176 Double_t DeltaMPrime = DeltaM + _DeltaMOffset;
183 Double_t RooBlindTools::UnHiAsPdG(Double_t AsymPrime, Double_t PdG)
const{
184 if(mode()==dataonly)
return AsymPrime;
186 Double_t Asym = PdG + (AsymPrime - _AsymOffset)/_AsymSignFlip;
193 Double_t RooBlindTools::MysteryPhase()
const{
194 if(mode()==dataonly)
return 0.0;
196 return _MysteryPhase;
201 Double_t RooBlindTools::HiAsPdG(Double_t Asym, Double_t PdG)
const{
202 if(mode()==dataonly)
return Asym;
204 Double_t AsymPrime = (Asym - PdG)*_AsymSignFlip + _AsymOffset;
211 Double_t RooBlindTools::UnHidePrecision(Double_t PrecisionPrime)
const{
212 if(mode()==dataonly)
return PrecisionPrime;
214 Double_t Precision(0.);
216 if (_PrecisionSignFlip>0) {
217 Precision = PrecisionPrime - _PrecisionOffset;
220 Precision = 2.0*_PrecisionCentralValue - PrecisionPrime + _PrecisionOffset;
229 Double_t RooBlindTools::HidePrecision(Double_t Precision)
const{
230 if(mode()==dataonly)
return Precision;
232 Double_t PrecisionPrime(0.);
234 if (_PrecisionSignFlip>0) {
235 PrecisionPrime = Precision + _PrecisionOffset;
238 PrecisionPrime = 2.0*_PrecisionCentralValue - Precision + _PrecisionOffset;
241 return PrecisionPrime;
246 Double_t RooBlindTools::UnHideOffset(Double_t PrecisionPrime)
const{
247 if(mode()==dataonly)
return PrecisionPrime;
249 return PrecisionPrime - _PrecisionOffset;
254 Double_t RooBlindTools::HideOffset(Double_t Precision)
const{
255 if(mode()==dataonly)
return Precision;
257 return Precision + _PrecisionOffset;
262 Double_t RooBlindTools::UnHideUniform(Double_t PrecisionPrime)
const{
263 if(mode()==dataonly)
return PrecisionPrime;
265 return PrecisionPrime - _PrecisionUniform;
270 Double_t RooBlindTools::HideUniform(Double_t Precision)
const{
271 if(mode()==dataonly)
return Precision;
273 return Precision + _PrecisionUniform;
278 Double_t RooBlindTools::RandomizeTag(Double_t STag, Int_t EventNumber)
const{
279 Int_t Seed = EventNumber % 7997 + 2;
280 Double_t r = PseudoRandom(Seed);
281 Double_t STagPrime(0.0);
283 if (r < _STagConstant){
286 STagPrime = -1.0 * STag ;
295 Double_t RooBlindTools::Randomizer(
const char *StringAlphabet)
const{
296 char lowerseed[1024] ;
297 strlcpy(lowerseed,_stSeed,1024) ;
299 Int_t lengthSeed = strlen(lowerseed);
301 for (Int_t j=0; j<lengthSeed; j++){
302 lowerseed[j] =tolower(_stSeed[j]);
305 for (Int_t i=0; i<lengthSeed; i++){
306 for (Int_t iAlphabet=0; iAlphabet<26; iAlphabet++){
307 if ( lowerseed[i] == StringAlphabet[iAlphabet] ){
309 sumSeed = (iAlphabet<<(5*(i%3)))^sumSeed;
311 sumSeed = sumSeed + iAlphabet ;
317 if (lengthSeed<5 || ((sumSeed<1 || sumSeed>8000)&&!_s2bMode)) {
318 cout<<
"RooBlindTools::Randomizer: Your String Seed is Bad: '" << _stSeed <<
"'" << endl ;
319 RooErrorHandler::softAbort() ;
325 UInt_t jRan = (sumSeed*ia + ic) % im;
327 jRan = (jRan*ia + ic) % im;
328 jRan = (jRan*ia + ic) % im;
329 jRan = (jRan*ia + ic) % im;
331 Double_t theRan = (float) jRan / (
float) im;
339 Double_t RooBlindTools::PseudoRandom(Int_t Seed)
const{
340 if (Seed<1 || Seed>8000 ) {
341 cout<<
"RooBlindTools::PseudoRandom: Your integer Seed is Bad" <<endl;
347 UInt_t jRan = (Seed*ia + ic) % im;
349 jRan = (jRan*ia + ic) % im;
350 jRan = (jRan*ia + ic) % im;
351 jRan = (jRan*ia + ic) % im;
353 Double_t theRan = (float) jRan / (
float) im;
361 Double_t RooBlindTools::MakeOffset(
const char *StringAlphabet)
const{
362 Double_t theRan = Randomizer(StringAlphabet);
364 Double_t theOffset = (2.0)*theRan - (1.0);
371 Double_t RooBlindTools::MakeGaussianOffset(
const char *StringAlphabet)
const{
372 Double_t theRan1 = Randomizer(StringAlphabet);
373 Double_t theRan2 = Randomizer(
"cdefghijklmnopqrstuvwxyzab");
375 if (theRan1==0.0 || theRan1==1.0){
378 if (theRan2==0.0 || theRan2==1.0){
382 Double_t theOffset = sin(2.0*3.14159*theRan1)*sqrt(-2.0*log(theRan2));
389 Double_t RooBlindTools::MakeSignFlip(
const char *StringAlphabet)
const{
390 Double_t theRan = Randomizer(StringAlphabet);
392 Double_t theSignFlip = 1.0;
404 Int_t RooBlindTools::SignOfTag(Double_t STag)
const{
409 else if (STag > 0.0) {