source: GLBFrejus/tags/v7r0/src/discoCP.cxx @ 700

Last change on this file since 700 was 2, checked in by campagne, 19 years ago

first import

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