/[PAMELA software]/PamelaLevel2/doc/examples/Loop.cpp
ViewVC logotype

Annotation of /PamelaLevel2/doc/examples/Loop.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations) (download)
Mon Dec 11 18:29:01 2006 UTC (17 years, 11 months ago) by pam-fi
Branch: MAIN
Changes since 1.1: +73 -42 lines
*** empty log message ***

1 pam-fi 1.1 #if !defined(__CINT__) || defined(__MAKECINT__)
2    
3     #include <PamLevel2.h>
4    
5     #include <TTree.h>
6     #include <TChain.h>
7     #include <TFile.h>
8     #include <TList.h>
9     #include <TROOT.h>
10     #include <TString.h>
11     #include <TBenchmark.h>
12     #include <TFriendElement.h>
13    
14     #include <stdlib.h>
15     #include <iostream>
16     using namespace std;
17    
18     #endif
19    
20     //===================================
21     // global variables
22     //===================================
23     PamLevel2 *event = NULL;
24     TChain *tree = NULL;
25     TFile *outfh = NULL;
26     TFile *outft = NULL;
27     TTree *otree = NULL;
28    
29     bool fillTree = false;
30     bool fillHistos = false;
31    
32     //====================================
33     // Functions to be provided externally
34     //====================================
35     bool Select(PamLevel2*);
36 pam-fi 1.2 void CreateHistos(TFile *);
37 pam-fi 1.1 void FillHistos(PamLevel2*);
38     void SaveHistos(TFile *);
39    
40     //==========================================
41     //000000000000000000000000000000000000000000
42     //==========================================
43     bool Begin(){
44    
45     //------------------------
46     // load magnetic field
47     //------------------------
48     TString fieldpath = gSystem->Getenv("PAM_CALIB");
49     if(fieldpath.IsNull()){
50     cout << " **ERROR** : No PAMELA environment variables defined "<<endl;
51     return 0;
52     }
53     fieldpath.Append("/trk-param/field_param-0/");
54     event->LoadField(fieldpath.Data());
55    
56    
57     //------------------------------
58     // create output histos/trees
59     //------------------------------
60 pam-fi 1.2 if(fillHistos) CreateHistos(outfh);
61     if(fillTree){
62     // outft->cd();
63     // event->CreateCloneTrees(tree,outft);
64     event->CreateCloneTrees(outft);
65     }
66     // gDirectory->ls();
67 pam-fi 1.1
68     cout << "\nBegin() - done\n\n";
69     return 1;
70    
71     }
72     //==========================================
73     //000000000000000000000000000000000000000000
74     //==========================================
75    
76     bool Process(int iev){
77    
78    
79     if( !Select(event) )return false;
80     // cout <<event->TrkLevel2::ntrk()<<endl;
81    
82    
83 pam-fi 1.2 if(fillTree)event->FillCloneTrees();
84     if(fillHistos)FillHistos(event);
85 pam-fi 1.1
86     return true;
87    
88     }
89     //==========================================
90     //000000000000000000000000000000000000000000
91     //==========================================
92    
93     bool Finish(){
94    
95     if(fillTree){
96     outft->cd();
97     event->WriteCloneTrees();
98     outft->Close();
99     }
100     if(fillHistos){
101     SaveHistos(outfh);
102     outfh->Close();
103     }
104    
105     cout << "Finish() - done\n";
106    
107     return 1;
108     }
109    
110     //==========================================
111     //000000000000000000000000000000000000000000
112     //==========================================
113     Int_t Loop(TString ddir,TString list, ULong64_t nmax, TString options, TString outfile){
114    
115     if(options.Contains("fillTree"))fillTree=true;
116     if(options.Contains("fillHisto"))fillHistos=true;
117    
118     // -------------------
119     // create output files
120     // -------------------
121     TString outfile_t =0;
122     TString outfile_h =0;
123     if( outfile.IsNull() ){
124     if(!list.IsNull())outfile = list(0,list.Last('.'));
125     else outfile = "output";
126     }else{
127     if(outfile.Contains(".root"))outfile = outfile(0,outfile.Last('.'));
128     }
129     if(fillTree){
130     outfile_t = outfile;
131     outfile_t.Append("-tree.root");
132     outft = (TFile*)gROOT->FindObject(outfile_t); if (outft) outft->Close();
133     outft = new TFile(outfile_t,"RECREATE");
134     if(outft->IsZombie()){
135     cout << "Output file could not be created\n";
136     return 1;
137     };
138     cout << "Created output file: "<<outft->GetName()<<endl;
139     }
140     if(fillHistos){
141     outfile_h = outfile;
142     outfile_h.Append("-histo.root");
143     outfh = (TFile*)gROOT->FindObject(outfile_h); if (outfh) outfh->Close();
144     outfh = new TFile(outfile_h,"RECREATE");
145     if(outfh->IsZombie()){
146     cout << "Output file could not be created\n";
147     return 1;
148     };
149     cout << "Created output file: "<<outfh->GetName()<<endl;
150     }
151    
152     // --------------------
153     // read input file/list
154     // --------------------
155     event = new PamLevel2();
156     if(list.Contains(".root")){
157     stringstream command;
158     command.str("");
159     command << " echo "<<list<<" > list-temp.txt";
160     cout << command.str().c_str() << endl;
161     gSystem->Exec(command.str().c_str());
162 pam-fi 1.2 tree = event->GetPamTree(ddir,"list-temp.txt",options);
163 pam-fi 1.1 }else{
164 pam-fi 1.2 tree = event->GetPamTree(ddir,list,options);
165 pam-fi 1.1 };
166     tree->SetCacheSize(0);
167    
168     // ---------------
169     // initializations
170     // ---------------
171     if( !Begin() )return 0;;
172    
173     // -----------------
174     // loop over events
175     // -----------------
176 pam-fi 1.2 ULong64_t nevents = tree->GetEntries();
177 pam-fi 1.1 if(!nmax)nmax = numeric_limits<ULong64_t>::max();
178     if(nevents < nmax)nmax=nevents;
179    
180     cout << endl<<" Start loop over events: "<< nmax<<endl;
181 pam-fi 1.2 Int_t ntrk = 0;
182     Int_t sel = 0;
183     Int_t get = 0;
184 pam-fi 1.1 TBenchmark *benchmark = new TBenchmark();
185     benchmark->Start("event-loop");
186    
187     TString current_file = "";
188 pam-fi 1.2 for(ULong64_t iev=0; iev<nmax; iev++){
189 pam-fi 1.1
190 pam-fi 1.2 event->Clear();
191     if( tree->GetEntry(iev) ){
192     get++;
193     if( Process(iev) ){
194     sel++;
195     if(event->TrkLevel2::ntrk() >0)ntrk++;
196     }
197     if(current_file.CompareTo(tree->GetFile()->GetName())){
198     current_file=tree->GetFile()->GetName();
199     cout << iev<< " -> "<< current_file << endl;
200 pam-fi 1.1 // cout << tree->GetFile()->GetName() << endl;
201 pam-fi 1.2 };
202     // if( fillTree && !(sel%10000) )
203     // if(event->TrkLevel2::ntrk() >0)ntrk++;
204     }else{
205     cout << "Chain entry "<<iev<<" -- ERROR --"<<endl;
206 pam-fi 1.1 };
207 pam-fi 1.2 // if(!(iev%100))cout << iev << endl;
208 pam-fi 1.1
209     };
210     benchmark->Show("event-loop");
211 pam-fi 1.2 cout << sel <<" selected events over "<<get;
212     if(get)cout<<" ("<< 100*sel/get<<"%)"<<endl;
213     cout << "Fitted tracks: "<<ntrk<<endl;
214    
215 pam-fi 1.1 // --------------
216     // close and exit
217     // --------------
218     Finish();
219    
220     return 0;
221    
222     }
223    
224     /////////////////////////////////////////////////////////////////
225    
226 pam-fi 1.2 #if !defined(__CINT__)
227 pam-fi 1.1
228     // input parameters
229     Bool_t DEBUG;
230     TString DIR;
231     TString LIST;
232 pam-fi 1.2 TString OPTIONS;
233 pam-fi 1.1 ULong64_t MAXEV;
234     TString OUTFILE;
235    
236     void usage(){
237 pam-fi 1.2
238     cout << "------------------------------------------------------------"<<endl;
239     cout << "Loop over events (on one or more Level2-files), applying some selection cuts (defined in My-Selection.cpp), \n";
240     cout << "creating output histograms (defined in My-Histos.cpp) and/or trees with selected events. \n \n ";
241 pam-fi 1.1 cout << "USAGE:"<<endl;
242 pam-fi 1.2 cout << "-processDir DIR - Level2 data directory \n";
243     cout << "-processList LIST - list of files (.txt) or single file (.root) to be analysed \n";
244     cout << "-outputFile PATH - name of the output file \n";
245     cout << "-NumEvents XXX - number of events to be analysed \n";
246 pam-fi 1.1 cout << "--debug, -g - debug mode \n";
247     cout << "--help, -h - print this help \n";
248 pam-fi 1.2 cout << "-options [ options ] - options: \n";
249     cout << " fillHistos --> create an output file with histograms \n";
250     cout << " fillTree --> create an output file with trees storing the selected events \n ";
251     cout << " +(-)ALL --> inlcude(exclude) all trees and branches \n " ;
252     cout << " +(-)TRK1 +(-)TRK2 +(-)CAL1 +(-)CAL2 +(-)TOF +(-)TRG +(-)ND +(-)S4 +(-)ORB --> inlcude(exclude) trees and branches \n" ;
253     cout << "------------------------------------------------------------"<<endl;
254 pam-fi 1.1 }
255     //
256     int HandleInputPar(int argc, char **argv){
257    
258     if(argc>1){
259    
260     if(!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help") ){
261     usage();
262     return(1);
263     };
264     // -----------------------
265     // Read input parameters
266     // -----------------------
267 pam-fi 1.2 DEBUG = false;
268     DIR = gSystem->WorkingDirectory();
269     LIST = "";
270     OUTFILE = "";
271     OPTIONS = "+ALL fillTree";
272     MAXEV = 0;
273 pam-fi 1.1
274    
275     for (int i = 1; i < argc; i++){
276     // -----------------------------------------------------//
277     if (!strcmp(argv[i], "-processDir")){
278     if (++i >= argc) throw -1;
279     DIR = argv[i];
280     cout << "processDir "<<DIR<<endl;
281     continue;
282     }
283     // -----------------------------------------------------//
284     else if (!strcmp(argv[i], "-processList")){
285     if (++i >= argc) throw -1;
286     LIST = argv[i];
287     cout << "processList "<<LIST<<endl;
288     continue;
289     }
290     // -----------------------------------------------------//
291     else if (!strcmp(argv[i], "-outputFile")){
292     if (++i >= argc) throw -1;
293     OUTFILE = argv[i];
294     cout << "outputFile "<<OUTFILE<<endl;
295     continue;
296     }
297     // -----------------------------------------------------//
298     else if (!strcmp(argv[i], "-NumEvents")){
299     if (++i >= argc) throw -1;
300     MAXEV = atoi(argv[i]);
301     cout << "NumEvents "<<MAXEV<<endl;
302     continue;
303     }
304     // -----------------------------------------------------//
305 pam-fi 1.2 else if (!strcmp(argv[i], "-options")){
306     if (++i >= argc) throw -1;
307     OPTIONS = argv[i];
308     if( OPTIONS.Contains("[") ){
309     do{
310     if (++i >= argc) throw -1;
311     OPTIONS.Append(argv[i]);
312     }while(!OPTIONS.Contains("]"));
313     }else cout << "wrong option format --> ignoring " << endl;
314     }
315     // -----------------------------------------------------//
316 pam-fi 1.1 else if (!strcmp(argv[i], "--debug") || !strcmp(argv[i], "-g")){
317     DEBUG = true;
318     continue;
319     }
320     // -----------------------------------------------------//
321     else{
322     cout << "Unidentified input parameter. Ignored."<< endl;
323     };
324     };
325     }else{
326     usage();
327     return(1);
328     };
329     // -----------------------
330     // Check input parameters
331     // -----------------------
332    
333    
334     return(0);
335    
336     };
337     //
338    
339     int main(int argc, char **argv)
340     {
341    
342     if( HandleInputPar(argc,argv) )return(1);
343    
344 pam-fi 1.2 // Loop(DIR,LIST,MAXEV,"-ALL+TRK1+TRK2+CAL1+CAL2+TOF+AC",OUTFILE);
345     cout << "OPTIONS "<<OPTIONS<<endl;
346     Loop(DIR,LIST,MAXEV,OPTIONS,OUTFILE);
347 pam-fi 1.1
348     cout << "Back to main - end"<<endl;
349    
350     return 0;
351    
352     };
353    
354     #endif

  ViewVC Help
Powered by ViewVC 1.1.23