StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
fms_db_detectorposition.C
1 #include <iostream.h>
2 #include <fstream.h>
3 
4 void fms_db_detectorposition(char* opt = "readtext", char* dataspec) {
5  // that's begin time for validity range for WRITING TO DB
6  // your data will be available from storeTime till 2037
7  TString data(dataspec);
8  TString storeTime;
9  int readDate,readTime;
10  if(data.Contains("run8") && data.Contains("dAu200")){
11  storeTime = "2007-11-09 12:00:00";
12  readDate = 20071110;
13  readTime = 0;
14  }else if(data.Contains("run8") && data.Contains("pp200")){
15  storeTime = "2008-01-28 12:00:00";
16  readDate = 20080129;
17  readTime = 0;
18  }else if(data.Contains("run9") && data.Contains("pp200")){
19  storeTime = "2009-01-16 00:00:00";
20  readDate = 20090117;
21  readTime = 0;
22  }else if(data.Contains("run15ppsim")){
23  storeTime = "2014-12-16 00:00:00";
24  readDate = 20141216;
25  readTime = 120000;
26  }else if(data.Contains("run15pAsim")){
27  storeTime = "2014-12-17 00:00:00";
28  readDate = 20141217;
29  readTime = 120000;
30  }else if(data.Contains("run17sim")){
31  storeTime = "2016-12-10 00:00:01";
32  readDate = 20161210;
33  readTime = 120001;
34  }else{
35  std::cout<<"Invalid year range"<<std::endl;
36  exit;
37  }
38 
39  TString option(opt);
40  std::cout << "Opt =" << opt << "\n";
41  std::cout << "testinput = " << option.Contains("testinput") << "\n";
42  std::cout << "readtext = " << option.Contains("readtext") << "\n";
43  std::cout << "readdb = " << option.Contains("readdb") << "\n";
44  std::cout << "writedb = " << option.Contains("writedb") << "\n";
45  std::cout << "writetext = " << option.Contains("writetext") << "\n";
46  std::cout << "StoreTime="<<storeTime<<endl;
47  std::cout << "ReadTime="<<readDate<<" "<<readTime<<endl;
48 
49  gROOT->Macro("LoadLogger.C");
50  gSystem->Load("St_base.so");
51  gSystem->Load("libStDb_Tables.so");
52  gSystem->Load("StDbLib.so");
53 
54  // max index dimensions
55  const Int_t MAX = 6;
56 
57  // structure to fill up
58  fmsDetectorPosition_st detposition[MAX];
59 
60  if(option.Contains("testinput")){
61  // fill only first entry for testing purposes:
62  detposition[0].detectorId = 2;
63  detposition[0].xwidth = 7;
64  detposition[0].ywidth = .15;
65  detposition[1].detectorId = 2;
66  detposition[1].xwidth = 7;
67  detposition[1].ywidth = .15;
68  }
69 
70  if(option.Contains("readtext")){
71  FILE* fp;
72  int rdetid;
73  float rzoffset, rxoffset, ryoffset, rxwidth, rywidth;
74  cout << "Reading "<<dataspec<<"\n";
75  if(fp=fopen(dataspec,"r")){
76  for(int i=0; i<MAX; i++){
77  if(!feof(fp)) fscanf(fp,"%d %f %f %f %f %f",&rdetid,&rzoffset, &rxoffset, &ryoffset, &rxwidth, &rywidth);
78  detposition[i].detectorId=rdetid;
79  detposition[i].xwidth=rxwidth;
80  detposition[i].ywidth=rywidth;
81  detposition[i].xoffset=rxoffset;
82  detposition[i].yoffset=ryoffset;
83  detposition[i].zoffset=rzoffset;
84  cout << Form("%2d zoff=%10.4f xoff=%10.4f yoff=%10.4f wx=%10.4f wy%10.4f\n",rdetid,rzoffset,rxoffset, ryoffset, rxwidth, rywidth);
85  }
86  }
87  fclose(fp);
88  }
89 
90  if(option.Contains("readdb")){
91  gSystem->Load("StChain");
92  gSystem->Load("StBFChain");
93  gSystem->Load("StUtilities");
94  gSystem->Load("StIOMaker");
95  gSystem->Load("StarClassLibrary");
96  gSystem->Load("St_Tables");
97  gSystem->Load("StDbLib");
98  gSystem->Load("StDbBroker");
99  gSystem->Load("St_db_Maker");
100 
101  St_db_Maker *dbMk=new St_db_Maker("db", "MySQL:StarDb", "$STAR/StarDb");
102  dbMk->SetDebug();
103  dbMk->SetDateTime(readDate,readTime);
104  dbMk->SetFlavor("ofl"); // for offline calibrations/mapping
105  // dbMk->SetFlavor("simu"); // for simulations
106  dbMk->Init();
107  dbMk->Make();
108 
109  // this is done inside ::Make method
110  TDataSet *DB = 0;
111  // "dbMk->" will NOT be needed.
112  // if done inside your FmsDbMaker. Simply use DB = GetInputDb("Calibrations/fms/mapping")
113  DB = dbMk->GetInputDB("Geometry/fms");
114  if (!DB) { std::cout << "ERROR: no db maker?" << std::endl; }
115 
116  // fetch ROOT descriptor of db table
117  St_fmsDetectorPosition *dbppmap = 0;
118  dbppmap = (St_fmsDetectorPosition*) DB->Find("fmsDetectorPosition");
119  // fetch data and place it to appropriate structure
120  if (dbppmap) {
121  std::cout << "Reading fmsDetectorPosition table\n";
122  fmsDetectorPosition_st *pptable = dbppmap->GetTable();
123  Int_t rows = dbppmap->GetNRows();
124  for(int i=0; i<rows; i++)
125  printf("%2d %8.1f %6.1f %5.1f %6.3f %6.3f\n",
126  pptable[i].detectorId,pptable[i].zoffset,pptable[i].xoffset,
127  pptable[i].yoffset,pptable[i].xwidth,pptable[i].ywidth);
128  memcpy(detposition,pptable,sizeof(detposition));
129  }
130  else
131  std::cout << "WARNING: No data in fmsDetposition table (wrong timestamp?). Nothing to return, then.\n";
132  }
133 
134 
135  if(option.Contains("writetext")){
136  int ii = data.Length();
137  data.Insert(ii-4,"_out");
138  char* file=data.Data();
139  FILE* fp;
140  cout << "Writing "<<file<<"\n";
141  if(fp=fopen(file,"w"))
142  for(int i=0; i<MAX; i++){
143  fprintf(fp,"%8d%10.1f%10.2f%8.1f%10.3f%10.3f\n", detposition[i].detectorId, detposition[i].zoffset, detposition[i].xoffset,
144  detposition[i].yoffset, detposition[i].xwidth, detposition[i].ywidth);
145  }
146  fclose(fp);
147  }
148 
149  if(option.Contains("writedb")) {
150  gSystem->Setenv("DB_ACCESS_MODE","write");
151  //putenv("DB_ACCESS_MODE=write");
152  //char* env = getenv("DB_ACCESS_MODE");
153  //cout << "Setting DB_ACCESS_MODE " << env << endl;
154  cout << "DB_ACCESS_MODE="<<gSystem->Getenv("DB_ACCESS_MODE")<<endl;
156  StDbConfigNode* node = mgr->initConfig("Geometry_fms");
157  StDbTable* table = node->addDbTable("fmsDetectorPosition");
158  mgr->setStoreTime(storeTime.Data());
159  // store data in the table
160  table->SetTable((char*)&detposition,MAX);
161  // set store time
162  // store table in dBase
163  mgr->storeDbTable(table);
164  //StDbTable* table = node->findTable("fmsDetposition");
165  //node->removeTable(table);
166  gSystem->Unsetenv("DB_ACCESS_MODE");
167  //unsetenv("DB_ACCESS_MODE");
168  std::cout << "Done with database upload \n";
169  }
170 }
171 
virtual Int_t Make()
virtual void SetTable(char *data, int nrows, int *idList=0)
calloc&#39;d version of data for StRoot
Definition: StDbTable.cc:550
static StDbManager * Instance()
strdup(..) is not ANSI
Definition: StDbManager.cc:155
virtual TDataSet * Find(const char *path) const
Definition: TDataSet.cxx:362