ROOT logo
#include "AliMillePedeRecord.h"
#include <TMath.h>
#include "AliLog.h"

/**********************************************************************************************/
/* AliMillePedeRecords: class to store the data of single track processing                    */
/* Format: for each measured point the data is stored consequtively                           */
/* INDEX                                                      VALUE                           */
/* -1                                                         residual                        */
/* Local_param_id                                             dResidual/dLocal_param          */
/* ...                                                        ...                             */
/* -2                                                         weight of the measurement       */
/* Global_param_od                                            dResidual/dGlobal_param         */
/* ...                                                        ...                             */
/*                                                                                            */
/* The records for all processed tracks are stored in the temporary tree in orgder to be      */
/* reused for multiple iterations of MillePede                                                */
/*                                                                                            */ 
/* Author: ruben.shahoyan@cern.ch                                                             */
/*                                                                                            */ 
/**********************************************************************************************/

ClassImp(AliMillePedeRecord)

//_____________________________________________________________________________________________
AliMillePedeRecord::AliMillePedeRecord() : 
fSize(0),fNGroups(0),fRunID(0),fGroupID(0),fIndex(0),fValue(0),fWeight(1) {SetUniqueID(0);}

//_____________________________________________________________________________________________
AliMillePedeRecord::AliMillePedeRecord(const AliMillePedeRecord& src) : 
  TObject(src),fSize(src.fSize),fNGroups(src.fNGroups),fRunID(src.fRunID),fGroupID(0),fIndex(0),fValue(0),fWeight(src.fWeight)
{
  // copy ct-r
  fIndex = new Int_t[GetDtBufferSize()];
  memcpy(fIndex,src.fIndex,fSize*sizeof(Int_t));
  fValue = new Double_t[GetDtBufferSize()];
  memcpy(fValue,src.fValue,fSize*sizeof(Double_t));
  fGroupID = new UShort_t[GetGrBufferSize()];
  memcpy(fGroupID,src.fGroupID,GetGrBufferSize()*sizeof(UShort_t));
}

//_____________________________________________________________________________________________
AliMillePedeRecord& AliMillePedeRecord::operator=(const AliMillePedeRecord& rhs)
{ 
  // assignment op-r
  if (this!=&rhs) {
    Reset();
    for (int i=0;i<rhs.GetSize();i++) {
      Double_t val;
      Int_t    ind;
      rhs.GetIndexValue(i,ind,val);
      AddIndexValue(ind,val);
    }
    fWeight = rhs.fWeight;
    fRunID = rhs.fRunID;
    for (int i=0;i<rhs.GetNGroups();i++) MarkGroup(rhs.GetGroupID(i));
  }
  return *this;
}

//_____________________________________________________________________________________________
AliMillePedeRecord::~AliMillePedeRecord() {delete[] fIndex; delete[] fValue; delete[] fGroupID;}

//_____________________________________________________________________________________________
void AliMillePedeRecord::Reset()
{
  // reset all
  fSize = 0;
  for (int i=fNGroups;i--;) fGroupID[i] = 0;
  fNGroups = 0;
  fRunID = 0;
  fWeight = 1.;
}

//_____________________________________________________________________________________________
void AliMillePedeRecord::Print(const Option_t *) const
{
  // print itself
  if (!fSize) {AliInfo("No data"); return;}
  int cnt=0,point=0;
  //  
  if (fNGroups) printf("Groups: ");
  for (int i=0;i<fNGroups;i++) printf("%4d |",GetGroupID(i)); 
  printf("Run: %9d Weight: %+.2e\n",fRunID,fWeight);
  while(cnt<fSize) {
    //
    Double_t resid = fValue[cnt++];
    Double_t *derLoc = GetValue()+cnt;
    int    *indLoc = GetIndex()+cnt;
    int     nLoc = 0;
    while(!IsWeight(cnt)) {nLoc++;cnt++;}
    Double_t weight = GetValue(cnt++);
    Double_t *derGlo = GetValue()+cnt;
    int    *indGlo = GetIndex()+cnt;
    int     nGlo = 0;
    while(!IsResidual(cnt) && cnt<fSize) {nGlo++; cnt++;} 
    //
    printf("\n*** Point#%2d | Residual = %+.4e | Weight = %+.4e\n",point++,resid,weight);
    printf("Locals : "); 
    for (int i=0;i<nLoc;i++) printf("[%5d] %+.4e|",indLoc[i],derLoc[i]); printf("\n");
    printf("Globals: "); 
    for (int i=0;i<nGlo;i++) printf("[%5d] %+.4e|",indGlo[i],derGlo[i]); printf("\n");
    //
  }
  //
}

