]>
Commit | Line | Data |
---|---|---|
2bba24f4 | 1 | /****************************************************************************** |
2 | ||
3 | "ITSOccupancy.C" | |
4 | ||
faafc0eb | 5 | this macro calculates the mean occupancy of each ITS layer, counting the |
6 | "fired" digits of each module, and making two overall calculi: | |
7 | 1) the calculus of the mean overall layer occupancy (as the ratio | |
8 | between the total number of active digits and the total number of | |
9 | channels in the module; | |
10 | 2) a distribution of the occupancies as a funcion of z, to obtain some | |
11 | kind of most significand data for this value, along the z axis | |
12 | ||
13 | The macro creates also the GIF of the TCanvas where the histograms are plotted | |
14 | ||
15 | The arguments that must be inserted are the following: | |
16 | 1) the answer to the following question (as a Bool_t) | |
17 | "Can I get the total channels distribution from the file totals.root?" | |
18 | if the answer is NO (false) these histograms are re-created and re-stored | |
19 | in that file. | |
20 | ||
21 | 2) the name of the file to analyze; | |
22 | NOTE: in this argument you MUST omit the ".root" extension, because the | |
23 | macro uses this argument to recall the file, but also to name the | |
24 | GIF & PS of the output canvas, in order to save the plot of the | |
25 | distributions to the disk. If you put, as argument, the string | |
26 | "file.root", the macro will look for an unexisting file named | |
27 | "file.root.root"... | |
2bba24f4 | 28 | |
faafc0eb | 29 | It is also possible (and recommended) to compile this macro, |
30 | to execute it faster. To do this, it is necessary to: | |
2bba24f4 | 31 | 1) make sure that de "#define __COMPILED__" instruction below is UNcommented |
32 | and the "#define __NOCOMPILED__" instruction is commented (remember that | |
33 | if you comment or uncomment both these instructions, the macro can't work) | |
34 | 2) type, at the root prompt, the instruction | |
35 | gSystem->SetIncludePath("-I- -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS -g") | |
36 | to adjoin the ALICE include libraries to the main include directory | |
37 | 3) load the function via the ".L ITSOccupancy.C++" statement (only the first | |
38 | time, because the first time the macro must be compiled). Frome the | |
39 | second time you use the macro, you must only load it via the | |
40 | ".L ITSOccupancy.C+" instruction (note the number of '+' signs in each case | |
41 | 4) call the function with only its name, es: ITSOccupancy("HP", "galice.root") | |
42 | ||
2bba24f4 | 43 | Author: Alberto Pulvirenti |
44 | ******************************************************************************/ | |
45 | ||
46 | #define __COMPILED__ | |
47 | //#define __NOCOMPILED__ | |
48 | ||
49 | #ifdef __COMPILED__ | |
50 | #include <iostream.h> | |
51 | #include <TROOT.h> | |
52 | #include <TArrayI.h> | |
53 | #include <TCanvas.h> | |
54 | #include <TClassTable.h> | |
55 | #include <TClonesArray.h> | |
56 | #include <TFile.h> | |
57 | #include <TObject.h> | |
58 | #include <TObjArray.h> | |
59 | #include <TTree.h> | |
60 | #include <TMath.h> | |
61 | #include <TString.h> | |
62 | #include <TH1.h> | |
63 | #include <AliRun.h> | |
64 | #include <AliITS.h> | |
65 | #include <AliITSgeom.h> | |
66 | #include <AliITSDetType.h> | |
67 | #include <AliITSRecPoint.h> | |
68 | #include <AliITSdigit.h> | |
69 | #include <AliITShit.h> | |
70 | #include <AliITSmodule.h> | |
71 | #include <AliITSsegmentation.h> | |
72 | #include <AliITSsegmentationSPD.h> | |
73 | #include <AliITSsegmentationSDD.h> | |
74 | #include <AliITSsegmentationSSD.h> | |
75 | #endif | |
76 | ||
6782062e | 77 | Int_t ITSOccupancy(char *name = "galice", Int_t evNum = 0) { |
2bba24f4 | 78 | |
faafc0eb | 79 | // Evaluate the name of the file to open... |
80 | Int_t filelen = strlen(name); | |
81 | Text_t *fileroot = new Text_t[filelen + 6]; | |
82 | // ...and copy this name to the data ROOT file | |
83 | strcpy (fileroot, name); | |
84 | strcat (fileroot, ".root"); | |
85 | ||
86 | // Open the Root input file containing the AliRun data and | |
87 | // the Root output data file | |
88 | TFile *froot = (TFile*)gROOT->GetListOfFiles()->FindObject(fileroot); | |
89 | if (!froot) froot = new TFile(fileroot, "READ"); | |
90 | // Load the gAlice shared libs if not already in memory and | |
91 | // clears an eventually existing AliRun object | |
2bba24f4 | 92 | #ifdef __NOCOMPILED__ |
93 | if (gClassTable->GetID("AliRun") < 0) { | |
94 | gROOT->LoadMacro("loadlibs.C"); | |
95 | loadlibs(); | |
96 | } | |
97 | #endif | |
faafc0eb | 98 | if (gAlice) { |
2bba24f4 | 99 | delete gAlice; |
faafc0eb | 100 | gAlice = 0; |
2bba24f4 | 101 | } |
2bba24f4 | 102 | // Get the AliRun object from file (if there's none, the macro is stopped) |
faafc0eb | 103 | Int_t nparticles = 0; |
104 | gAlice = (AliRun*)froot->Get("gAlice"); | |
105 | if (gAlice) { | |
106 | cout << "Found an AliRun object in `" << fileroot << "'" << endl; | |
107 | // In this case, select the event number specified (default is 0) | |
108 | nparticles = gAlice->GetEvent(evNum); | |
109 | if (nparticles) | |
110 | cout << "\nNumber of particles = " << nparticles << endl; | |
111 | else { | |
112 | cout << "NO PARTICLES!!!!" << endl; | |
113 | return 0; | |
114 | } | |
2bba24f4 | 115 | } |
faafc0eb | 116 | else { |
117 | cout<<"Not found any AliRun object in `" << fileroot << "'" << endl; | |
2bba24f4 | 118 | return 0; |
119 | } | |
120 | // Initialize the ITS and its geometry | |
121 | AliITS *ITS = (AliITS*)gAlice->GetModule("ITS"); | |
122 | AliITSgeom *gm = ITS->GetITSgeom(); | |
2bba24f4 | 123 | |
faafc0eb | 124 | // Variables and objects definition and setting |
125 | Float_t zmax[] = {20.0,20.0,25.0,35.0,49.5,54.0}; // z edges for TH1F (cm) | |
126 | Int_t nbins[] = {20,20,20,28,22,24}; // bins number for TH1Fs | |
127 | ||
128 | // Histos for plotting occupancy distributions | |
129 | TH1F *above[6], *below[6]; | |
130 | ||
6782062e | 131 | for (Int_t lay = 0; lay < 6; lay++) { |
132 | Int_t nlads = gm->GetNladders(lay+1); | |
133 | Int_t ndets = gm->GetNdetectors(lay+1); | |
134 | Int_t dtype = lay / 2; | |
135 | Int_t minID = gm->GetModuleIndex(lay+1, 1, 1); | |
136 | Int_t maxID = gm->GetModuleIndex(lay+1, nlads, ndets); | |
137 | Text_t ffname[20]; | |
138 | sprintf(ffname, "h_%d", lay+1); | |
139 | below[lay] = new TH1F(ffname, "Total z distribution of digits", nbins[lay], -zmax[lay], zmax[lay]); | |
140 | cout << "Evaluating total channels number of layer " << lay+1 << endl; | |
141 | for (Int_t I = minID; I <= maxID; I++) { | |
142 | AliITSDetType *det = ITS->DetType(dtype); | |
143 | AliITSsegmentation *seg = det->GetSegmentationModel(); | |
144 | Int_t NX = seg->Npx(); | |
145 | Int_t NZ = seg->Npz(); | |
146 | for (Int_t ix = 0; ix <= NX; ix++) { | |
147 | for (Int_t iz = 0; iz <= NZ; iz++) { | |
148 | Float_t lx[] = {0.0,0.0,0.0}, gx[] = {0.0,0.0,0.0}; | |
149 | seg->DetToLocal(ix, iz, lx[0], lx[2]); | |
150 | gm->LtoG(I, lx, gx); | |
151 | below[lay]->Fill(gx[2]); | |
faafc0eb | 152 | } |
153 | } | |
2bba24f4 | 154 | } |
6782062e | 155 | sprintf(ffname, "H_%d", lay+1); |
156 | above[lay] = new TH1F(ffname, "histo", nbins[lay], -zmax[lay], zmax[lay]); | |
2bba24f4 | 157 | } |
6782062e | 158 | |
faafc0eb | 159 | // Counting the hits, digits and recpoints contained in the ITS |
160 | TTree *TD = gAlice->TreeD(); | |
161 | ITS->ResetDigits(); | |
162 | Float_t mean[6]; | |
2bba24f4 | 163 | |
164 | for (Int_t L = 0; L < 6; L++) { | |
165 | ||
faafc0eb | 166 | cout << "Layer " << L + 1 << ": " << flush; |
167 | ||
2bba24f4 | 168 | // To avoid two nested loops, are calculated |
169 | // the ID of the first and last module of the L | |
170 | // (remember the L goest from 0 to 5 (not from 1 to 6) | |
171 | Int_t first, last; | |
172 | first = gm->GetModuleIndex(L + 1, 1, 1); | |
173 | last = gm->GetModuleIndex(L + 1, gm->GetNladders(L + 1), gm->GetNdetectors(L + 1)); | |
174 | ||
175 | // Start loop on modules | |
2bba24f4 | 176 | for (Int_t ID = first; ID <= last; ID++) { |
faafc0eb | 177 | Int_t dtype = L / 2; |
178 | AliITSDetType *det = ITS->DetType(dtype); | |
179 | AliITSsegmentation *seg = det->GetSegmentationModel(); | |
180 | if (dtype == 2) seg->SetLayer(L+1); | |
2bba24f4 | 181 | |
faafc0eb | 182 | TD->GetEvent(ID); |
183 | TClonesArray *digits_array = ITS->DigitsAddress(dtype); | |
184 | Int_t digits_num = digits_array->GetEntries(); | |
185 | // Get the coordinates of the module | |
186 | for (Int_t j = 0; j < digits_num; j++) { | |
187 | Float_t lx[] = {0.0,0.0,0.0}, gx[] = {0.0,0.0,0.0}; | |
188 | AliITSdigit *digit = (AliITSdigit*)digits_array->UncheckedAt(j); | |
189 | Int_t iz=digit->fCoord1; // cell number z | |
190 | Int_t ix=digit->fCoord2; // cell number x | |
191 | // Get local coordinates of the element (microns) | |
192 | seg->DetToLocal(ix, iz, lx[0], lx[2]); | |
193 | gm->LtoG(ID, lx, gx); | |
194 | above[L]->Fill(gx[2]); | |
2bba24f4 | 195 | } |
2bba24f4 | 196 | } |
faafc0eb | 197 | |
198 | above[L]->Divide(above[L], below[L], 100.0, 1.0); | |
199 | mean[L] = above[L]->GetSumOfWeights() / above[L]->GetNbinsX(); | |
200 | cout.setf(ios::fixed); | |
201 | cout.precision(2); | |
202 | cout << " digits occupancy = " << mean[L] << "%" << endl; | |
203 | } | |
204 | ||
205 | TCanvas *view = new TCanvas("view", "Digits occupancy distributions", 600, 900); | |
206 | view->Divide(2, 3); | |
207 | ||
208 | for (Int_t I = 1; I < 7; I++) { | |
209 | view->cd(I); | |
210 | Text_t title[50]; | |
211 | sprintf(title, "Layer %d: %4.2f%c", I, mean[I-1], '%'); | |
212 | title[6] = (Text_t)I + '0'; | |
213 | above[I-1]->SetTitle(title); | |
214 | above[I-1]->SetStats(kFALSE); | |
215 | above[I-1]->SetXTitle("z (cm)"); | |
216 | above[I-1]->SetYTitle("%"); | |
217 | above[I-1]->Draw(); | |
218 | view->Update(); | |
219 | } | |
6782062e | 220 | Text_t *filegif = new Text_t[filelen + 23]; |
221 | Text_t *fileps = new Text_t[filelen + 23]; | |
faafc0eb | 222 | strcpy (filegif, name); |
223 | strcpy (fileps, name); | |
6782062e | 224 | strcat (filegif, "_digit_occupancy.gif"); |
225 | strcat (fileps, "_digit_occupancy.eps"); | |
faafc0eb | 226 | view->SaveAs(filegif); |
227 | view->SaveAs(fileps); | |
2bba24f4 | 228 | |
2bba24f4 | 229 | |
faafc0eb | 230 | return 1; |
2bba24f4 | 231 | } |