Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

AlephNtupleWriter.cpp

Go to the documentation of this file.
00001 #include "AlephNtupleWriter.h"
00002 #include <stdlib.h>
00003 
00004 //constructor
00005 AlephNtupleWriter::AlephNtupleWriter()
00006 {
00007 cards = NULL;
00008 size = 0;
00009 booked = false;
00010 type = 0;
00011 }
00012 
00013 // destructor
00014 AlephNtupleWriter::~AlephNtupleWriter() {}
00015 
00016 // initialize
00017 void AlephNtupleWriter::Initialize(AlephCardsReader* thecards, int mode)
00018 {
00019         cards = thecards;
00020         // mode: 1 = ROOT
00021         //       2 = HBOOK RW Ntuple 
00022         type = mode;
00023         switch (type)
00024         {
00025                 case 1 :
00026                         ROOTfile = new TFile(cards->getHist().c_str(),"RECREATE");
00027                         ROOTtree = new TTree("analysis","alpha++ analysis");
00028                         break;
00029                 case 2 :
00030                         // done by ALPHA
00031                         break;
00032                 default :
00033                         cerr << "ERROR: Bad Ntuple Type." << endl;
00034                         exit(0);
00035         }
00036 }
00037 
00038 // fill
00039 void AlephNtupleWriter::Fill()
00040 {
00041         switch (type)
00042         {
00043                 case 1 :
00044                         ROOTfile->cd();
00045                         ROOTtree->Fill();
00046                         break;
00047                 case 2 :
00048                         {
00049                                 if(!booked)
00050                                 {
00051                                         char d[NTMAXIN][8];
00052                                         for (int i =0;i<NTMAXIN;i++) for(int j=0;j<8;j++) d[i][j]=0;
00053                                                 int cnt = 0;
00054                                         for(map<string,int>::iterator mapel = NamesIndexes.begin(); mapel != NamesIndexes.end(); mapel++)
00055                                         {
00056                                                 for(int i=0;i<8;i++)
00057                                                 {
00058                                                         d[cnt][i] = mapel->first.c_str()[i];
00059                                                 }
00060                                                 cnt++;
00061                                         }
00062                                         HBOOKN(1000,"analysis",size," ",5000,d);
00063                                         booked = true;
00064                                 }
00065                                 float* myvars = new float[size];
00066                                 int cnt = 0;
00067                                 for(map<string,int>::iterator mapel=NamesIndexes.begin();mapel != NamesIndexes.end();mapel++)
00068                                         myvars[cnt++] = data[mapel->second];
00069                                 HFN(1000,myvars);
00070                                 delete [] myvars;
00071                         }
00072                         break;
00073                 default :
00074                         cerr << "ERROR: Bad Ntuple Type." << endl;
00075                         exit(0);                
00076         }
00077 }
00078 
00079 // terminate
00080 void AlephNtupleWriter::Terminate()
00081 {
00082         switch (type)
00083         {
00084                 case 1 :
00085                         ROOTfile->cd();
00086                         ROOTtree->Write();
00087                         ROOTfile->Close();
00088 //   The program seems to hang at the end is the tree is deleted.
00089 //                      delete ROOTtree;
00090                         delete ROOTfile;
00091                         for(map<string,int*>::iterator mapel=SizeAddresses.begin();mapel != SizeAddresses.end();mapel++)
00092                                 delete mapel->second;
00093                         for(vector<smart_void*>::iterator vecel=theObjects.begin();vecel < theObjects.end();vecel++)
00094                                 delete *vecel;
00095                         break;
00096                 case 2 :
00097                         // done by ALPHA
00098                         break;
00099                 default :
00100                         cerr << "ERROR: Bad Ntuple Type." << endl;
00101                         exit(0);
00102         }       
00103 }
00104 /*
00105 // user methods to keep the variable
00106 template <typename entry>
00107 void AlephNtupleWriter::Keep(char* name, entry* value)
00108 {
00109         switch(type)
00110         {
00111                 case 1 :
00112                         *(entry*)NamesAddresses[name] = *value;
00113                         break;
00114                 case 2 :
00115                         data[ NamesIndexes[name] ] = (float)*value;
00116                         break;
00117                 default:
00118                         cerr << "ERROR: Bad Ntuple Type." << endl;
00119                         exit(0);
00120         }
00121 }
00122 
00123 template <typename entry>
00124 void AlephNtupleWriter::Keep(char* name, entry* valuearray, int size)
00125 {
00126         switch(type)
00127         {
00128                 case 1 :
00129                         *SizeAddresses[name] = size;
00130                         entry* array = (entry*)NamesAddresses[name];
00131                         for(int i=0;i<size;i++) array[i] = valuearray[i];
00132                         break;
00133                 case 2 :
00134                         cerr << "ERROR: column-wise ntuple still not handled... Keep(char*, entry*, int) unavailable." << endl;
00135                         break;
00136                 default:
00137                         cerr << "ERROR: Bad Ntuple Type." << endl;
00138                         exit(0);
00139         }               
00140 }
00141 */

Generated at Wed Jun 18 17:19:09 2003 for ALPHA++ by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001