//_____________________________________________________________________________________________
Double_t AliMillePedeRecord::GetGloResWProd(Int_t indx) const
{
  // get sum of derivative over global variable indx * res. at point * weight
  if (!fSize) {AliInfo("No data"); return 0;}
  int cnt=0;
  double prodsum = 0.0;
  //  
  while(cnt<fSize) {
    //
    Double_t resid = fValue[cnt++];
    while(!IsWeight(cnt)) cnt++;
    Double_t weight = GetValue(cnt++);
    Double_t *derGlo = GetValue()+cnt;
    int    *indGlo = GetIndex()+cnt;
    int     nGlo = 0;
    while(!IsResidual(cnt) && cnt<fSize) {nGlo++; cnt++;} 
    for (int i=nGlo;i--;) if (indGlo[i]==indx) prodsum += resid*weight*derGlo[i];
    //
  }
  return prodsum;
}

//_____________________________________________________________________________________________
Double_t AliMillePedeRecord::GetGlobalDeriv(Int_t pnt, Int_t indx) const
{
  // get derivative over global variable indx at point pnt
  if (!fSize) {AliError("No data"); return 0;}
  int cnt=0,point=0;
  //  
  while(cnt<fSize) {
    //
    cnt++;
    while(!IsWeight(cnt)) cnt++;
    cnt++;
    Double_t *derGlo = GetValue()+cnt;
    int    *indGlo = GetIndex()+cnt;
    int     nGlo = 0;
    while(!IsResidual(cnt) && cnt<fSize) {nGlo++; cnt++;} 
    //
    if (pnt != point++) continue;
    for (int i=nGlo;i--;) if (indGlo[i]==indx) return derGlo[i];
    break;
  }
  return 0;
  //
}

//_____________________________________________________________________________________________
Double_t AliMillePedeRecord::GetLocalDeriv(Int_t pnt, Int_t indx) const
{
  // get derivative over local variable indx at point pnt
  if (!fSize) {AliError("No data"); return 0;}
  int cnt=0,point=0;
  //  
  while(cnt<fSize) {
    //
    cnt++;
    Double_t *derLoc = GetValue()+cnt;
    int    *indLoc = GetIndex()+cnt;
    int     nLoc = 0;
    while(!IsWeight(cnt)) {nLoc++;cnt++;}
    cnt++;
    while(!IsResidual(cnt) && cnt<fSize) cnt++;
    if (pnt != point++) continue;
    for (int i=nLoc;i--;) if (indLoc[i]==indx) return derLoc[i];
    break;
  }
  return 0;
  //
}

//_____________________________________________________________________________________________
Double_t AliMillePedeRecord::GetResidual(Int_t pnt) const
{
  // get residual at point pnt
  if (!fSize) {AliError("No data"); return 0;}
  int cnt=0,point=0;
  //  
  while(cnt<fSize) {
    //
    Double_t resid = fValue[cnt++];
    while(!IsWeight(cnt)) cnt++;
    cnt++;
    while(!IsResidual(cnt) && cnt<fSize) cnt++;
    if (pnt != point++) continue;
    return resid;
  }
  return 0;
  //
}

//_____________________________________________________________________________________________
Double_t AliMillePedeRecord::GetWeight(Int_t pnt) const
{
  // get weight of point pnt
  if (!fSize) {AliError("No data"); return 0;}
  int cnt=0,point=0;
  //  
  while(cnt<fSize) {
    //
    cnt++;
    while(!IsWeight(cnt)) cnt++;
    if (point==pnt) return GetValue(cnt);;
    cnt++;
    while(!IsResidual(cnt) && cnt<fSize) cnt++;
    point++;
  }
  return -1;
  //
}

//_____________________________________________________________________________________________
void AliMillePedeRecord::ExpandDtBuffer(Int_t bfsize)
{
  // add extra space for derivatives data
  bfsize = TMath::Max(bfsize,GetDtBufferSize());
  Int_t *tmpI = new Int_t[bfsize];
  memcpy(tmpI,fIndex, fSize*sizeof(Int_t));
  delete [] fIndex;
  fIndex = tmpI;
  //
  Double_t *tmpD = new Double_t[bfsize];
  memcpy(tmpD,fValue, fSize*sizeof(Double_t));
  delete [] fValue;
  fValue = tmpD;
  //
  SetDtBufferSize(bfsize);
}

