New TTask based method to do Digits To clusters. Works with files of multiple
[u/mrichter/AliRoot.git] / MUON / MUONtracking.C
1 void MUONtracking (Int_t evNumber1=0, Int_t evNumber2=99, Int_t idres=116, Int_t ireadgeant=1, Int_t ibgr=1, Int_t nev_bgd=10) 
2 {
3   //////////////////////////////////////
4   //                                  //
5   // ROOT macro for ALICE Dimuon Arm: //
6   // Track reconstruction             //
7   //                                  //
8   //////////////////////////////////////
9   //
10   // Reconstructs tracks from events in the ROOT file "galice.root".
11   // Track reconstruction is performed (argument "ireadgeant")
12   // either directly from GEANT hits (tree TH),
13   // or from raw clusters (tree TR) constructed from digits (tree TD).
14   // Eventually (argument "ibgr"), background GEANT hits
15   // are also taken into account from the ROOT file "galice_bgr.root".
16   // 
17   // Arguments:
18   //   evNumber1  = first event number to act on in file "galice.root"
19   //   evNumber2  = last event number to act on in file "galice.root"
20   //   idres      : used for statistics
21   //              = 116 for Upsilon
22   //              = 114 for J/Psi
23   //   ireadgeant = 1 to reconstruct tracks directly from GEANT hits
24   //              = 0 to reconstruct tracks from raw clusters
25   //   ibg        : used only if "ireadgeant" = 1
26   //              = 0 if no background GEANT hits to be taken into account;
27   //              = 1 if  background GEANT hits
28   //                  to be taken into account in file "galice_bgr.root"
29   //              used only if "ireadgeant" = 1
30   //   nev_bgd    : used only if "ireadgeant" = 1 and "ibg" = 1
31   //              = number of events in the background file "galice_bgr.root";
32   //                successive signal events are mixed
33   //                with different background events in file "galice_bgr.root",
34   //                  starting from event number 0,
35   //                  incrementing it by 1 till event number ("nev_bgd" - 1),
36   //                  continuing with event number 0 and so on.
37   //                Strictly speaking, "nev_bgd" can be smaller than
38   //                the number of events in the background file,
39   //                in which case one will only use
40   //                the first "nev_bgd" events of the background file.
41   //                But it SHOULD NOT BE LARGER THAN
42   //                THE ACTUAL NUMBER OF EVENTS IN THE BACKGROUND FILE.
43   //
44   // Input file(s):
45   //   "galice.root" for GEANT hits or raw clusters
46   //   "galice_bgr.root" for background GEANT hits
47   //                     (used only if "ireadgeant" = 1 and "ibg" = 1)
48   //
49   // Output file:
50   //   "reconst.root" for ROOT ntuples
51   //
52   //__________________________________________________________________________
53
54 // Dynamically link some shared libs                    
55
56    if (gClassTable->GetID("AliRun") < 0) {
57       gROOT->LoadMacro("loadlibs.C");
58       loadlibs();
59    }
60 // Connect the Root Galice file containing Geometry, Kine and Hits
61
62     TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject("galice.root");
63     
64     if (!file) {
65         printf("\n Creating galice.root \n");
66         file = new TFile("galice.root");
67     } else {    printf("\n galice.root found in file list");
68     }
69     
70 // Get AliRun object from file or create it if not on file
71     if (!gAlice) {
72         gAlice = (AliRun*)(file->Get("gAlice"));
73         if (gAlice) printf("AliRun object found on file\n");
74         if (!gAlice) {
75             printf("\n create new gAlice object");
76             gAlice = new AliRun("gAlice","Alice test program");
77         }
78     }
79
80 // seff = efficiency per chamber (ireadgeant=1) 
81     Double_t seff  = 1;
82     //    Double_t seff  = 1.;
83 // sb0 = magn. field in dipole, sbl3 = magn. field in L3 
84 // necessary for trackfinding only.
85     Double_t sb0   = 0.7;
86     Double_t sbl3  = 0.2;
87
88 //  ifit = 0 trackfinding only
89 //  ifit = 1 trackfinding + fit 
90     Int_t ifit   = 1;
91 // idebug = 0,1,2 print level for reco_muon.F 
92     Int_t idebug = 1;
93
94     AliMUON *MUON  = (AliMUON*) gAlice->GetModule("MUON");
95     AliMUONTrackReconstructor *Reconstruction = new AliMUONTrackReconstructor();    
96     Int_t nparticles = gAlice->GetEvent(evNumber1);
97     if (nparticles <= 0) return;
98
99     Reconstruction->Init(seff,sb0,sbl3);
100
101 //   Loop over events 
102 //
103     Int_t inev_bgd=0;
104     
105     for (Int_t nev= evNumber1; nev<= evNumber2; nev++) 
106     {
107         printf("nev=%d\n",nev);
108         if (nev != evNumber1) Int_t nparticles = gAlice->GetEvent(nev);
109         if (nev < evNumber1) continue;
110         if (nparticles <= 0) return;
111         Reconstruction->FinishEvent();
112         if (ireadgeant==1 && ibgr==1) {
113           if (inev_bgd==nev_bgd) inev_bgd=0;
114           Reconstruction->Reconst(ifit,idebug,inev_bgd,nev,idres,ireadgeant,"Add","galice_bgr.root");
115           Reconstruction->FinishEvent();
116           inev_bgd++;
117         }
118         else {
119           //    printf("ireadgeant=%d\n",ireadgeant);
120         Reconstruction->Reconst(ifit,idebug,inev_bgd,nev,idres,ireadgeant,"rien1","rien2");
121         Reconstruction->FinishEvent();
122
123         }
124
125     } // event loop 
126     
127     Reconstruction->Close();
128 }
129
130
131