1 #include "AliFMDMCTrackDensity.h"
3 #include <AliTrackReference.h>
5 #include "AliFMDStripIndex.h"
13 //____________________________________________________________________
15 AliFMDMCTrackDensity::State::Clear(Bool_t alsoCount)
26 if (alsoCount) count = 0;
29 //____________________________________________________________________
30 AliFMDMCTrackDensity::State&
31 AliFMDMCTrackDensity::State::operator=(const State& o)
34 oldDetector = o.oldDetector;
36 oldSector = o.oldSector;
37 oldStrip = o.oldStrip;
38 startStrip = o.startStrip;
46 //____________________________________________________________________
47 AliFMDMCTrackDensity::AliFMDMCTrackDensity()
48 : AliBaseMCTrackDensity(),
50 fMaxConsequtiveStrips(3),
57 // Default constructor
60 //____________________________________________________________________
61 AliFMDMCTrackDensity::AliFMDMCTrackDensity(const char*)
62 : AliBaseMCTrackDensity("fmdMCTrackDensity"),
64 fMaxConsequtiveStrips(3),
71 // Normal constructor constructor
74 //____________________________________________________________________
75 AliFMDMCTrackDensity::AliFMDMCTrackDensity(const AliFMDMCTrackDensity& o)
76 : AliBaseMCTrackDensity(o),
78 fMaxConsequtiveStrips(o.fMaxConsequtiveStrips),
85 // Normal constructor constructor
88 //____________________________________________________________________
90 AliFMDMCTrackDensity::operator=(const AliFMDMCTrackDensity& o)
92 // Assignment operator
93 if (&o == this) return *this;
94 AliBaseMCTrackDensity::operator=(o);
95 fMaxConsequtiveStrips = o.fMaxConsequtiveStrips;
106 //____________________________________________________________________
108 AliFMDMCTrackDensity::DefineOutput(TList* l)
110 AliBaseMCTrackDensity::DefineOutput(l);
111 TList* ll = static_cast<TList*>(l->FindObject(GetTitle()));
114 fNr = new TH1D("clusterRefs", "# track references per cluster",
116 fNr->SetXTitle("# of track references/cluster");
117 fNr->SetFillColor(kRed+1);
118 fNr->SetFillStyle(3001);
119 fNr->SetDirectory(0);
122 fNt = new TH1D("clusterSize", "cluster length in strips", 21, -.5, 20.5);
123 fNt->SetXTitle("Cluster size [strips]");
124 fNt->SetFillColor(kBlue+1);
125 fNt->SetFillStyle(3001);
126 fNt->SetDirectory(0);
129 fNc = new TH1D("nClusters", "# clusters per track", 21, -.5, 20.5);
130 fNc->SetXTitle("# clusters");
131 fNc->SetFillColor(kGreen+1);
132 fNc->SetFillStyle(3001);
133 fNc->SetDirectory(0);
136 fNcr = new TH2D("clusterVsRefs", "# clusters vs. # refs",
137 21, -.5, 20.5, 21, -.5, 20.5);
138 fNcr->SetXTitle("# References");
139 fNcr->SetYTitle("# Clusters");
140 fNcr->SetOption("COLZ");
141 fNcr->SetDirectory(0);
146 //____________________________________________________________________
148 AliFMDMCTrackDensity::GetDetectorId() const
150 return AliTrackReference::kFMD;
153 //____________________________________________________________________
155 AliFMDMCTrackDensity::BeginTrackRefs()
160 //____________________________________________________________________
162 AliFMDMCTrackDensity::EndTrackRefs(Int_t nRefs)
164 fNc->Fill(fState.count);
165 fNcr->Fill(nRefs, fState.count);
169 //____________________________________________________________________
171 AliFMDMCTrackDensity::ProcessRef(AliMCParticle* particle,
172 const AliMCParticle* mother,
173 AliTrackReference* ref)
175 // Get the detector coordinates
178 AliFMDStripIndex::Unpack(ref->UserId(), d, r, s, t);
180 // Calculate distance of previous reference to base of cluster
181 UShort_t nT = TMath::Abs(t - fState.startStrip) + 1;
183 // Now check if we should flush to output
186 // If this is a new detector/ring, then reset the other one
187 // Check if we have a valid old detectorm ring, and sector
188 if (fState.oldDetector > 0 &&
189 fState.oldRing != '\0' &&
190 fState.oldSector != 1024) {
191 // New detector, new ring, or new sector
192 if (d != fState.oldDetector ||
193 r != fState.oldRing ||
194 s != fState.oldSector) {
195 if (fDebug) Info("Process", "New because new sector");
198 else if (nT > fMaxConsequtiveStrips) {
199 if (fDebug) Info("Process", "New because too long: %d (%d,%d,%d)",
200 fState.nStrips, t, fState.oldStrip, fState.startStrip);
206 Info("Process", "I=%p L=%p D=%d (was %d), R=%c (was %c), "
207 "S=%2d (was %2d) t=%3d (was %3d) nT=%3d/%4d",
209 d, fState.oldDetector,
213 fState.nStrips, fMaxConsequtiveStrips);
214 // Int_t nnT = TMath::Abs(fState.oldStrip - fState.startStrip) + 1;
215 StoreParticle(particle, mother, fState.longest);
219 // If base of cluster not set, set it here.
220 if (fState.startStrip == 1024) fState.startStrip = t;
222 // Calculate distance of previous reference to base of cluster
223 fState.nStrips = TMath::Abs(t - fState.startStrip) + 1;
225 // Count number of track refs in this sector
228 fState.oldDetector = d;
230 fState.oldSector = s;
235 if (t == fState.startStrip)
236 Info("Process", "New cluster starting at FMD%d%c[%2d,%3d]",
239 Info("Process", "Adding to cluster starting at FMD%d%c[%2d,%3d], "
240 "length=%3d (now in %3d, previous %3d)",
241 d, r, s, fState.startStrip, fState.nStrips, t, fState.oldStrip);
244 // The longest passage is determined through the angle
245 Double_t ang = GetTrackRefTheta(ref);
246 if (ang > fState.angle) {
247 fState.longest = ref;
251 return fState.longest;
254 //____________________________________________________________________
256 AliFMDMCTrackDensity::StoreParticle(AliMCParticle* particle,
257 const AliMCParticle* mother,
258 AliTrackReference* ref) const
261 AliBaseMCTrackDensity::StoreParticle(particle, mother, ref);
262 if (w <= 0) return w;
264 // Get the detector coordinates
267 AliFMDStripIndex::Unpack(ref->UserId(), d, r, s, t);
269 // Check if we have value already
270 Double_t old = fOutput->Multiplicity(d,r,s,t);
272 // If invalid, force it valid
273 if (old == AliESDFMD::kInvalidMult) old = 0;
276 fOutput->SetMultiplicity(d,r,s,t,old+w);
279 fNr->Fill(fState.nRefs);
280 fNt->Fill(fState.nStrips);
287 //____________________________________________________________________
289 AliFMDMCTrackDensity::Calculate(const AliESDFMD& input,
290 const AliMCEvent& event,
296 // Filter the input kinematics and track references, using
297 // some of the ESD information
300 // input Input ESD event
301 // event Input MC event
302 // vz Vertex position
303 // output Output ESD-like object
304 // primary Per-event histogram of primaries
307 // True on succes, false otherwise
312 // Copy eta values to output
313 for (UShort_t ed = 1; ed <= 3; ed++) {
314 UShort_t nq = (ed == 1 ? 1 : 2);
315 for (UShort_t eq = 0; eq < nq; eq++) {
316 Char_t er = (eq == 0 ? 'I' : 'O');
317 UShort_t ns = (eq == 0 ? 20 : 40);
318 UShort_t nt = (eq == 0 ? 512 : 256);
319 for (UShort_t es = 0; es < ns; es++)
320 for (UShort_t et = 0; et < nt; et++)
321 output.SetEta(ed, er, es, et, input.Eta(ed, er, es, et));
325 return ProcessTracks(event, vz, primary);
327 //____________________________________________________________________
329 AliFMDMCTrackDensity::Print(Option_t* option) const
331 AliBaseMCTrackDensity::Print(option);
332 char ind[gROOT->GetDirLevel()+1];
333 for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
334 ind[gROOT->GetDirLevel()] = '\0';
335 std::cout << ind << " Max cluster size: " << fMaxConsequtiveStrips
340 //____________________________________________________________________