//_____________________________________________________________________________________________
void AliMillePedeRecord::ExpandGrBuffer(Int_t bfsize)
{
  // add extra space for groupID data 
  bfsize = TMath::Max(bfsize,GetGrBufferSize());
  UShort_t *tmpI = new UShort_t[bfsize];
  memcpy(tmpI,fGroupID, fNGroups*sizeof(UShort_t));
  delete [] fGroupID;
  fGroupID = tmpI;
  for (int i=fNGroups;i<bfsize;i++) fGroupID[i] = 0;
  //
  SetGrBufferSize(bfsize);
}

//_____________________________________________________________________________________________
void AliMillePedeRecord::MarkGroup(Int_t id)
{
  // mark the presence of the detector group
  id++; // groupID is stored as realID+1
  if (fNGroups>0 && fGroupID[fNGroups-1]==id) return; // already there
  if (fNGroups>=GetGrBufferSize()) ExpandGrBuffer(2*(fNGroups+1));
  fGroupID[fNGroups++] = id;  
}

 AliMillePedeRecord.cxx:1
 AliMillePedeRecord.cxx:2
 AliMillePedeRecord.cxx:3
 AliMillePedeRecord.cxx:4
 AliMillePedeRecord.cxx:5
 AliMillePedeRecord.cxx:6
 AliMillePedeRecord.cxx:7
 AliMillePedeRecord.cxx:8
 AliMillePedeRecord.cxx:9
 AliMillePedeRecord.cxx:10
 AliMillePedeRecord.cxx:11
 AliMillePedeRecord.cxx:12
 AliMillePedeRecord.cxx:13
 AliMillePedeRecord.cxx:14
 AliMillePedeRecord.cxx:15
 AliMillePedeRecord.cxx:16
 AliMillePedeRecord.cxx:17
 AliMillePedeRecord.cxx:18
 AliMillePedeRecord.cxx:19
 AliMillePedeRecord.cxx:20
 AliMillePedeRecord.cxx:21
 AliMillePedeRecord.cxx:22
 AliMillePedeRecord.cxx:23
 AliMillePedeRecord.cxx:24
 AliMillePedeRecord.cxx:25
 AliMillePedeRecord.cxx:26
 AliMillePedeRecord.cxx:27
 AliMillePedeRecord.cxx:28
 AliMillePedeRecord.cxx:29
 AliMillePedeRecord.cxx:30
 AliMillePedeRecord.cxx:31
 AliMillePedeRecord.cxx:32
 AliMillePedeRecord.cxx:33
 AliMillePedeRecord.cxx:34
 AliMillePedeRecord.cxx:35
 AliMillePedeRecord.cxx:36
 AliMillePedeRecord.cxx:37
 AliMillePedeRecord.cxx:38
 AliMillePedeRecord.cxx:39
 AliMillePedeRecord.cxx:40
 AliMillePedeRecord.cxx:41
 AliMillePedeRecord.cxx:42
 AliMillePedeRecord.cxx:43
 AliMillePedeRecord.cxx:44
 AliMillePedeRecord.cxx:45
 AliMillePedeRecord.cxx:46
 AliMillePedeRecord.cxx:47
 AliMillePedeRecord.cxx:48
 AliMillePedeRecord.cxx:49
 AliMillePedeRecord.cxx:50
 AliMillePedeRecord.cxx:51
 AliMillePedeRecord.cxx:52
 AliMillePedeRecord.cxx:53
 AliMillePedeRecord.cxx:54
 AliMillePedeRecord.cxx:55
 AliMillePedeRecord.cxx:56
 AliMillePedeRecord.cxx:57
 AliMillePedeRecord.cxx:58
 AliMillePedeRecord.cxx:59
 AliMillePedeRecord.cxx:60
 AliMillePedeRecord.cxx:61
 AliMillePedeRecord.cxx:62
 AliMillePedeRecord.cxx:63
 AliMillePedeRecord.cxx:64
 AliMillePedeRecord.cxx:65
 AliMillePedeRecord.cxx:66
 AliMillePedeRecord.cxx:67
 AliMillePedeRecord.cxx:68
 AliMillePedeRecord.cxx:69
 AliMillePedeRecord.cxx:70
 AliMillePedeRecord.cxx:71
 AliMillePedeRecord.cxx:72
 AliMillePedeRecord.cxx:73
 AliMillePedeRecord.cxx:74
 AliMillePedeRecord.cxx:75
 AliMillePedeRecord.cxx:76
 AliMillePedeRecord.cxx:77
 AliMillePedeRecord.cxx:78
 AliMillePedeRecord.cxx:79
 AliMillePedeRecord.cxx:80
 AliMillePedeRecord.cxx:81
 AliMillePedeRecord.cxx:82
 AliMillePedeRecord.cxx:83
 AliMillePedeRecord.cxx:84
 AliMillePedeRecord.cxx:85
 AliMillePedeRecord.cxx:86
 AliMillePedeRecord.cxx:87
 AliMillePedeRecord.cxx:88
 AliMillePedeRecord.cxx:89
 AliMillePedeRecord.cxx:90
 AliMillePedeRecord.cxx:91
 AliMillePedeRecord.cxx:92
 AliMillePedeRecord.cxx:93
 AliMillePedeRecord.cxx:94
 AliMillePedeRecord.cxx:95
 AliMillePedeRecord.cxx:96
 AliMillePedeRecord.cxx:97
 AliMillePedeRecord.cxx:98
 AliMillePedeRecord.cxx:99
 AliMillePedeRecord.cxx:100
 AliMillePedeRecord.cxx:101
 AliMillePedeRecord.cxx:102
 AliMillePedeRecord.cxx:103
 AliMillePedeRecord.cxx:104
 AliMillePedeRecord.cxx:105
 AliMillePedeRecord.cxx:106
 AliMillePedeRecord.cxx:107
 AliMillePedeRecord.cxx:108
 AliMillePedeRecord.cxx:109
 AliMillePedeRecord.cxx:110
 AliMillePedeRecord.cxx:111
 AliMillePedeRecord.cxx:112
 AliMillePedeRecord.cxx:113
 AliMillePedeRecord.cxx:114
 AliMillePedeRecord.cxx:115
 AliMillePedeRecord.cxx:116
 AliMillePedeRecord.cxx:117
 AliMillePedeRecord.cxx:118
 AliMillePedeRecord.cxx:119
 AliMillePedeRecord.cxx:120
 AliMillePedeRecord.cxx:121
 AliMillePedeRecord.cxx:122
 AliMillePedeRecord.cxx:123
 AliMillePedeRecord.cxx:124
 AliMillePedeRecord.cxx:125
 AliMillePedeRecord.cxx:126
 AliMillePedeRecord.cxx:127
 AliMillePedeRecord.cxx:128
 AliMillePedeRecord.cxx:129
 AliMillePedeRecord.cxx:130
 AliMillePedeRecord.cxx:131
 AliMillePedeRecord.cxx:132
 AliMillePedeRecord.cxx:133
 AliMillePedeRecord.cxx:134
 AliMillePedeRecord.cxx:135
 AliMillePedeRecord.cxx:136
 AliMillePedeRecord.cxx:137
 AliMillePedeRecord.cxx:138
 AliMillePedeRecord.cxx:139
 AliMillePedeRecord.cxx:140
 AliMillePedeRecord.cxx:141
 AliMillePedeRecord.cxx:142
 AliMillePedeRecord.cxx:143
 AliMillePedeRecord.cxx:144
 AliMillePedeRecord.cxx:145
 AliMillePedeRecord.cxx:146
 AliMillePedeRecord.cxx:147
 AliMillePedeRecord.cxx:148
 AliMillePedeRecord.cxx:149
 AliMillePedeRecord.cxx:150
 AliMillePedeRecord.cxx:151
 AliMillePedeRecord.cxx:152
 AliMillePedeRecord.cxx:153
 AliMillePedeRecord.cxx:154
 AliMillePedeRecord.cxx:155
 AliMillePedeRecord.cxx:156
 AliMillePedeRecord.cxx:157
 AliMillePedeRecord.cxx:158
 AliMillePedeRecord.cxx:159
 AliMillePedeRecord.cxx:160
 AliMillePedeRecord.cxx:161
 AliMillePedeRecord.cxx:162
 AliMillePedeRecord.cxx:163
 AliMillePedeRecord.cxx:164
 AliMillePedeRecord.cxx:165
 AliMillePedeRecord.cxx:166
 AliMillePedeRecord.cxx:167
 AliMillePedeRecord.cxx:168
 AliMillePedeRecord.cxx:169
 AliMillePedeRecord.cxx:170
 AliMillePedeRecord.cxx:171
 AliMillePedeRecord.cxx:172
 AliMillePedeRecord.cxx:173
 AliMillePedeRecord.cxx:174
 AliMillePedeRecord.cxx:175
 AliMillePedeRecord.cxx:176
 AliMillePedeRecord.cxx:177
 AliMillePedeRecord.cxx:178
 AliMillePedeRecord.cxx:179
 AliMillePedeRecord.cxx:180
 AliMillePedeRecord.cxx:181
 AliMillePedeRecord.cxx:182
 AliMillePedeRecord.cxx:183
 AliMillePedeRecord.cxx:184
 AliMillePedeRecord.cxx:185
 AliMillePedeRecord.cxx:186
 AliMillePedeRecord.cxx:187
 AliMillePedeRecord.cxx:188
 AliMillePedeRecord.cxx:189
 AliMillePedeRecord.cxx:190
 AliMillePedeRecord.cxx:191
 AliMillePedeRecord.cxx:192
 AliMillePedeRecord.cxx:193
 AliMillePedeRecord.cxx:194
 AliMillePedeRecord.cxx:195
 AliMillePedeRecord.cxx:196
 AliMillePedeRecord.cxx:197
 AliMillePedeRecord.cxx:198
 AliMillePedeRecord.cxx:199
 AliMillePedeRecord.cxx:200
 AliMillePedeRecord.cxx:201
 AliMillePedeRecord.cxx:202
 AliMillePedeRecord.cxx:203
 AliMillePedeRecord.cxx:204
 AliMillePedeRecord.cxx:205
 AliMillePedeRecord.cxx:206
 AliMillePedeRecord.cxx:207
 AliMillePedeRecord.cxx:208
 AliMillePedeRecord.cxx:209
 AliMillePedeRecord.cxx:210
 AliMillePedeRecord.cxx:211
 AliMillePedeRecord.cxx:212
 AliMillePedeRecord.cxx:213
 AliMillePedeRecord.cxx:214
 AliMillePedeRecord.cxx:215
 AliMillePedeRecord.cxx:216
 AliMillePedeRecord.cxx:217
 AliMillePedeRecord.cxx:218
 AliMillePedeRecord.cxx:219
 AliMillePedeRecord.cxx:220
 AliMillePedeRecord.cxx:221
 AliMillePedeRecord.cxx:222
 AliMillePedeRecord.cxx:223
 AliMillePedeRecord.cxx:224
 AliMillePedeRecord.cxx:225
 AliMillePedeRecord.cxx:226
 AliMillePedeRecord.cxx:227
 AliMillePedeRecord.cxx:228
 AliMillePedeRecord.cxx:229
 AliMillePedeRecord.cxx:230
 AliMillePedeRecord.cxx:231
 AliMillePedeRecord.cxx:232
 AliMillePedeRecord.cxx:233
 AliMillePedeRecord.cxx:234
 AliMillePedeRecord.cxx:235
 AliMillePedeRecord.cxx:236
 AliMillePedeRecord.cxx:237
 AliMillePedeRecord.cxx:238
 AliMillePedeRecord.cxx:239
 AliMillePedeRecord.cxx:240
 AliMillePedeRecord.cxx:241
 AliMillePedeRecord.cxx:242
 AliMillePedeRecord.cxx:243
 AliMillePedeRecord.cxx:244
 AliMillePedeRecord.cxx:245
 AliMillePedeRecord.cxx:246
 AliMillePedeRecord.cxx:247
 AliMillePedeRecord.cxx:248
 AliMillePedeRecord.cxx:249
 AliMillePedeRecord.cxx:250
 AliMillePedeRecord.cxx:251
 AliMillePedeRecord.cxx:252
 AliMillePedeRecord.cxx:253
 AliMillePedeRecord.cxx:254
 AliMillePedeRecord.cxx:255
 AliMillePedeRecord.cxx:256
 AliMillePedeRecord.cxx:257
 AliMillePedeRecord.cxx:258
 AliMillePedeRecord.cxx:259
 AliMillePedeRecord.cxx:260
 AliMillePedeRecord.cxx:261