// s.SetSignal(-1002,3);
// m.AddHit(s);
//
-// TObjArray ordered=m.SortHits("TOT");
-// nhits=ordered.GetEntries();
+// TObjArray* ordered=m.SortHits("TOT");
+// nhits=ordered->GetEntries();
// for (Int_t i=0; i<nhits; i++)
// {
-// AliSignal* sx=(AliSignal*)ordered.At(i);
+// AliSignal* sx=(AliSignal*)ordered->At(i);
// if (sx) sx->Data();
// }
//
AliDevice::AliDevice() : AliSignal()
{
// Default constructor.
- fHitCopy=0;
+// By default private copies of the recorded hits will be made.
+// This implies that by default the device will own the registered hits.
+// See the SetHitCopy() memberfunction for further details.
+ fHitCopy=1;
fHits=0;
+ fOrdered=0;
}
///////////////////////////////////////////////////////////////////////////
AliDevice::~AliDevice()
delete fHits;
fHits=0;
}
+
+ if (fOrdered)
+ {
+ delete fOrdered;
+ fOrdered=0;
+ }
}
///////////////////////////////////////////////////////////////////////////
AliDevice::AliDevice(const AliDevice& dev) : AliSignal(dev)
{
// Copy constructor.
+
+ fHits=0;
+ fOrdered=0;
+
fHitCopy=dev.GetHitCopy();
+
Int_t nhits=dev.GetNhits();
if (nhits)
{
if (fHitCopy) delete test;
}
}
+ if (fOrdered)
+ {
+ AliSignal* test=(AliSignal*)fOrdered->Remove(&s);
+ if (test) fOrdered->Compress();
+ }
}
///////////////////////////////////////////////////////////////////////////
void AliDevice::RemoveHits()
delete fHits;
fHits=0;
}
+ if (fOrdered)
+ {
+ delete fOrdered;
+ fOrdered=0;
+ }
}
///////////////////////////////////////////////////////////////////////////
Int_t AliDevice::GetNhits() const
}
}
///////////////////////////////////////////////////////////////////////////
-TObjArray AliDevice::SortHits(Int_t idx,Int_t mode,TObjArray* hits) const
+TObjArray* AliDevice::SortHits(Int_t idx,Int_t mode,TObjArray* hits)
{
// Order the references to an array of hits by looping over the input array "hits"
// and checking the signal value. The ordered array is returned as a TObjArray.
// Signals which were declared as "Dead" will be rejected.
// The gain etc... corrected signals will be used in the ordering process.
- TObjArray ordered;
+ if (fOrdered)
+ {
+ delete fOrdered;
+ fOrdered=0;
+ }
if (!hits) hits=fHits;
- if (idx<=0 || abs(mode)!=1 || !hits) return ordered;
+ if (idx<=0 || abs(mode)!=1 || !hits) return fOrdered;
Int_t nhits=hits->GetEntries();
if (!nhits)
{
- return ordered;
+ return fOrdered;
}
else
{
- ordered.Expand(nhits);
+ fOrdered=new TObjArray(nhits);
}
Int_t nord=0;
if (nord == 0) // store the first hit with a signal at the first ordered position
{
nord++;
- ordered.AddAt(s,nord-1);
+ fOrdered->AddAt(s,nord-1);
continue;
}
if (j == nord) // module has smallest (mode=-1) or largest (mode=1) signal seen so far
{
nord++;
- ordered.AddAt(s,j); // add hit at the end
+ fOrdered->AddAt(s,j); // add hit at the end
break; // go for next hit
}
- if (mode==-1 && s->GetSignal(idx,1) < ((AliSignal*)ordered.At(j))->GetSignal(idx,1)) continue;
- if (mode==1 && s->GetSignal(idx,1) > ((AliSignal*)ordered.At(j))->GetSignal(idx,1)) continue;
+ if (mode==-1 && s->GetSignal(idx,1) < ((AliSignal*)fOrdered->At(j))->GetSignal(idx,1)) continue;
+ if (mode==1 && s->GetSignal(idx,1) > ((AliSignal*)fOrdered->At(j))->GetSignal(idx,1)) continue;
nord++;
for (Int_t k=nord-1; k>j; k--) // create empty position
{
- ordered.AddAt(ordered.At(k-1),k);
+ fOrdered->AddAt(fOrdered->At(k-1),k);
}
- ordered.AddAt(s,j); // put hit at empty position
+ fOrdered->AddAt(s,j); // put hit at empty position
break; // go for next matrix module
}
}
- return ordered;
+ return fOrdered;
}
///////////////////////////////////////////////////////////////////////////
-TObjArray AliDevice::SortHits(TString name,Int_t mode,TObjArray* hits) const
+TObjArray* AliDevice::SortHits(TString name,Int_t mode,TObjArray* hits)
{
// Order the references to an array of hits by looping over the input array "hits"
// and checking the signal value. The ordered array is returned as a TObjArray.
// Signals which were declared as "Dead" will be rejected.
// The gain etc... corrected signals will be used in the ordering process.
- TObjArray ordered;
+ if (fOrdered)
+ {
+ delete fOrdered;
+ fOrdered=0;
+ }
if (!hits) hits=fHits;
- if (abs(mode)!=1 || !hits) return ordered;
+ if (abs(mode)!=1 || !hits) return fOrdered;
Int_t nhits=hits->GetEntries();
if (!nhits)
{
- return ordered;
+ return fOrdered;
}
else
{
- ordered.Expand(nhits);
+ fOrdered=new TObjArray(nhits);
}
Int_t idx=0; // The signal slotindex to perform the sorting on
if (nord == 0) // store the first hit with a signal at the first ordered position
{
nord++;
- ordered.AddAt(s,nord-1);
+ fOrdered->AddAt(s,nord-1);
continue;
}
if (j == nord) // module has smallest (mode=-1) or largest (mode=1) signal seen so far
{
nord++;
- ordered.AddAt(s,j); // add hit at the end
+ fOrdered->AddAt(s,j); // add hit at the end
break; // go for next hit
}
- if (mode==-1 && s->GetSignal(idx,1) < ((AliSignal*)ordered.At(j))->GetSignal(idx,1)) continue;
- if (mode==1 && s->GetSignal(idx,1) > ((AliSignal*)ordered.At(j))->GetSignal(idx,1)) continue;
+ if (mode==-1 && s->GetSignal(idx,1) < ((AliSignal*)fOrdered->At(j))->GetSignal(idx,1)) continue;
+ if (mode==1 && s->GetSignal(idx,1) > ((AliSignal*)fOrdered->At(j))->GetSignal(idx,1)) continue;
nord++;
for (Int_t k=nord-1; k>j; k--) // create empty position
{
- ordered.AddAt(ordered.At(k-1),k);
+ fOrdered->AddAt(fOrdered->At(k-1),k);
}
- ordered.AddAt(s,j); // put hit at empty position
+ fOrdered->AddAt(s,j); // put hit at empty position
break; // go for next matrix module
}
}
- return ordered;
+ return fOrdered;
}
///////////////////////////////////////////////////////////////////////////
TObject* AliDevice::Clone(const char* name) const