(After streaming write -read not all data memebers - TLinearFitter properly initialized)
(Marian Ivanov)
AliTPCFitPad.h
AliTPCCalPadRegion.h
AliTPCCalPadRegion.cxx
AliTPCFitPad.cxx
//
fObjects = new TObjArray(fgkNSegments * fgkNPadTypes);
+ fObjects->SetOwner(kTRUE);
}
AliTPCCalPadRegion::AliTPCCalPadRegion(const AliTPCCalPadRegion& obj) :
//
fObjects = new TObjArray(*(obj.fObjects));
+ fObjects->SetOwner(kTRUE);
}
AliTPCCalPadRegion& AliTPCCalPadRegion::operator=(const AliTPCCalPadRegion& rhs) {
return *this;
}
+
+void AliTPCCalPadRegion::SetObject(TObject* obj, UInt_t segment, UInt_t padType)
+{
+ if (BoundsOk("SetObject", segment, padType)){
+ if (segment+fgkNSegments*padType>fObjects->GetEntriesFast()) fObjects->Expand(2*(segment+fgkNSegments*padType));
+ fObjects->AddAt(obj, segment+fgkNSegments*padType);
+ }
+}
+
+
+
void AliTPCCalPadRegion::GetPadRegionCenterLocal(UInt_t padType, Double_t* xy) {
//
// Return the center of the pad size region in local
virtual TObject* GetObject(UInt_t segment, UInt_t padType)
{ return BoundsOk("GetObject", segment, padType) ? fObjects->At(segment+fgkNSegments*padType) : 0x0; }
- virtual void SetObject(TObject* obj, UInt_t segment, UInt_t padType)
- { if (BoundsOk("SetObject", segment, padType)) fObjects->AddAt(obj, segment+fgkNSegments*padType); }
+ virtual void SetObject(TObject* obj, UInt_t segment, UInt_t padType);
virtual void Delete(Option_t* option = "") { if (fObjects) fObjects->Delete(option); }
virtual TIterator* MakeIterator(Bool_t direction = kIterForward) const { return fObjects->MakeIterator(direction); }
static UInt_t GetNSegments() { return fgkNSegments; }
//
TLinearFitter* fitter = GetFitterSimple(segment, padType);
- if (fitter == 0) {
- SetObject(new TLinearFitter(fNdim, fFormula, fOpt), segment, padType);
- fitter = (TLinearFitter*)(GetObject(segment, padType));
- if (workaround) {
- Double_t x[1000];
- for (Int_t i = 0; i < fNdim; i++) x[i] = 3.141592;
- fitter->AddPoint(x, 31.41592);
- fitter->ClearPoints();
- //cout << "workaround called for " << segment << ", " << padType << endl;
- }
+ if (fitter == 0 || fitter->GetNumberTotalParameters() !=fNdim) {
+ fitter = new TLinearFitter(fNdim, fFormula, fOpt);
+ SetObject(fitter, segment, padType);
+ fitter = (TLinearFitter*)(GetObject(segment, padType));
+ if (workaround) {
+ Double_t x[1000];
+ for (Int_t i = 0; i < fNdim; i++) x[i] = 3.141592;
+ fitter->AddPoint(x, 31.41592);
+ fitter->ClearPoints();
+ //cout << "workaround called for " << segment << ", " << padType << endl;
+ }
}
return fitter;
}
class AliTPCFitPad: public AliTPCCalPadRegion {
public:
AliTPCFitPad() : AliTPCCalPadRegion(), fNdim(0), fFormula(0), fOpt(0) {}
- AliTPCFitPad(const AliTPCFitPad& obj) : AliTPCCalPadRegion(obj), fNdim(obj.fNdim), fFormula(obj.fFormula), fOpt(obj.fOpt) { }
+ AliTPCFitPad(const AliTPCFitPad& obj);
AliTPCFitPad(Int_t ndim, const char* formula, Option_t* opt = "D");
AliTPCFitPad& operator=(const AliTPCFitPad& rhs);
virtual ~AliTPCFitPad();
TLinearFitter* GetFitterSimple(UInt_t segment, UInt_t padType);
Int_t Evaluate(Bool_t robust = kFALSE, Double_t frac = -1.);
-protected:
+public:
Int_t fNdim; // used for generating new TLinearFitter objects
TString fFormula; // used for generating new TLinearFitter objects
TString fOpt; // used for generating new TLinearFitter objects