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)
33 if (&o == this) return *this;
35 oldDetector = o.oldDetector;
37 oldSector = o.oldSector;
38 oldStrip = o.oldStrip;
39 startStrip = o.startStrip;
47 //____________________________________________________________________
48 AliFMDMCTrackDensity::AliFMDMCTrackDensity()
49 : AliBaseMCTrackDensity(),
51 fMaxConsequtiveStrips(3),
58 // Default constructor
61 //____________________________________________________________________
62 AliFMDMCTrackDensity::AliFMDMCTrackDensity(const char*)
63 : AliBaseMCTrackDensity("fmdMCTrackDensity"),
65 fMaxConsequtiveStrips(3),
72 // Normal constructor constructor
75 //____________________________________________________________________
76 AliFMDMCTrackDensity::AliFMDMCTrackDensity(const AliFMDMCTrackDensity& o)
77 : AliBaseMCTrackDensity(o),
79 fMaxConsequtiveStrips(o.fMaxConsequtiveStrips),
86 // Normal constructor constructor
89 //____________________________________________________________________
91 AliFMDMCTrackDensity::operator=(const AliFMDMCTrackDensity& o)
93 // Assignment operator
94 if (&o == this) return *this;
95 AliBaseMCTrackDensity::operator=(o);
96 fMaxConsequtiveStrips = o.fMaxConsequtiveStrips;
107 //____________________________________________________________________
109 AliFMDMCTrackDensity::DefineOutput(TList* l)
111 AliBaseMCTrackDensity::DefineOutput(l);
112 TList* ll = static_cast<TList*>(l->FindObject(GetTitle()));
115 fNr = new TH1D("clusterRefs", "# track references per cluster",
117 fNr->SetXTitle("# of track references/cluster");
118 fNr->SetFillColor(kRed+1);
119 fNr->SetFillStyle(3001);
120 fNr->SetDirectory(0);
123 fNt = new TH1D("clusterSize", "cluster length in strips", 21, -.5, 20.5);
124 fNt->SetXTitle("Cluster size [strips]");
125 fNt->SetFillColor(kBlue+1);
126 fNt->SetFillStyle(3001);
127 fNt->SetDirectory(0);
130 fNc = new TH1D("nClusters", "# clusters per track", 21, -.5, 20.5);
131 fNc->SetXTitle("# clusters");
132 fNc->SetFillColor(kGreen+1);
133 fNc->SetFillStyle(3001);
134 fNc->SetDirectory(0);
137 fNcr = new TH2D("clusterVsRefs", "# clusters vs. # refs",
138 21, -.5, 20.5, 21, -.5, 20.5);
139 fNcr->SetXTitle("# References");
140 fNcr->SetYTitle("# Clusters");
141 fNcr->SetOption("COLZ");
142 fNcr->SetDirectory(0);
147 //____________________________________________________________________
149 AliFMDMCTrackDensity::GetDetectorId() const
151 return AliTrackReference::kFMD;
154 //____________________________________________________________________
156 AliFMDMCTrackDensity::BeginTrackRefs()
161 //____________________________________________________________________
163 AliFMDMCTrackDensity::EndTrackRefs(Int_t nRefs)
165 fNc->Fill(fState.count);
166 fNcr->Fill(nRefs, fState.count);
170 //____________________________________________________________________
172 AliFMDMCTrackDensity::ProcessRef(AliMCParticle* particle,
173 const AliMCParticle* mother,
174 AliTrackReference* ref)
176 // Get the detector coordinates
179 AliFMDStripIndex::Unpack(ref->UserId(), d, r, s, t);
181 // Calculate distance of previous reference to base of cluster
182 UShort_t nT = TMath::Abs(t - fState.startStrip) + 1;
184 // Now check if we should flush to output
187 // If this is a new detector/ring, then reset the other one
188 // Check if we have a valid old detectorm ring, and sector
189 if (fState.oldDetector > 0 &&
190 fState.oldRing != '\0' &&
191 fState.oldSector != 1024) {
192 // New detector, new ring, or new sector
193 if (d != fState.oldDetector ||
194 r != fState.oldRing ||
195 s != fState.oldSector) {
196 if (fDebug) Info("Process", "New because new sector");
199 else if (nT > fMaxConsequtiveStrips) {
200 if (fDebug) Info("Process", "New because too long: %d (%d,%d,%d)",
201 fState.nStrips, t, fState.oldStrip, fState.startStrip);
207 Info("Process", "I=%p L=%p D=%d (was %d), R=%c (was %c), "
208 "S=%2d (was %2d) t=%3d (was %3d) nT=%3d/%4d",
210 d, fState.oldDetector,
214 fState.nStrips, fMaxConsequtiveStrips);
215 // Int_t nnT = TMath::Abs(fState.oldStrip - fState.startStrip) + 1;
216 StoreParticle(particle, mother, fState.longest);
220 // If base of cluster not set, set it here.
221 if (fState.startStrip == 1024) fState.startStrip = t;
223 // Calculate distance of previous reference to base of cluster
224 fState.nStrips = TMath::Abs(t - fState.startStrip) + 1;
226 // Count number of track refs in this sector
229 fState.oldDetector = d;
231 fState.oldSector = s;
236 if (t == fState.startStrip)
237 Info("Process", "New cluster starting at FMD%d%c[%2d,%3d]",
240 Info("Process", "Adding to cluster starting at FMD%d%c[%2d,%3d], "
241 "length=%3d (now in %3d, previous %3d)",
242 d, r, s, fState.startStrip, fState.nStrips, t, fState.oldStrip);
245 // The longest passage is determined through the angle
246 Double_t ang = GetTrackRefTheta(ref);
247 if (ang > fState.angle) {
248 fState.longest = ref;
252 return fState.longest;
255 //____________________________________________________________________
257 AliFMDMCTrackDensity::StoreParticle(AliMCParticle* particle,
258 const AliMCParticle* mother,
259 AliTrackReference* ref) const
262 AliBaseMCTrackDensity::StoreParticle(particle, mother, ref);
263 if (w <= 0) return w;
265 // Get the detector coordinates
268 AliFMDStripIndex::Unpack(ref->UserId(), d, r, s, t);
270 // Check if we have value already
271 Double_t old = fOutput->Multiplicity(d,r,s,t);
273 // If invalid, force it valid
274 if (old == AliESDFMD::kInvalidMult) old = 0;
277 fOutput->SetMultiplicity(d,r,s,t,old+w);
280 fNr->Fill(fState.nRefs);
281 fNt->Fill(fState.nStrips);
288 //____________________________________________________________________
290 AliFMDMCTrackDensity::Calculate(const AliESDFMD& input,
291 const AliMCEvent& event,
297 // Filter the input kinematics and track references, using
298 // some of the ESD information
301 // input Input ESD event
302 // event Input MC event
303 // vz Vertex position
304 // output Output ESD-like object
305 // primary Per-event histogram of primaries
308 // True on succes, false otherwise
313 // Copy eta values to output
314 for (UShort_t ed = 1; ed <= 3; ed++) {
315 UShort_t nq = (ed == 1 ? 1 : 2);
316 for (UShort_t eq = 0; eq < nq; eq++) {
317 Char_t er = (eq == 0 ? 'I' : 'O');
318 UShort_t ns = (eq == 0 ? 20 : 40);
319 UShort_t nt = (eq == 0 ? 512 : 256);
320 for (UShort_t es = 0; es < ns; es++)
321 for (UShort_t et = 0; et < nt; et++)
322 output.SetEta(ed, er, es, et, input.Eta(ed, er, es, et));
326 return ProcessTracks(event, vz, primary);
328 //____________________________________________________________________
330 AliFMDMCTrackDensity::Print(Option_t* option) const
332 AliBaseMCTrackDensity::Print(option);
333 char ind[gROOT->GetDirLevel()+1];
334 for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
335 ind[gROOT->GetDirLevel()] = '\0';
336 std::cout << ind << " Max cluster size: " << fMaxConsequtiveStrips
341 //____________________________________________________________________