source: GLBFrejus/HEAD/src/discoCP.cxx @ 150

Last change on this file since 150 was 149, checked in by campagne, 18 years ago

new version

File size: 10.2 KB
Line 
1//std
2#include <stdio.h>
3#include <stdlib.h>
4#include <math.h>
5#include <string.h>
6#include <cmath>
7#include <fstream>
8#include <iostream>
9
10//Globes
11#include <globes/globes.h>
12
13// AIDA :
14#include <AIDA/IAnalysisFactory.h>
15#include <AIDA/ITreeFactory.h>
16#include <AIDA/IHistogramFactory.h>
17#include <AIDA/ITree.h>
18#include <AIDA/ITupleFactory.h>
19#include <AIDA/ITuple.h>
20
21/*
22  CP discovery potential (Test delta = 0, and delta = pi)
23  Xi2 as the function of the true delta and the true theta_13 to test if the
24  experiment may be fit by CP conserving oscillations
25  the true values are used to build the referenced experiments
26  use chi2Delta to marginalized over all parameters except delta
27 
28 
29  29/6/05 JEC clean the code
30  7/7/05  JEC introduce the Mass hierachy and Octant degeneracy from Th.Schwetz
31  8/7/05  JEC introduce data card management
32  17/5/06 JEC add  TEST_OCTANT to avoid pb if theta23=pi/4.
33 */
34
35
36#define DELTA_0   0.0
37#define DELTA_PI  M_PI
38#define TEST_OCTANT false
39
40
41int WRONG_TH23, WRONG_HIER; //condition on octant/hierarchy
42float TH12, TH23,DMQ21,DMQ31; //theta12,theta23,Dm^2_21,Dm^2_31
43
44int ND; //number of bins to scan delta parameter [0,2pi]
45int NTH; //number of bins to scan theta13 parameter
46float LOG10MIN; //minimal Log10(sin^2(2theta13))
47float LOG10MAX; //minimal Log10(sin^2(2theta13))
48
49//---------------------------------------------------------------------
50bool test_th23(glb_params fit_values) {
51  if(TEST_OCTANT) {
52    double fit_th23 = glbGetOscParams(fit_values, GLB_THETA_23);
53   
54    // testing if fit_th23 is at the same side as the true value
55   
56    return  ( 
57             (WRONG_TH23 == 0 && 
58              (TH23 > M_PI/4. && fit_th23 > M_PI/4.) ||
59              (TH23 < M_PI/4. && fit_th23 < M_PI/4.))
60             ||
61             (WRONG_TH23 == 1 && 
62              (TH23 > M_PI/4. && fit_th23 < M_PI/4.) ||
63              (TH23 < M_PI/4. && fit_th23 > M_PI/4.))
64             );
65  }
66  return true;
67}//same_th23
68
69//---------------------------------------------------------------------
70bool test_hier(glb_params fit_values) {
71  double fit_dmq = glbGetOscParams(fit_values, GLB_DM_ATM);
72 
73  // testing if fit_dmq has the same sign as the true value
74  return ( 
75          (WRONG_HIER == 0 && fit_dmq * DMQ31 > 0) || 
76          (WRONG_HIER == 1 && fit_dmq * DMQ31 < 0) 
77          );
78}//same_hier
79
80//---------------------------------------------------------------------
81
82bool test(glb_params fit_values) {   
83  // testing Octant and Hierarchy
84  return test_th23(fit_values) && test_hier(fit_values);
85}//test
86
87//---------------------------------------------------------------------
88
89/**************************************/
90/*           main                     */
91/**************************************/
92
93int main(int argc, char *argv[]) {
94
95  //Process data card file
96  std::string ROOTDIR = getenv("GLBFREJUSROOT");
97  std::string DATACARD;
98  DATACARD = ROOTDIR + "/run/discoCP.data"; 
99  std::ifstream fileDataCard;
100  std::cout << "Open DataCard file : " << DATACARD <<std::endl;
101  fileDataCard.open(DATACARD.data());
102  std::string DUMMYSTR; //comment string of the variables
103
104  std::string ROOTFILENAME;
105
106
107  fileDataCard >> DUMMYSTR >> WRONG_TH23; 
108  std::cout << DUMMYSTR << " " << WRONG_TH23 << std::endl; 
109  fileDataCard >> DUMMYSTR >> WRONG_HIER;
110  std::cout << DUMMYSTR << " " << WRONG_HIER << std::endl; 
111  fileDataCard >> DUMMYSTR >> TH12; 
112  std::cout << DUMMYSTR << " " << TH12 << std::endl; 
113  fileDataCard >> DUMMYSTR >> TH23; 
114  std::cout << DUMMYSTR << " " << TH23 << std::endl; 
115  fileDataCard >> DUMMYSTR >> DMQ21; 
116  std::cout << DUMMYSTR << " " << DMQ21 << std::endl; 
117  fileDataCard >> DUMMYSTR >> DMQ31; 
118  std::cout << DUMMYSTR << " " << DMQ31 << std::endl; 
119  fileDataCard >> DUMMYSTR >> ROOTFILENAME; 
120
121  //add to ROOT file name the conditions on the Octant/Hierarchy
122  ROOTFILENAME += "-h";
123  char hier[40];
124  sprintf(hier,"%d",WRONG_HIER);
125  ROOTFILENAME += hier;
126  char octo[40];
127  sprintf(octo,"%d",WRONG_TH23);
128  ROOTFILENAME += "-o";
129  ROOTFILENAME += octo;
130  ROOTFILENAME += ".root";
131  std::cout << DUMMYSTR <<ROOTFILENAME  << std::endl; 
132
133  fileDataCard >> DUMMYSTR >> ND; 
134  std::cout << DUMMYSTR << " "  << ND  << std::endl; 
135  fileDataCard >> DUMMYSTR >> NTH; 
136  std::cout << DUMMYSTR << " " << NTH  << std::endl; 
137  fileDataCard >> DUMMYSTR >> LOG10MIN; 
138  std::cout << DUMMYSTR << " " << LOG10MIN << std::endl; 
139  fileDataCard >> DUMMYSTR >> LOG10MAX; 
140  std::cout << DUMMYSTR << " "  << LOG10MAX << std::endl; 
141
142
143
144 
145  //init AIDA for Histo/Tuple
146  AIDA::IAnalysisFactory* aida = AIDA_createAnalysisFactory();
147  if(!aida) {
148    std::cerr  << " AIDA not found." << std::endl;
149    return 0;
150  }
151
152  //ROOT tree :
153  AIDA::ITreeFactory* treeFactory = aida->createTreeFactory();
154  std::string opts = "export=root";
155  AIDA::ITree* fTree = 
156    treeFactory->create(ROOTFILENAME,"root",false,true,opts);
157  delete treeFactory;
158
159 //Booking Tuple
160  AIDA::ITupleFactory* tf = aida->createTupleFactory(*fTree);
161
162  int NumberOfColumn = 7;
163  std::vector<std::string> column(NumberOfColumn);
164  const char* c_column[] = {"theta12", "theta13", "theta23", 
165                            "deltaCP", "dm21", "dm31", 
166                            "chi2"};
167  std::vector<std::string> coltype(NumberOfColumn);
168  const char* c_coltype[] = {"double","double","double",
169                             "double","double","double",
170                             "double"};
171  for (int icol = 0; icol<NumberOfColumn; ++icol) {
172    column[icol]  = c_column[icol];
173    coltype[icol] = c_coltype[icol];
174  }
175
176  AIDA::ITuple* myTuple = 
177    tf->create("SplGlb","CP violation discovery",column,coltype);
178 
179 
180  //Init Globes
181  glbInit(argv[0]);
182  glbInitExperiment("../data/SPL.glb",
183                    &glb_experiment_list[0],
184                    &glb_num_of_exps);
185
186  // input Prior errors:
187  // 5% on Solar parameters, the atmospheric parameters are
188  // better determined by disappearence channels here 30% to drive the
189  // minimizer
190  glb_params input_errors = glbAllocParams();
191  //JEC 17-05-06 use 10% except for Dm2_21 4%
192//   glbDefineParams(input_errors,
193//                TH12*0.05, 0., TH23*0.30, 0.,
194//                DMQ21*0.05, fabs(DMQ31)*0.30);
195  glbDefineParams(input_errors, 
196                  TH12*0.10, 0., TH23*0.10, 0., 
197                  DMQ21*0.04, fabs(DMQ31)*0.10);
198  glbSetDensityParams(input_errors, 0.05, GLB_ALL);
199  glbSetInputErrors(input_errors);
200
201 
202 
203
204  std::cout << "Start to loop...." << std::endl;
205
206
207  double res,res0,resPi;
208  double fit_theta12, fit_theta13,fit_theta23,fit_deltaCP,fit_dmSol,fit_dmAtm;
209  double delta, log10s2, sq2th, th;
210
211
212  glb_params true_values = glbAllocParams();
213  glb_params start_values = glbAllocParams();
214  glb_params test_values = glbAllocParams();
215  glb_params fit_values = glbAllocParams();
216   
217  for(int k = 0; k < NTH; k++) {     
218         
219    log10s2 = LOG10MIN + (LOG10MAX-LOG10MIN) * double(k) / (NTH-1);
220    sq2th = pow(10.,log10s2);
221    th = 0.5 * asin(sqrt(sq2th));
222   
223    for(int j = 0; j < ND; j++) {
224      //scan de 0 a +2Pi pour delta_CP
225      delta =  2.0 * M_PI * double(j) / (ND-1);
226
227      std::cout << "Consider (k,j) = (" << k << "," << j << ")" << std::endl;
228     
229      // true values (reference for future Chi2 computations)
230      glbDefineParams(true_values, TH12, th, TH23, delta, DMQ21, DMQ31);
231     
232      glbSetOscillationParameters(true_values); 
233      glbSetRates();
234     
235      // set Starting Values
236      glbDefineParams(start_values, TH12, th, TH23, delta, DMQ21, DMQ31);
237      if(WRONG_HIER == 1)
238        glbSetOscParams(start_values, -DMQ31+DMQ21, GLB_DM_ATM);
239      if(WRONG_TH23 == 1)
240        glbSetOscParams(start_values, 0.5*M_PI - TH23, GLB_THETA_23);
241
242      glbSetStartingValues(start_values);
243     
244      // init test values with current TRUE Theta13 but Fixed DELTA=0
245      glbDefineParams(test_values, TH12, th, TH23, DELTA_0, DMQ21, DMQ31);
246      if(WRONG_HIER == 1)
247        glbSetOscParams(test_values, -DMQ31+DMQ21, GLB_DM_ATM);
248     
249      if(WRONG_TH23 == 1)
250        glbSetOscParams(test_values, 0.5*M_PI - TH23, GLB_THETA_23);
251     
252
253      //check whether the data can be fitted with the CP conserving values
254      res0 = glbChiDelta(test_values,fit_values,GLB_ALL);
255      //Add a big factor in case if fit_values does not respect the Octant &
256      //Mass Hierarchy of the true values
257      if (!test(fit_values)) res0 += 1e6; 
258
259      // init test values with current TRUE Theta13 but Fixed DELTA=PI
260      glbDefineParams(test_values, TH12, th, TH23, DELTA_PI, DMQ21, DMQ31);
261      if(WRONG_HIER == 1)
262        glbSetOscParams(test_values, -DMQ31+DMQ21, GLB_DM_ATM);
263     
264      if(WRONG_TH23 == 1)
265        glbSetOscParams(test_values, 0.5*M_PI - TH23, GLB_THETA_23);
266
267      //check whether the data can be fitted with the CP conserving values
268      resPi = glbChiDelta(test_values,fit_values,GLB_ALL);
269      //Add a big factor in case if fit_values does not respect the Octant &
270      //Mass Hierarchy of the true values
271      if (!test(fit_values)) resPi += 1e6; 
272
273      //store the true_values theta13,delta_CP, the other variables are there
274      //just for compatibility for the Tuple definition
275      fit_theta12 = glbGetOscParams(true_values, GLB_THETA_12);
276      fit_theta13 = glbGetOscParams(true_values, GLB_THETA_13);
277      fit_theta23 = glbGetOscParams(true_values, GLB_THETA_23);
278      fit_deltaCP = glbGetOscParams(true_values, GLB_DELTA_CP);
279      fit_dmSol   = glbGetOscParams(true_values, GLB_DM_SOL);
280      fit_dmAtm   = glbGetOscParams(true_values, GLB_DM_ATM);
281
282      //Get the Minimum Chi2 between the 2 hypothesis Delta=0 Delta=PI
283      res = res0;
284      if (resPi < res0) res = resPi;
285
286//       std::cout << "Theta_12(rad) " <<  fit_theta12 << " "
287//              << "Theta_13(rad) " <<  fit_theta13 << " "
288//                      << "Theta_23(deg) " <<  fit_theta23*180./M_PI << " "
289//                      << "Delta_CP(deg) " <<  fit_deltaCP*180./M_PI << " "
290//                      << "DM_21    " <<  fit_dmSol   << " "
291//                      << "DM_31    " <<  fit_dmAtm   << " "
292//                      << "Chi2 (fin) " << res
293//                      << std::endl;       
294
295      //Store in the Tuple
296      myTuple->fill(0,fit_theta12);
297      myTuple->fill(1,fit_theta13);
298      myTuple->fill(2,fit_theta23);
299      myTuple->fill(3,fit_deltaCP);
300      myTuple->fill(4,fit_dmSol);
301      myTuple->fill(5,fit_dmAtm);
302      myTuple->fill(6,res);
303      myTuple->addRow();
304     
305     
306    }//Loop on Theta13
307  }//Loop on DeltaCP
308 
309  //free GLoBES arrays
310  glbFreeParams(true_values);
311  glbFreeParams(test_values);
312  glbFreeParams(start_values);
313  glbFreeParams(fit_values);
314
315
316  //save Tuple
317  fTree->commit();
318
319  //Clean Tuple management
320  delete fTree;
321  delete aida;
322
323  return 0;
324}
325   
326
327
328
329
Note: See TracBrowser for help on using the repository browser.