]>
Commit | Line | Data |
---|---|---|
04236e67 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | ||
17 | // --- ROOT system --- | |
18 | #include <TClonesArray.h> | |
19 | #include <TFile.h> | |
20 | #include <TH1F.h> | |
21 | #include <TH1I.h> | |
7035694f | 22 | #include <TH2F.h> |
23 | #include <TH3F.h> | |
04236e67 | 24 | #include <TLorentzVector.h> |
25 | ||
26 | // --- AliRoot header files --- | |
27 | #include "AliESDEvent.h" | |
b62881f2 | 28 | #include "AliMUONConstants.h" |
04236e67 | 29 | #include "AliLog.h" |
30 | #include "AliRawReader.h" | |
31 | #include "AliQAChecker.h" | |
1c66abf3 | 32 | #include "AliMpBusPatch.h" |
04236e67 | 33 | #include "AliMUONCluster.h" |
34 | #include "AliMUONRawStreamTracker.h" | |
35 | #include "AliMUONRawStreamTrigger.h" | |
36 | ||
37 | #include "AliMUONVClusterStore.h" | |
38 | #include "AliMUONVCluster.h" | |
39 | #include "AliESDMuonTrack.h" | |
b62881f2 | 40 | #include "AliESDMuonCluster.h" |
04236e67 | 41 | |
7035694f | 42 | #include "AliMUONDigitMaker.h" |
43 | #include "AliMUONVDigitStore.h" | |
44 | #include "AliMUONVTriggerStore.h" | |
45 | #include "AliMUONVDigit.h" | |
46 | #include "AliMUONLocalTrigger.h" | |
47 | ||
04236e67 | 48 | #include "AliMUONQADataMakerRec.h" |
49 | ||
50 | //----------------------------------------------------------------------------- | |
51 | /// \class AliMUONQADataMakerRec | |
52 | /// | |
53 | /// MUON base class for quality assurance data (histo) maker | |
54 | /// | |
55 | /// \author C. Finck | |
56 | ||
57 | /// \cond CLASSIMP | |
58 | ClassImp(AliMUONQADataMakerRec) | |
59 | /// \endcond | |
60 | ||
61 | //____________________________________________________________________________ | |
62 | AliMUONQADataMakerRec::AliMUONQADataMakerRec() : | |
63 | AliQADataMakerRec(AliQA::GetDetName(AliQA::kMUON), "MUON Quality Assurance Data Maker"), | |
7035694f | 64 | fDigitStore(0x0), |
65 | fTriggerStore(0x0), | |
66 | fDigitMaker(0x0) | |
04236e67 | 67 | { |
68 | /// ctor | |
7035694f | 69 | fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV1"); |
70 | fDigitMaker = new AliMUONDigitMaker(kTRUE,kFALSE); | |
71 | ||
04236e67 | 72 | } |
73 | ||
74 | //____________________________________________________________________________ | |
75 | AliMUONQADataMakerRec::AliMUONQADataMakerRec(const AliMUONQADataMakerRec& qadm) : | |
7035694f | 76 | AliQADataMakerRec(qadm), |
77 | fDigitStore(0x0), | |
78 | fTriggerStore(0x0), | |
79 | fDigitMaker(0x0) | |
04236e67 | 80 | { |
81 | ///copy ctor | |
82 | SetName((const char*)qadm.GetName()) ; | |
83 | SetTitle((const char*)qadm.GetTitle()); | |
7035694f | 84 | |
85 | // Do not copy the digit store and digit maker, but create its own ones | |
86 | fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV1"); | |
87 | fDigitMaker = new AliMUONDigitMaker(kTRUE,kFALSE); | |
04236e67 | 88 | } |
89 | ||
90 | //__________________________________________________________________ | |
91 | AliMUONQADataMakerRec& AliMUONQADataMakerRec::operator = (const AliMUONQADataMakerRec& qadm ) | |
92 | { | |
7035694f | 93 | /// Assignment operator |
94 | ||
95 | // check assignment to self | |
96 | if (this == &qadm) return *this; | |
97 | ||
98 | this->~AliMUONQADataMakerRec(); | |
99 | new(this) AliMUONQADataMakerRec(qadm); | |
100 | return *this; | |
04236e67 | 101 | } |
102 | ||
103 | //__________________________________________________________________ | |
104 | AliMUONQADataMakerRec::~AliMUONQADataMakerRec() | |
105 | { | |
106 | /// dtor | |
7035694f | 107 | delete fDigitStore; |
108 | delete fTriggerStore; | |
109 | delete fDigitMaker; | |
04236e67 | 110 | } |
111 | ||
112 | //____________________________________________________________________________ | |
92a357bf | 113 | void AliMUONQADataMakerRec::EndOfDetectorCycle(AliQA::TASKINDEX_t task, TObjArray* list) |
04236e67 | 114 | { |
115 | ///Detector specific actions at end of cycle | |
116 | // do the QA checking | |
117 | AliQAChecker::Instance()->Run(AliQA::kMUON, task, list) ; | |
118 | } | |
119 | ||
120 | //____________________________________________________________________________ | |
121 | void AliMUONQADataMakerRec::InitRaws() | |
122 | { | |
123 | /// create Raws histograms in Raws subdir | |
124 | TH1I* h0 = new TH1I("hRawBusPatch", "buspatch distribution", 1932, 1, 1932); | |
b62881f2 | 125 | Add2RawsList(h0, kRawBusPatch); |
04236e67 | 126 | |
127 | TH1I* h1 = new TH1I("hRawCharge", "Charge distribution in rawdata", 4096, 0, 4095); | |
b62881f2 | 128 | Add2RawsList(h1, kRawCharge); |
1c66abf3 | 129 | |
130 | for (Int_t iDDL = 0; iDDL < 20; ++iDDL) | |
131 | { | |
132 | TH1F* h2 = new TH1F(Form("%s%d", "hRawBusPatchDDL", iDDL), Form("%s %d","RAW Buspatch distribution for DDL", iDDL), 50, 0, 49); | |
133 | Add2RawsList(h2, kRawBuspatchDDL+iDDL); | |
134 | } | |
04236e67 | 135 | |
136 | } | |
137 | ||
138 | //____________________________________________________________________________ | |
139 | void AliMUONQADataMakerRec::InitRecPoints() | |
140 | { | |
141 | /// create Reconstructed Points histograms in RecPoints subdir | |
7035694f | 142 | TH3F *h2 = new TH3F("hTriggerDigitsBendPlane", "Trigger digits in bending plane", |
143 | 4, -0.5, 4. - 0.5, | |
144 | 18, -0.5, 18. - 0.5, | |
145 | 7*64, -0.5, 7.*64. - 0.5); | |
b62881f2 | 146 | Add2RecPointsList(h2, kTriggerDigitsBendPlane); |
7035694f | 147 | |
148 | TH3F *h3 = new TH3F("hTriggerDigitsNonBendPlane", "Trigger digits in non-bending plane", | |
149 | 4, -0.5, 4. - 0.5, | |
150 | 18, -0.5, 18. - 0.5, | |
151 | 112, -0.5, 112. - 0.5); | |
b62881f2 | 152 | Add2RecPointsList(h3, kTriggerDigitsNonBendPlane); |
04236e67 | 153 | } |
154 | ||
155 | ||
156 | //____________________________________________________________________________ | |
157 | void AliMUONQADataMakerRec::InitESDs() | |
158 | { | |
159 | ///create ESDs histograms in ESDs subdir | |
160 | TH1F* h0 = new TH1F("hESDnTracks", "ESDs track number distribution", 30, 0., 30.); | |
b62881f2 | 161 | Add2ESDsList(h0, kESDnTracks); |
04236e67 | 162 | |
163 | TH1F* h1 = new TH1F("hESDMomentum", "ESDs P distribution", 300, 0., 300) ; | |
b62881f2 | 164 | Add2ESDsList(h1, kESDMomentum); |
04236e67 | 165 | |
166 | TH1F* h2 = new TH1F("hESDPt", "ESDs Pt distribution", 200, 0., 50) ; | |
b62881f2 | 167 | Add2ESDsList(h2, kESDPt); |
04236e67 | 168 | |
169 | TH1F* h3 = new TH1F("hESDRapidity", "ESDs rapidity distribution", 200, -4.5,-2.) ; | |
b62881f2 | 170 | Add2ESDsList(h3, kESDRapidity); |
171 | ||
172 | for (Int_t i = 0; i < AliMUONConstants::NTrackingCh(); ++i) | |
173 | { | |
174 | TH2F* h4 = new TH2F(Form("%s%d", "hESDClusterHitMap", i), | |
175 | Form("%s %d", "ESD Clusters hit distribution for chamber", i), | |
176 | 100, -1*AliMUONConstants::Rmax(i/2), AliMUONConstants::Rmax(i/2), | |
177 | 100, -1*AliMUONConstants::Rmax(i/2), AliMUONConstants::Rmax(i/2)); | |
178 | Add2ESDsList(h4, kESDClusterHitMap+i); | |
179 | } | |
04236e67 | 180 | } |
181 | ||
182 | //____________________________________________________________________________ | |
183 | void AliMUONQADataMakerRec::MakeRaws(AliRawReader* rawReader) | |
184 | { | |
185 | /// make QA for rawdata | |
186 | Int_t busPatchId; | |
187 | UShort_t manuId; | |
188 | UChar_t channelId; | |
189 | UShort_t charge; | |
190 | ||
191 | rawReader->Reset(); | |
192 | AliMUONRawStreamTracker rawStream(rawReader); | |
193 | rawStream.First(); | |
194 | while( rawStream.Next(busPatchId, manuId, channelId, charge) ) { | |
195 | ||
b62881f2 | 196 | GetRawsData(kRawBusPatch)->Fill(busPatchId); |
197 | GetRawsData(kRawCharge)->Fill(charge); | |
1c66abf3 | 198 | Int_t iDDL = rawStream.GetCurentDDL(); |
199 | GetRawsData(kRawBuspatchDDL + iDDL)->Fill(AliMpBusPatch::GetLocalBusID(busPatchId, iDDL)); | |
200 | ||
04236e67 | 201 | |
202 | } // Next digit | |
04236e67 | 203 | } |
204 | ||
205 | //____________________________________________________________________________ | |
206 | void AliMUONQADataMakerRec::MakeRecPoints(TTree* clustersTree) | |
207 | { | |
208 | ||
7035694f | 209 | /// makes data from trigger response |
210 | ||
211 | // Fired pads info | |
212 | fDigitStore->Clear(); | |
213 | ||
214 | if (!fTriggerStore) fTriggerStore = AliMUONVTriggerStore::Create(*clustersTree); | |
215 | fTriggerStore->Clear(); | |
216 | fTriggerStore->Connect(*clustersTree, false); | |
04236e67 | 217 | clustersTree->GetEvent(0); |
04236e67 | 218 | |
7035694f | 219 | AliMUONLocalTrigger* locTrg; |
220 | TIter nextLoc(fTriggerStore->CreateLocalIterator()); | |
221 | ||
222 | while ( ( locTrg = static_cast<AliMUONLocalTrigger*>(nextLoc()) ) ) | |
223 | { | |
224 | if (locTrg->IsNull()) continue; | |
225 | ||
226 | TArrayS xyPattern[2]; | |
227 | locTrg->GetXPattern(xyPattern[0]); | |
228 | locTrg->GetYPattern(xyPattern[1]); | |
229 | ||
230 | Int_t nBoard = locTrg->LoCircuit(); | |
231 | fDigitMaker->TriggerDigits(nBoard, xyPattern, *fDigitStore); | |
232 | } | |
04236e67 | 233 | |
7035694f | 234 | TIter nextDigit(fDigitStore->CreateIterator()); |
235 | AliMUONVDigit* mDigit; | |
236 | while ( ( mDigit = static_cast<AliMUONVDigit*>(nextDigit()) ) ) | |
04236e67 | 237 | { |
7035694f | 238 | Int_t detElemId = mDigit->DetElemId(); |
239 | Int_t ch = detElemId/100 - 11; | |
240 | Int_t slat = detElemId%100; | |
241 | Int_t cathode = mDigit->Cathode(); | |
242 | Int_t ix = mDigit->PadX(); | |
243 | Int_t iy = mDigit->PadY(); | |
244 | Int_t maxY = (cathode==0) ? 64 : 1; | |
245 | Int_t currPair = ix*maxY + iy; | |
b62881f2 | 246 | ERecPoints hindex |
247 | = ( cathode == 0 ) ? kTriggerDigitsBendPlane : kTriggerDigitsNonBendPlane; | |
248 | ||
249 | ((TH3F*)GetRecPointsData(hindex))->Fill(ch, slat, currPair); | |
04236e67 | 250 | } |
251 | } | |
252 | ||
253 | //____________________________________________________________________________ | |
254 | void AliMUONQADataMakerRec::MakeESDs(AliESDEvent* esd) | |
255 | { | |
256 | /// make QA data from ESDs | |
257 | ||
258 | TLorentzVector v1; | |
259 | ||
260 | Int_t nTracks = (Int_t)esd->GetNumberOfMuonTracks() ; | |
261 | GetESDsData(0)->Fill(nTracks); | |
262 | ||
263 | for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) { | |
264 | ||
265 | AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack); | |
266 | muonTrack->LorentzP(v1); | |
267 | ||
268 | GetESDsData(1)->Fill(v1.P()); | |
269 | GetESDsData(2)->Fill(v1.Pt()); | |
270 | GetESDsData(3)->Fill(v1.Rapidity()); | |
b62881f2 | 271 | |
272 | TClonesArray clusters = muonTrack->GetClusters(); | |
273 | ||
274 | for (Int_t iCluster = 0; iCluster <clusters.GetEntriesFast(); ++iCluster) { | |
275 | AliESDMuonCluster* cluster = (AliESDMuonCluster*)clusters.At(iCluster); | |
276 | GetESDsData(kESDClusterHitMap+cluster->GetChamberId()) | |
277 | ->Fill(cluster->GetX(), cluster->GetY()); | |
278 | } | |
04236e67 | 279 | } |
280 | } | |
281 | ||
282 | //____________________________________________________________________________ | |
283 | void AliMUONQADataMakerRec::StartOfDetectorCycle() | |
284 | { | |
285 | /// Detector specific actions at start of cycle | |
286 | ||
287 | } |