+Int_t AliObjMatrix::GetNrefs(TObject* obj) const
+{
+// Provide the number of stored references to the specified object.
+// If obj=0 the total number of stored references for all objects is returned.
+ Int_t nobjs=GetNobjects();
+
+ if (!obj) return nobjs;
+
+ Int_t nrefs=0;
+ for (Int_t i=1; i<=nobjs; i++)
+ {
+ TObject* objx=GetObject(i);
+ if (objx==obj) nrefs++;
+ }
+ return nrefs;
+}
+///////////////////////////////////////////////////////////////////////////
+Int_t AliObjMatrix::GetIndices(TObject* obj,TArrayI& rows,TArrayI& cols) const
+{
+// Provide the (row,col) indices of all the storage locations of the
+// specified object.
+// The row and column indices are returned in the two separate TArrayI arrays
+// from which the (row,col) pairs can be obtained from the corresponding
+// array indices like (row,col)=(rows.At(j),cols.At(j)).
+// The integer return argument represents the number of (row,col) pairs which
+// were encountered for the specified object.
+//
+// If obj=0 no object selection is performed and all (row,col) indices
+// of the stored references for all objects are returned.
+//
+// Notes :
+// -------
+// As usual the convention is that row and column numbering starts at 1.
+//
+// This memberfunction always resets the two TArrayI arrays at the start.
+//
+// This memberfunction can only be used to obtain the (row,col) indices
+// of the object as stored via the EnterObject() memberfunction.
+// This means that in case the user has entered a TObjArray as object
+// (to increase the dimension of the resulting structure), the (row,col)
+// indices of that TObjArray are obtained and NOT the indices of the
+// actual objects contained in that TObjArray structure.
+//
+ Int_t nrefs=GetNrefs(obj);
+ rows.Reset();
+ cols.Reset();
+ rows.Set(nrefs);
+ cols.Set(nrefs);
+ if (!nrefs) return 0;
+
+ Int_t irow,icol;
+ Int_t jref=0;
+ for (Int_t i=0; i<fRows->GetSize(); i++)
+ {
+ TObjArray* columns=(TObjArray*)fRows->At(i);
+ if (!columns) continue;
+
+ for (Int_t j=0; j<columns->GetSize(); j++)
+ {
+ TObject* objx=(TObject*)columns->At(j);
+ if (objx && (objx==obj || !obj))
+ {
+ irow=i+1;
+ if (fSwap) irow=j+1;
+ icol=j+1;
+ if (fSwap) icol=i+1;
+ rows.AddAt(irow,jref);
+ cols.AddAt(icol,jref);
+ jref++;
+ }
+ // All references found ==> Done
+ if (jref==nrefs) break;
+ }
+ // All references found ==> Done
+ if (jref==nrefs) break;
+ }
+ return nrefs;
+}
+///////////////////////////////////////////////////////////////////////////
+Int_t AliObjMatrix::GetIndices(TObject* obj,Int_t row,TArrayI& cols) const
+{
+// Provide the column indices of all the storage locations of the
+// specified object in the specified row of the matrix.
+// The column indices are returned in the TArrayI array.
+// The integer return argument represents the number of storage locations which
+// were encountered for the specified object in the specified matrix row.
+//
+// If obj=0 no object selection is performed and all column indices
+// of the stored references for all objects in this specified matrix row
+// are returned.
+//
+// If row=0 all rows will be scanned and all column indices matching the
+// object selection are returned.
+// Note that in this case multiple appearances of the same column index
+// will only be recorded once in the returned TArrayI array.
+//
+// Notes :
+// -------
+// As usual the convention is that row and column numbering starts at 1.
+//
+// This memberfunction always resets the TArrayI array at the start.
+//
+// This memberfunction can only be used to obtain the column indices
+// of the object as stored via the EnterObject() memberfunction.
+// This means that in case the user has entered a TObjArray as object
+// (to increase the dimension of the resulting structure), the column
+// indices of that TObjArray are obtained and NOT the indices of the
+// actual objects contained in that TObjArray structure.
+//
+ cols.Reset();
+
+ if (row<0 || row>GetMaxRow()) return 0;
+
+ Int_t nrefs=GetNrefs(obj);
+ cols.Set(nrefs);
+ if (!nrefs) return 0;
+
+ Int_t irow,icol;
+ Int_t jref=0;
+
+ // No specific row selection
+ if (!row)
+ {
+ TArrayI ar;
+ TArrayI ac;
+ Int_t n=GetIndices(obj,ar,ac);
+ Int_t found=0;
+ for (Int_t idx=0; idx<n; idx++)
+ {
+ icol=ac.At(idx);
+ found=0;
+ for (Int_t k=0; k<jref; k++)
+ {
+ if (icol==cols.At(k)) found=1;
+ }
+ if (!found)
+ {
+ cols.AddAt(icol,jref);
+ jref++;
+ }
+ }
+ // Set the array size to the actual number of different column indices
+ cols.Set(jref);
+
+ return jref;
+ }
+
+ // Specific row selection
+ for (Int_t i=0; i<fRows->GetSize(); i++)
+ {
+ TObjArray* columns=(TObjArray*)fRows->At(i);
+ if (!columns) continue;
+
+ for (Int_t j=0; j<columns->GetSize(); j++)
+ {
+ TObject* objx=(TObject*)columns->At(j);
+ if (objx && (objx==obj || !obj))
+ {
+ irow=i+1;
+ if (fSwap) irow=j+1;
+ icol=j+1;
+ if (fSwap) icol=i+1;
+ if (irow==row)
+ {
+ cols.AddAt(icol,jref);
+ jref++;
+ }
+ }
+ // All references found ==> Done
+ if (jref==nrefs) break;
+ }
+ // All references found ==> Done
+ if (jref==nrefs) break;
+ }
+ // Set the array size to the actual number of found occurrences
+ cols.Set(jref);
+
+ return jref;
+}
+///////////////////////////////////////////////////////////////////////////
+Int_t AliObjMatrix::GetIndices(TObject* obj,TArrayI& rows,Int_t col) const
+{
+// Provide the row indices of all the storage locations of the
+// specified object in the specified column of the matrix.
+// The row indices are returned in the TArrayI array.
+// The integer return argument represents the number of storage locations which
+// were encountered for the specified object in the specified matrix column.
+//
+// If obj=0 no object selection is performed and all row indices
+// of the stored references for all objects in this specified matrix column
+// are returned.
+//
+// If col=0 all columns will be scanned and all row indices matching the
+// object selection are returned.
+// Note that in this case multiple appearances of the same row index
+// will only be recorded once in the returned TArrayI array.
+//
+// Notes :
+// -------
+// As usual the convention is that row and column numbering starts at 1.
+//
+// This memberfunction always resets the TArrayI array at the start.
+//
+// This memberfunction can only be used to obtain the row indices
+// of the object as stored via the EnterObject() memberfunction.
+// This means that in case the user has entered a TObjArray as object
+// (to increase the dimension of the resulting structure), the row
+// indices of that TObjArray are obtained and NOT the indices of the
+// actual objects contained in that TObjArray structure.
+//
+ rows.Reset();
+
+ if (col<0 || col>GetMaxColumn()) return 0;
+
+ Int_t nrefs=GetNrefs(obj);
+ rows.Set(nrefs);
+ if (!nrefs) return 0;
+
+ Int_t irow,icol;
+ Int_t jref=0;
+
+ // No specific column selection
+ if (!col)
+ {
+ TArrayI ar;
+ TArrayI ac;
+ Int_t n=GetIndices(obj,ar,ac);
+ Int_t found=0;
+ for (Int_t idx=0; idx<n; idx++)
+ {
+ irow=ar.At(idx);
+ found=0;
+ for (Int_t k=0; k<jref; k++)
+ {
+ if (irow==rows.At(k)) found=1;
+ }
+ if (!found)
+ {
+ rows.AddAt(irow,jref);
+ jref++;
+ }
+ }
+ // Set the array size to the actual number of different row indices
+ rows.Set(jref);
+
+ return jref;
+ }
+
+ // Specific column selection
+ for (Int_t i=0; i<fRows->GetSize(); i++)
+ {
+ TObjArray* columns=(TObjArray*)fRows->At(i);
+ if (!columns) continue;
+
+ for (Int_t j=0; j<columns->GetSize(); j++)
+ {
+ TObject* objx=(TObject*)columns->At(j);
+ if (objx && (objx==obj || !obj))
+ {
+ irow=i+1;
+ if (fSwap) irow=j+1;
+ icol=j+1;
+ if (fSwap) icol=i+1;
+ if (icol==col)
+ {
+ rows.AddAt(irow,jref);
+ jref++;
+ }
+ }
+ // All references found ==> Done
+ if (jref==nrefs) break;
+ }
+ // All references found ==> Done
+ if (jref==nrefs) break;
+ }
+ // Set the array size to the actual number of found occurrences
+ rows.Set(jref);
+
+ return jref;
+}
+///////////////////////////////////////////////////////////////////////////