Posible memory leak fixed. Changes AliITSpList destructor. Not clear if
[u/mrichter/AliRoot.git] / ITS / AliITSpList.cxx
index f9df5ee..8a79db9 100644 (file)
@@ -30,6 +30,12 @@ ClassImp(AliITSpList);
 //______________________________________________________________________
 AliITSpList::AliITSpList(){
     // Default constructor
+    // Inputs:
+    //    none.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A zeroed/empty AliITSpList class.
 
     fNi = 0;
     fNj = 0;
@@ -38,93 +44,180 @@ AliITSpList::AliITSpList(){
 //______________________________________________________________________
 AliITSpList::AliITSpList(Int_t imax,Int_t jmax){
     // Standard constructor
+    // Inputs:
+    //    none.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A setup AliITSpList class.
 
     fNi = imax;
     fNj = jmax;
+    fEnteries = 0;
     fa  = new TObjArray(fNi*fNj); // elements are zeroed by 
                                   // TObjArray creator
 }
 //______________________________________________________________________
 AliITSpList::~AliITSpList(){
     // Default destructor
+    // Inputs:
+    //    none.
+    // Outputs:
+    //    none.
+    // Return:
+    //    a properly destroyed class
 
     for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
-       delete fa->At(i);
-       fa->AddAt(0,i); // zero content
+        delete fa->At(i);
+        fa->AddAt(0,i); // zero content
     } // end for i && if
     fNi = 0;
     fNj = 0;
     delete fa;
     fa  = 0;
+    fEnteries = 0;
 }
 //______________________________________________________________________
 void AliITSpList::ClearMap(){
     // Delete all AliITSpListItems and zero TObjArray.
-
+    // Inputs:
+    //    none.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A zeroed AliITSpList class.
+
+    fa->Delete();
+    /*
     for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
-       delete fa->At(i);
-       fa->AddAt(0,i); // zero content
+        delete fa->At(i);
+        fa->AddAt(0,i); // zero content
     } // end for i && if
+    */
+    fEnteries = 0;
 }
 //______________________________________________________________________
 void AliITSpList::DeleteHit(Int_t i,Int_t j){
     // Delete a particular AliITSpListItems and zero TObjArray.
+    // Inputs:
+    //    Int_t i   Row number
+    //    Int_t j   Columns number
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
     Int_t k = GetIndex(i,j);
 
     if(fa->At(k)!=0){
-       delete fa->At(k);
-       fa->AddAt(0,k); // zero content
+        delete fa->At(k);
+        fa->AddAt(0,k); // zero content
     } // end for i && if
+    if(k==fEnteries-1) fEnteries--;
 }
 //______________________________________________________________________
 AliITSpList& AliITSpList::operator=(const AliITSpList &source){
     // = operator
+    // Inputs:
+    //    const AliITSpList &source    A AliITSpList object.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A copied AliITSpList object.
 
     if(this == &source) return *this;
 
     if(this->fa!=0){ // if this->fa exists delete it first.
-       for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
-           delete fa->At(i);
-           fa->AddAt(0,i); // zero content
-       } // end for i && if
-       delete this->fa;
+        for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
+            delete fa->At(i);
+            fa->AddAt(0,i); // zero content
+        } // end for i && if
+        delete this->fa;
     } // end if this->fa!=0
     this->fNi = source.fNi;
     this->fNj = source.fNj;
     this->fa = new TObjArray(*(source.fa));
+    this->fEnteries = source.fEnteries;
 
     return *this;
 }
 //______________________________________________________________________
 AliITSpList::AliITSpList(AliITSpList &source){
     // Copy operator
+    // Inputs:
+    //    AliITSpList &source   A AliITSpList Object
+    // Outputs:
+    //    none.
+    // Return:
+    //    A copied AliITSpList object
 
     *this = source;
 }
 //______________________________________________________________________
+void AliITSpList::AddItemTo(Int_t fileIndex, AliITSpListItem *pl) {
+    // Adds the contents of pl to the list with track number off set given by
+    // fileIndex.
+    // Creates the AliITSpListItem if needed.
+    // Inputs:
+    //    Int_t fileIndex      track number offset value
+    //    AliITSpListItem *pl  an AliITSpListItem to be added to this class.
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
+    Int_t index = pl->GetIndex();
+
+    if( fa->At( index ) == 0 ) { // most create AliITSpListItem
+        fa->AddAt(new AliITSpListItem(-2,-1,pl->GetModule(),index,0.0),index);
+    } // end if
+    ((AliITSpListItem*)(fa->At(index)))->AddTo( fileIndex,pl);
+    if(index>=fEnteries) fEnteries = index +1;
+}
+//______________________________________________________________________
 void AliITSpList::AddSignal(Int_t i,Int_t j,Int_t trk,Int_t ht,Int_t mod,
-                      Double_t signal){
+                       Double_t signal){
     // Adds a Signal value to the TObjArray at i,j. Creates the AliITSpListItem
     // if needed.
-
-    if(GetpListItem(i,j)==0){ // most create AliITSpListItem
-       fa->AddAt(new AliITSpListItem(trk,ht,mod,GetIndex(i,j),signal),
-                 GetIndex(i,j));
+    // Inputs:
+    //    Int_t i         Row number for this signal
+    //    Int_t j         Column number for this signal
+    //    Int_t trk       Track number creating this signal
+    //    Int_t ht        Hit number creating this signal
+    //    Int_t mod       The module where this signal is in
+    //    Double_t signal The signal (ionization)
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
+    Int_t index = GetIndex(i,j);
+
+    if(GetpListItem(index)==0){ // most create AliITSpListItem
+        fa->AddAt(new AliITSpListItem(trk,ht,mod,index,signal),index);
     }else{ // AliITSpListItem exists, just add signal to it.
-       GetpListItem(i,j)->AddSignal(trk,ht,mod,GetIndex(i,j),signal);
+        GetpListItem(index)->AddSignal(trk,ht,mod,index,signal);
     } // end if
+    if(index>=fEnteries) fEnteries = index +1;
 }
 //______________________________________________________________________
 void AliITSpList::AddNoise(Int_t i,Int_t j,Int_t mod,Double_t noise){
     // Adds a noise value to the TObjArray at i,j. Creates the AliITSpListItem
     // if needed.
-
-    if(GetpListItem(i,j)==0){ // most create AliITSpListItem
-       fa->AddAt(new AliITSpListItem(mod,GetIndex(i,j),noise),
-                 GetIndex(i,j));
+    // Inputs:
+    //    Int_t i        Row number for this noise
+    //    Int_t j        Column number for this noise
+    //    Double_t noise The noise signal value.
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
+    Int_t index = GetIndex(i,j);
+
+    if(GetpListItem(index)==0){ // most create AliITSpListItem
+        fa->AddAt(new AliITSpListItem(mod,index,noise),index);
     }else{ // AliITSpListItem exists, just add signal to it.
-       GetpListItem(i,j)->AddNoise(mod,GetIndex(i,j),noise);
+        GetpListItem(index)->AddNoise(mod,index,noise);
     } // end if
+    if(index>=fEnteries) fEnteries = index +1;
 }
 //______________________________________________________________________
 
@@ -132,35 +225,61 @@ ClassImp(AliITSpListItem)
 //______________________________________________________________________
 AliITSpListItem::AliITSpListItem(){
     // Default constructor
+    // Inputs:
+    //    none.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A zeroed/empty AliITSpListItem class.
 
     fmodule = -1;
     findex  = -1;
     for(Int_t i=0;i<this->fkSize;i++){
-       this->fTrack[i]  = -2;
-       this->fHits[i]   = -2;
-       this->fSignal[i] = 0.0;
+        this->fTrack[i]  = -2;
+        this->fHits[i]   = -1;
+        this->fSignal[i] = 0.0;
     } // end if i
     fTsignal = 0.0;
     fNoise   = 0.0;
+    fSignalAfterElect = 0.0;
 }
 //______________________________________________________________________
 AliITSpListItem::AliITSpListItem(Int_t module,Int_t index,Double_t noise){
     // Standard noise constructor
+    // Inputs:
+    //    Int_t module   The module where this noise occurred
+    //    Int_t index    The cell index where this noise occurred
+    //    Double_t noise The value of the noise.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A setup and noise filled AliITSpListItem class.
 
     this->fmodule    = module;
     this->findex     = index;
     for(Int_t i=0;i<this->fkSize;i++){
-       this->fTrack[i]  = -2;
-       this->fSignal[i] = 0.0;
-       this->fHits[i]   = 0;
+        this->fTrack[i]  = -2;
+        this->fSignal[i] = 0.0;
+        this->fHits[i]   = -1;
     } // end if i
     this->fTsignal = 0.0;
+    this->fSignalAfterElect = 0.0;
     this->fNoise   = noise;
 }
 //______________________________________________________________________
 AliITSpListItem::AliITSpListItem(Int_t track,Int_t hit,Int_t module,
-                              Int_t index,Double_t signal){
+                               Int_t index,Double_t signal){
     // Standard signal constructor
+    // Inputs:
+    //    Int_t track     The track number which produced this signal
+    //    Int_t hit       The hit number which produced this signal
+    //    Int_t module    The module where this signal occurred
+    //    Int_t index     The cell index where this signal occurred
+    //    Double_t signal The value of the signal (ionization)
+    // Outputs:
+    //    none.
+    // Return:
+    //    A setup and signal filled  AliITSpListItem class.
 
     this->fmodule    = module;
     this->findex     = index;
@@ -168,100 +287,125 @@ AliITSpListItem::AliITSpListItem(Int_t track,Int_t hit,Int_t module,
     this->fHits[0]   = hit;
     this->fSignal[0] = signal;
     for(Int_t i=1;i<this->fkSize;i++){
-       this->fTrack[i]  = -2;
-       this->fSignal[i] = 0.0;
-       this->fHits[i]   = 0;
+        this->fTrack[i]  = -2;
+        this->fSignal[i] = 0.0;
+        this->fHits[i]   = -1;
     } // end if i
     this->fTsignal = signal;
     this->fNoise   = 0.0;
+    this->fSignalAfterElect   = 0.0;
 }
 //______________________________________________________________________
 AliITSpListItem::~AliITSpListItem(){
-    // Denstructor
-
-    this->fmodule = 0;
-    this->findex  =0;
-    for(Int_t i=0;i<=this->GetNsignals();i++){
-       this->fTrack[i]  = 0;
-       this->fSignal[i] = 0.0;
-       this->fHits[i]   = 0;
-    } // end if i
-    this->fTsignal = 0.0;
-    this->fNoise   =0.0;
+    // Destructor
+    // Inputs:
+    //    none.
+    // Outputs:
+    //    none.
+    // Return:
+    //    A properly destroyed AliITSpListItem class.
+
+    if(!fTrack)  delete [] fTrack;
+    if(!fHits)   delete [] fHits;
+    if(!fSignal) delete [] fSignal;
 }
 //______________________________________________________________________
 AliITSpListItem& AliITSpListItem::operator=(const AliITSpListItem &source){
     // = operator
+    // Inputs:
+    //    AliITSpListItem &source   A AliITSpListItem Object
+    // Outputs:
+    //    none.
+    // Return:
+    //    A copied AliITSpListItem object
 
     if(this == &source) return *this;
 
     this->fmodule = source.fmodule;
     this->findex  = source.findex;
     for(Int_t i=0;i<this->fkSize;i++){
-       this->fTrack[i]  = source.fTrack[i];
-       this->fSignal[i] = source.fSignal[i];
-       this->fHits[i]   = source.fHits[i];
+        this->fTrack[i]  = source.fTrack[i];
+        this->fSignal[i] = source.fSignal[i];
+        this->fHits[i]   = source.fHits[i];
     } // end if i
     this->fTsignal = source.fTsignal;
     this->fNoise   = source.fNoise;
+    this->fSignalAfterElect   = source.fSignalAfterElect;
 
     return *this;
 }
 //______________________________________________________________________
 AliITSpListItem::AliITSpListItem(AliITSpListItem &source){
     // Copy operator
+    // Inputs:
+    //    AliITSpListItem &source   A AliITSpListItem Object
+    // Outputs:
+    //    none.
+    // Return:
+    //    A copied AliITSpListItem object
 
     *this = source;
 }
 //______________________________________________________________________
 void AliITSpListItem::AddSignal(Int_t track,Int_t hit,Int_t module,
-                              Int_t index,Double_t signal){
-    // Adds this track number and sinal to the pList and orders them
+                               Int_t index,Double_t signal){
+    // Adds this track number and signal to the pList and orders them
+    // Inputs:
+    //    Int_t track     The track number which produced this signal
+    //    Int_t hit       The hit number which produced this signal
+    //    Int_t module    The module where this signal occurred
+    //    Int_t index     The cell index where this signal occurred
+    //    Double_t signal The value of the signal (ionization)
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
     Int_t    i,j,trk,hts;
     Double_t sig;
     Bool_t   flg=kFALSE;
 
     if(findex!=index || fmodule!=module) 
-       Warning("AddSignal","index=%d != findex=%d or module=%d != fmodule=%d",
-           index,findex,module,fmodule);
+        Warning("AddSignal","index=%d != findex=%d or module=%d != fmodule=%d",
+                 index,findex,module,fmodule);
     fTsignal += signal; // Keep track of sum signal.
-    if(signal<=fSignal[fkSize-1]) return; // smaller than smallest
-    for(i=0;i<fkSize;i++)if(track==fTrack[i] && hit ==fHits[i]){
-       fSignal[i] += signal;
-       flg = kTRUE;
+
+    for(i=0;i<fkSize;i++) if( track==fTrack[i] && hit==fHits[i] ){
+        fSignal[i] += signal;
+        flg = kTRUE;
     } // end for i & if.
-    if(flg){ // resort arrays.  fkSize is small use Insertin sort.
-       for(i=1;i<fkSize;i++){
-           trk = fTrack[i];
-           hts = fHits[i];
-           sig = fSignal[i];
-           j = i-1;
-           while(j>=0 && fSignal[i]>signal){
-               fTrack[j+1]  = fTrack[j];
-               fHits[j+1]   = fHits[j];
-               fSignal[j+1] = fSignal[j];
-               j--;
-           } // end while
-           fTrack[j+1]  = trk;
-           fHits[j+1]   = hts;
-           fSignal[j+1] = sig;
-       } // end if i
-       return;
+    if(flg){ // resort arrays.  
+        for(i=1;i<fkSize;i++){
+            j = i;
+            while(j>0 && fSignal[j]>fSignal[j-1]){
+                trk = fTrack[j-1];
+                hts = fHits[j-1];
+                sig = fSignal[j-1];
+                fTrack[j-1]  = fTrack[j];
+                fHits[j-1]   = fHits[j];
+                fSignal[j-1] = fSignal[j];                
+                fTrack[j]  = trk;
+                fHits[j]   = hts;
+                fSignal[j] = sig;
+                j--;
+            } // end while
+        } // end if i
+        return;
     } // end if added to existing and resorted array
+
     // new entry add it in order.
     // if this signal is <= smallest then don't add it.
     if(signal <= fSignal[fkSize-1]) return;
     for(i=fkSize-2;i>=0;i--){
-       if(signal > fSignal[i]){
-           fSignal[i+1] = fSignal[i];
-           fTrack[i+1]  = fTrack[i];
-           fHits[i+1]   = fHits[i];
-       }else{;
-           fSignal[i] = signal;
-           fTrack[i]  = track;
-           fHits[i]   = hit;
-           return; // put it in the right place, now exit.
-       } //  end if
+        if(signal > fSignal[i]){
+            fSignal[i+1] = fSignal[i];
+            fTrack[i+1]  = fTrack[i];
+            fHits[i+1]   = fHits[i];
+        }else{
+            fSignal[i+1] = signal;
+            fTrack[i+1]  = track;
+            fHits[i+1]   = hit;
+            return; // put it in the right place, now exit.
+        } //  end if
     } // end if; end for i
     // Still haven't found the right place. Must be at top of list.
     fSignal[0] = signal;
@@ -271,34 +415,101 @@ void AliITSpListItem::AddSignal(Int_t track,Int_t hit,Int_t module,
 }
 //______________________________________________________________________
 void AliITSpListItem::AddNoise(Int_t module,Int_t index,Double_t noise){
-    // Addes noise to this existing list.
+    // Adds noise to this existing list.
+    // Inputs:
+    //    Int_t module   The module where this noise occurred
+    //    Int_t index    The cell index where this noise occurred
+    //    Double_t noise The value of the noise.
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
 
     if(findex!=index || fmodule!=module) 
-       Warning("AddSignal","index=%d != findex=%d or module=%d != fmodule=%d",
-           index,findex,module,fmodule);
+        Warning("AddNoise","index=%d != findex=%d or module=%d != fmodule=%d",
+            index,findex,module,fmodule);
     fNoise += noise; // Keep track of sum signal.
 }
 //______________________________________________________________________
+void AliITSpListItem::AddSignalAfterElect(Int_t module,Int_t index,Double_t signal){
+    // Adds signal after electronics to this existing list.
+    // Inputs:
+    //    Int_t module   The module where this noise occurred
+    //    Int_t index    The cell index where this noise occurred
+    //    Double_t signal The value of the signal.
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
+
+    if(findex!=index || fmodule!=module) 
+        Warning("AddSignalAfterElect","index=%d != findex=%d or module=%d "
+               "!= fmodule=%d",index,findex,module,fmodule);
+    fSignalAfterElect += signal; // Keep track of sum signal.
+}
+//______________________________________________________________________
+void AliITSpListItem::Add(AliITSpListItem *pl){
+    // Adds the contents of pl to this
+    // pl could come from different module and index 
+    // Inputs:
+    //    AliITSpListItem *pl  an AliITSpListItem to be added to this class.
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
+    Int_t i;
+    Double_t sig  = 0.0;
+    Double_t sigT = 0.0;
+
+    for(i=0;i<pl->GetNsignals();i++){
+        sig = pl->GetSignal(i); 
+        if( sig <= 0.0 ) break; // no more signals
+        AddSignal(pl->GetTrack(i),pl->GetHit(i),fmodule,findex,sig);
+        sigT += sig;
+    } // end for i
+    fTsignal += (pl->fTsignal - sigT);
+    fNoise   += pl->fNoise;
+    return;
+}
+//______________________________________________________________________
 void AliITSpListItem::AddTo(Int_t fileIndex,AliITSpListItem *pl){
     // Adds the contents of pl to this with track number off set given by
     // fileIndex.
+    // Inputs:
+    //    Int_t fileIndex      track number offset value
+    //    AliITSpListItem *pl  an AliITSpListItem to be added to this class.
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
     Int_t i,trk;
-    Double_t sig=0.0;
-
-    for(i=0;i<pl->GetNsignals()&&i<this->GetNsignals();i++){
-       trk = pl->GetTrack(i);
-       trk = pl->ShiftIndex(fileIndex,trk);
-       this->AddSignal(trk,pl->GetHit(i),pl->GetModule(),pl->GetIndex(),pl->GetSignal(i));
-       sig += pl->GetSignal(i);
+    Double_t sig  = 0.0;
+
+    Int_t module = pl->GetModule();
+    Int_t index  = pl->GetIndex();
+    for(i=0;i<pl->GetNsignals();i++){
+        sig = pl->GetSignal(i); 
+        if( sig <= 0.0 ) break; // no more signals
+        trk = pl->GetTrack(i);
+        trk += fileIndex; 
+        AddSignal(trk,pl->GetHit(i),module,index,sig);
     } // end for i
-    this->fNoise   += pl->fNoise;
+    fSignalAfterElect += (pl->fSignalAfterElect + pl->fNoise - fNoise);
+    fNoise = pl->fNoise;
     return;
 }
 //______________________________________________________________________
 Int_t AliITSpListItem::ShiftIndex(Int_t in,Int_t trk){
-    // Shift an index number to occupy the upper four bits.
+    // Shift an index number to occupy the upper four bits. No longer used.
+    // Inputs:
+    //    Int_t in   The file number
+    //    Int_t trk  The track number
+    // Outputs:
+    //    none.
+    // Return:
+    //    Int_t The track number with the file number in the upper bits.
     Int_t si = sizeof(Int_t) * 8;
-    UInt_t uin,utrk; // use UInt_t to avoid interger overflow-> goes negitive.
+    UInt_t uin,utrk; // use UInt_t to avoid interger overflow-> goes negative.
 
     uin = in;
     utrk = trk;
@@ -310,6 +521,12 @@ Int_t AliITSpListItem::ShiftIndex(Int_t in,Int_t trk){
 //______________________________________________________________________
 void AliITSpListItem::Print(ostream *os){
     //Standard output format for this class
+    // Inputs:
+    //    ostream *os  The output stream
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
     Int_t i;
 
     *os << fmodule <<","<<findex<<",";
@@ -317,11 +534,17 @@ void AliITSpListItem::Print(ostream *os){
     for(i=0;i<fkSize;i++) *os << fTrack[i] <<",";
     for(i=0;i<fkSize;i++) *os << fHits[i] <<",";
     for(i=0;i<fkSize;i++) *os << fSignal[i] <<",";
-    *os << fTsignal <<","<< fNoise;
+    *os << fTsignal <<","<< fNoise << "," << fSignalAfterElect;
 }
 //______________________________________________________________________
 void AliITSpListItem::Read(istream *is){
     // Standard output streaming function.
+    // Inputs:
+    //    istream *is The input stream
+    // Outputs:
+    //    none.
+    // Return:
+    //    none.
     Int_t i,iss;
 
     *is >> fmodule >> findex;
@@ -329,11 +552,18 @@ void AliITSpListItem::Read(istream *is){
     for(i=0;i<fkSize&&i<iss;i++) *is >> fTrack[i];
     for(i=0;i<fkSize&&i<iss;i++) *is >> fHits[i];
     for(i=0;i<fkSize&&i<iss;i++) *is >> fSignal[i];
-    *is >> fTsignal >> fNoise;
+    *is >> fTsignal >> fNoise >> fSignalAfterElect;
 }
 //______________________________________________________________________
 ostream &operator<<(ostream &os,AliITSpListItem &source){
     // Standard output streaming function.
+    // Inputs:
+    //    ostream &os             The output stream
+    //    AliITSpListItem &source The AliITSpListItem object to be written out.
+    // Outputs:
+    //    none.
+    // Return:
+    //    ostream  The output stream
 
     source.Print(&os);
     return os;
@@ -341,7 +571,15 @@ ostream &operator<<(ostream &os,AliITSpListItem &source){
 //______________________________________________________________________
 istream &operator>>(istream &os,AliITSpListItem &source){
     // Standard output streaming function.
+    // Inputs:
+    //    istream os              The input stream
+    //    AliITSpListItem &source The AliITSpListItem object to be inputted
+    // Outputs:
+    //    none.
+    // Return:
+    //    istream The input stream.
 
     source.Read(&os);
     return os;
 }
+