ROOT logo
/*
In this macro we create groups of patterns with similar characteristics. First we load the pattern database with information about MC-hit.
We do not group patterns with a frequency below a treshold (frequencyTreshold).
We define 7 different ID. 2 for the sigma of the MChit-COG, x and z direction (sigmaXID and sigma ZID);
2 for the distance between COG and centre of the pixel, x and z (shiftXID and shiftZID);
2 for the distance between MChit and centre of the pixel, x and z direction (biasXID ad biasZID).
1 ID for the number of fired pixels.
We define the binning (number/width of bins) and assign the previous IDs.
We decide which the grouping method we want to use: sigma, shift and number of pixels (kShift) or sigma, bias and number of pixels (kBias)
Finally we assign group ID. Frequent patterns (above the treshold), form a one-pattern group. The tohers are in the same group if they have
the same IDs.
A fil.txt is print qith he inormation for each apttern, including the IDs and the pattID of the patterns in the same group.

*/

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TObjArray.h"
#include "TFile.h"
#include "TTree.h"
#include "TH1.h"
#include "TH2.h"
#include "TF1.h"
#include "TArrayI.h"
#include "TArrayF.h"
#include "TCanvas.h"
#include "TPad.h"
#include "TPavesText.h"
#include "TLatex.h"
#include "TBits.h"
#include "TGraph.h"
#include "TStopwatch.h"
#include "TMath.h"
#include "../ITS/UPGRADE/AliITSUClusterPix.h"
#include "../ITS/UPGRADE/AliITSURecoLayer.h"
#include "../ITS/UPGRADE/AliITSURecoDet.h"
#include "../ITS/UPGRADE/AliITSUHit.h"
#include "../ITS/UPGRADE/AliITSUGeomTGeo.h"
#include "AliITSsegmentation.h"
#include "AliGeomManager.h"

#endif

TObjArray histoArr;
TObjArray *pattDB=0; //it is an array with all the patterns in TBits format (forom the most to the least frequent)
TVectorF* pattFR=0; //frequency of the pattern in the database
TVectorF* xCentrePix=0; //coordinate of the centre of the pixel containing the COG for the down-left corner in fracion of the pitch
TVectorF* zCentrePix=0;
TVectorF* xCentreShift=0; //Difference between x coordinate fo COG and the centre of the pixel containing the COG, in fraction of the pitch
TVectorF* zCentreShift=0;
TVectorF* NPix=0;//Number of fired pixels
TVectorF* NRow=0;//Number of rows of the pattern
TVectorF* NCol=0;//Number of columns of the pattern
TVectorF* DeltaZmean=0; //mean value of the difference between MChit and COG z coordinate in micron derived from a gaussian fit
TVectorF* DeltaXmean=0; //mean value of the difference between MChit and COG x coordinate in micron derived from a gaussian fit
TVectorF* DeltaZsigma=0; //sigma of the difference between MChit and COG z coordinate in micron derived from a gaussian fit
TVectorF* DeltaXsigma=0; //sigma of the difference between MChit and COG x coordinate in micron derived from a gaussian fit
TVectorF* DeltaZmeanErr=0;
TVectorF* DeltaXmeanErr=0;
TVectorF* DeltaZsigmaErr=0;
TVectorF* DeltaXsigmaErr=0;

//Defining the ID to create the groups.
TArrayI sigmaXID;
TArrayI sigmaZID;
TArrayI shiftXID;
TArrayI shiftZID;
TArrayI biasXID;
TArrayI biasZID;
TArrayI NPixID;
TArrayI groupID;
Float_t totalGroupFreq=0;

void LoadDB(const char* namefile);

Int_t nPatterns=0;

//Defining the frequency treshold under which ti group patterns
Float_t frequencyTreshold = 0.001;
//Defining the bins
Int_t NumberofSigmaXbins=1000;
Int_t NumberofSigmaZbins=1000;
Int_t NumberofShiftXbins=20;
Int_t NumberofShiftZbins=20;
Int_t NumberofBiasXbins=2000;
Int_t NumberofBiasZbins=2000;
//Defining the boundaries of the bins concerning the number of pixel
const Int_t	limitsnumber = 4;
//Defining the width of the bins to store patterns with similar sigma/shift/bias (in micron)
Float_t sigmaXwidth=3;
Float_t sigmaZwidth=3;
Float_t biasXwidth=5;
Float_t biasZwidth=5;
Float_t shiftXwidth=1./NumberofShiftXbins; //(fraction of the pitch)
Float_t shiftZwidth=1./NumberofShiftZbins; //(fraction of the pitch)

Int_t nPixlimits[limitsnumber] = {4,10,25,50};

enum{kShift=0, kBias=1};
//Select kShift to group wrt sigma & COG-centreOfThePixel distance
//Select kBias to group wrt sigma & MChit-centreOfThePixel distance

Int_t groupingMethod = kShift;

Int_t tempgroupID=0;

void groupdef(){

	//Importing Data
	LoadDB("clusterTopology2.root");

	//Define moudule segmentation

	AliGeomManager::LoadGeometry("geometry.root");
	AliITSUGeomTGeo* gm = new AliITSUGeomTGeo(kTRUE);
	AliITSUClusterPix::SetGeom(gm);
	const AliITSsegmentation* segm = gm->GetSegmentation(0);
	Float_t pitchX = segm->Dpx(0)*10000; // for pitch in X in micron
	printf("pitchX: %f\n",pitchX);
	Float_t pitchZ = segm->Dpz(0)*10000; // for pitch in Z in micron
	printf("pitchX: %f\n",pitchX);
	delete gm;

	//Setting the number of patterns
	nPatterns = (pattDB->GetEntriesFast());

	sigmaXID.Set(nPatterns);
	sigmaZID.Set(nPatterns);

	//Assign -2 to frequent patterns, not to group, and -1 to rare clusters, -3 to patterns with sigma set to zero
	for(Int_t ID=0; ID<nPatterns; ID++){
		printf("Assign temporary sigma ID to pattern %d... ",ID);
 		if((*pattFR)[ID]>frequencyTreshold){
			sigmaXID[ID]=-2;//In order not to consider it within the groups
			sigmaZID[ID]=-2;//In order not to consider it within the groups
		}
		else{
			sigmaXID[ID]=-1;
			sigmaZID[ID]=-1;
			totalGroupFreq+=(*pattFR)[ID];
		}
		printf("done\n\n");
	}

	//Assign to similar patterns the same sigmaXID
	for(Int_t i=0; i<nPatterns; i++){
		printf("Assign sigmaXID to pattern %d... ",i);
		if(sigmaXID[i]==-1){
			if((*DeltaXsigma)[i]==0){
				sigmaXID[i]=-3; // In order not to cosider it within the groups
			}
			else{
				for(Int_t j=0; j<NumberofSigmaXbins; j++){
					if(j*sigmaXwidth < (*DeltaXsigma)[i] && (*DeltaXsigma)[i]<= (j+1)*sigmaXwidth){
						sigmaXID[i]=j+1;
						break;
					}
				}
			}
		}
		printf("done!!\n\n");
	}

	//Assign to similar patterns the same sigmaZID
	for(Int_t i=0; i<nPatterns; i++){
		printf("Assign sigmaZID to pattern %d... ",i);
		if(sigmaZID[i]==-1){
			if((*DeltaZsigma)[i]==0){
				sigmaZID[i]=-3; // In order not to cosider it within the groups
			}
			else{
				for(int j=0; j<NumberofSigmaZbins ; j++){
					if(j*sigmaZwidth < (*DeltaZsigma)[i] && (*DeltaZsigma)[i]<= (j+1)*sigmaZwidth){
						sigmaZID[i]=j+1;
						break;
					}
				}
			}
		}
		printf("done!!\n\n");
	}

	//assigning shiftID

	shiftXID.Set(nPatterns);
	shiftZID.Set(nPatterns);

	for(Int_t i=0; i<nPatterns; i++){
		printf("Assign shiftXID to pattern %d... ",i);
		
		for(int j=-NumberofShiftXbins/2; j<NumberofShiftXbins/2; j++){
			
			if(j*shiftXwidth < (*xCentreShift)[i] && (*xCentreShift)[i]<= (j+1)*shiftXwidth){
				shiftXID[i]=j+1;
				printf("done!!\n\n");
				break;
			}	
		}
	}

	for(Int_t i=0; i<nPatterns; i++){
		printf("Assign shiftZID to pattern %d... ",i);
		
		for(int j=-NumberofShiftZbins/2; j<NumberofShiftZbins/2; j++){
			if(j*shiftZwidth < (*zCentreShift)[i] && (*zCentreShift)[i]<= (j+1)*shiftZwidth){
				shiftZID[i]=j+1;
				printf("done!!\n\n");
				break;
			}
		}	
	}
	
	//assigning BiasID

	biasXID.Set(nPatterns);
	biasZID.Set(nPatterns);

	//Setting all the bias ID to zero

	for(Int_t i=0; i<nPatterns; i++){
		biasXID[i]=0;
		biasZID[i]=0;
	}

	for(Int_t i=0; i<nPatterns; i++){
		printf("Assign biasXID to pattern %d... ",i);
		for(Int_t j=-NumberofBiasXbins/2; j<NumberofBiasXbins/2; j++){
			if(j*biasXwidth < ((*DeltaXmean)[i]+((*xCentreShift)[i]*pitchX))
				&& ((*DeltaXmean)[i]+((*xCentreShift)[i]*pitchX))<= (j+1)*biasXwidth){
			biasXID[i]=j+1;
			break;
			}
		}
		printf("done!!\n\n");
	}

	for(Int_t i=0; i<nPatterns; i++){
		biasXID[i]=0;
		biasZID[i]=0;
	}

	for(Int_t i=0; i<nPatterns; i++){
		printf("Assign biasZID to pattern %d... ",i);
		for(Int_t j=-NumberofBiasZbins/2; j<NumberofBiasZbins/2; j++){
			if(j*biasZwidth < ((*DeltaZmean)[i]+((*zCentreShift)[i]*pitchZ)) 
				&& ((*DeltaZmean)[i]+((*zCentreShift)[i]*pitchZ))<= (j+1)*biasZwidth){
			biasZID[i]=j+1;
			break;
			}
		}
		printf("done!!\n\n");
	}

	

	//Assigning NPixID

	NPixID.Set(nPatterns);

	for(Int_t i=0; i<nPatterns; i++){
		printf("Assigning NPixID to pattern %d...", i);
		if((*NPix)[i]<=nPixlimits[0]){
			NPixID[i]=0;
			printf("done!!\n\n");
		}
		else if(nPixlimits[0]<(*NPix)[i] && (*NPix)[i]<=nPixlimits[limitsnumber-1]){
			for(Int_t j=0; j<nPatterns; j++ ){
				if(nPixlimits[j]<(*NPix)[i] && (*NPix)[i]<=nPixlimits[j+1]){
					NPixID[i]=j+1;
					printf("done!!\n\n");
					break;
				}
			}
		}
		else if((*NPix)[i]>nPixlimits[limitsnumber-1]){
			NPixID[i]=limitsnumber+1;
			printf("done!!\n\n");
		}
	}

	//Assigning groupID

	groupID.Set(nPatterns);

	//Assign -2 to frequent patterns, not to group, and -1 to rare clusters
	for(Int_t ID=0; ID<nPatterns; ID++){
		printf("Assign temporary group ID to pattern %d... ",ID);
		groupID[ID]=-1;
		printf("done\n\n");
	}
	Int_t k=0;
	while((*pattFR)[k]>frequencyTreshold){
		groupID[k]=tempgroupID;
		tempgroupID++;
		k++;
	}

	if(groupingMethod==kShift){
		for(Int_t i=0; i<nPatterns; i++){
			if(groupID[i]!=-1) continue;	
			groupID[i]=tempgroupID;
			printf("Assigning group ID %d... ",tempgroupID);
			for(Int_t j=i+1; j<nPatterns; j++){
				if(sigmaXID[j]==-3){
					groupID[j]=-1;
					continue;
				}
				else if(sigmaXID[j]==sigmaXID[i] && sigmaZID[j]==sigmaZID[i] && 
					shiftXID[j]==shiftXID[i] && shiftZID[j]==shiftZID[i] &&
					NPixID[i]==NPixID[j]) groupID[j]=tempgroupID;
			}
			printf("done!!\n\n");
			tempgroupID++;
		}
	}
	else if(groupingMethod==kBias){
		for(Int_t i=0; i<nPatterns; i++){
			if(groupID[i]!=-1) continue;
			groupID[i]=tempgroupID;
			printf("Assigning group ID %d... ",tempgroupID);
			for(Int_t j=i+1; j<nPatterns; j++){
				if(sigmaZID[j]==-3){
					groupID[j]=-1;
					continue;
				}
				else if(sigmaXID[j]==sigmaXID[i] && sigmaZID[j]==sigmaZID[i]
					&& biasXID[j]==biasXID[i] && biasZID[j]==biasZID[i]
					&& NPixID[i]==NPixID[j]) groupID[j]=tempgroupID;
			}
			printf("done!!\n\n");
			tempgroupID++;
		}
	}

	ofstream a("groupdef.txt");
		
	//setw(55) << "patterns in the group\n" << endl;

	a << Form("A NEGATIVE ID means that the pattern is not in a group.") << endl << endl <<
		Form("EXCEPTION: biasID CAN be negative") << endl <<
		"\n\n......................................................................................." << 
		"................................................................................................\n\n";

	for(int i=0; i<nPatterns; i++){

		printf("Writing info about pattern %d ...", i);

		a <<  setw(30) << Form("pattID: %d",i) <<  setw(30) << Form("freq: %f", (*pattFR)[i]) << setw(30) << Form("NPix: %d",Int_t((*NPix)[i]))<< setw(45) << Form("NRow: %d ",Int_t((*NRow)[i])) << setw(45) <<
		Form("NCol: %d", Int_t((*NCol)[i])) << endl << endl
		<< setw(45) << Form("DeltaXmean: %f (%f)",(*DeltaXmean)[i],(*DeltaXmeanErr)[i]) << setw(45) << 
		Form("DeltaZmean: %f (%f)",(*DeltaZmean)[i],(*DeltaZmeanErr)[i])<<
		setw(45) << Form("DeltaXsigma: %f (%f)",(*DeltaXsigma)[i],(*DeltaXsigmaErr)[i]) << setw(45) <<
		Form("DeltaZsigma: %f (%f)",(*DeltaZsigma)[i],(*DeltaZsigmaErr)[i]) << endl << endl << setw(30) << 
		Form("xShift: %f",(*xCentreShift)[i]) <<  setw(45) << Form("zShift: %f",(*zCentreShift)[i]) << setw(45) << Form("BiasX(MChit-centrePix): %f",(*DeltaXmean)[i]+((*xCentreShift)[i]*pitchX)) << setw(45) <<
		Form("BiasZ(MChit-centrePix): %f",(*DeltaZmean)[i]+((*zCentreShift)[i]*pitchZ)) << endl << endl <<
		setw(30) << Form("sigmaXID: %d",sigmaXID[i]) << setw(15) << Form("sigmaZID: %d",sigmaZID[i]) << setw(15) <<
		Form("shiftXID: %d",shiftXID[i]) << setw(15) << Form("shiftZID: %d",shiftZID[i]) << setw(15)<< Form("biasXID: %d",biasXID[i]) <<
		setw(15) << Form("biasZID: %d",biasZID[i]) << setw(15) << Form("NPixID: %d", NPixID[i]) << endl << endl << setw(30) << Form("groupID: %d", groupID[i])
		<< endl << endl << setw(30) << "patterns in this group:\n\n";

		Int_t matchcounter=0;

		for(int j=0; j<nPatterns;  j++){
			if(matchcounter!=0 && (matchcounter%20)==0){
				a << endl;
				matchcounter=0;
			}
			if(groupID[j]==groupID[i]) {
				a << j << ", ";
				matchcounter++;
			}
		}
		
		a << "\n\n......................................................................................." << 
		"................................................................................................\n\n";


		printf("done!\n\n");
	}

	a.close();

	printf("%d groups found!!!!\n\n",tempgroupID);

	printf("\n\nThe total frequency of the patterns in group is %f\n\n",totalGroupFreq);

	/*

	TVectorF groupDeltaX(tempGID+100);
	TVectorF groupShiftX(tempGID+100);
	TVectorF groupDeltaZ(tempGID+100);
	TVectorF groupShiftZ(tempGID+100);
	TVectorF patternNum(tempGID+100);
	groupDeltaX.Zero();
	groupShiftX.Zero();
	groupDeltaZ.Zero();
	groupShiftZ.Zero();
	patternNum.Zero();

	ofstream b("groupDB.txt");

	b<<setw(15)<<"groupID"<<setw(25)<<"patterns in the group"<<setw(15)<<
	"DeltaX"<<setw(15)<<"ShiftX"<<setw(15)<<"DeltaZ"<<setw(15)<<"ShiftZ\n"<<endl;

	TCanvas* c = new TCanvas("c","Patterns groups",900,600);
	TH1F* h = new TH1F("h","Patterns groups",tempGID,-0.5, tempGID-0.5);
	h->GetXaxis()->SetTitle("group ID");
	h->SetStats(0);

	for(Int_t gid=0; gid<tempGID; gid++){

		Int_t PatternNumberInGroup=0;
		Float_t freqSum=0.;//It is the sum of the frequencies of the patterns in the same group

		for(Int_t pattID=0; pattID<nPatterns; pattID++){
			if (groupID[pattID]==gid)
			{
				groupDeltaX[gid]+=(*DeltaXsigma)[pattID]*(*pattFR)[pattID];
				groupShiftX[gid]+=(*xCentreShift)[pattID]*(*pattFR)[pattID];
				groupDeltaZ[gid]+=(*DeltaZsigma)[pattID]*(*pattFR)[pattID];
				groupShiftZ[gid]+=(*zCentreShift)[pattID]*(*pattFR)[pattID];
				freqSum+=(*pattFR)[pattID];
				PatternNumberInGroup++;

				h->Fill(gid);
			}
		}

		groupDeltaX[gid]=groupDeltaX[gid]/freqSum;
		groupShiftX[gid]=groupShiftX[gid]/freqSum;
		groupDeltaZ[gid]=groupDeltaZ[gid]/freqSum;
		groupShiftZ[gid]=groupShiftZ[gid]/freqSum;
		patternNum[gid]=PatternNumberInGroup;

		b<<setw(15)<<gid<<setw(25)<<patternNum[gid]<<setw(15)<<
		groupDeltaX[gid]<<setw(15)<<groupShiftX[gid]<<setw(15)<<
		groupDeltaZ[gid]<<setw(15)<<groupShiftZ[gid]<<"\n"<<endl;
	}

	c->cd();
	h->Draw();

	TPavesText* info = new TPavesText(0.5,1,0.5,1,1,"nb");
	info->AddText(Form("Number of groups: %d",tempGID));
	info->AddText("#delta_{X}<5 & #delta_{Z}<5");
	info->AddText("#DeltaX<0.05 & #DeltaZ<0.05");
	c->cd();
	info->Draw();

	b.close();
	*/
}

void LoadDB(const char* fname){

  printf("\n\nLoading DB... ");
  // load database
  TFile* fl = TFile::Open(fname);
  if(!fl){printf("Could not find %s",fname); exit(1);}
  pattDB = (TObjArray*)fl->Get("TopDB");
  pattFR = (TVectorF*)fl->Get("TopFreq");
  xCentrePix =(TVectorF*)fl->Get("xCOG");
  zCentrePix =(TVectorF*)fl->Get("zCOG");
  xCentreShift =(TVectorF*)fl->Get("xShift");
  zCentreShift =(TVectorF*)fl->Get("zShift");
  NPix =(TVectorF*)fl->Get("NPix");
  NCol =(TVectorF*)fl->Get("NCol");
  NRow =(TVectorF*)fl->Get("NRow");
  DeltaXmean =(TVectorF*)fl->Get("DeltaXmean");
  DeltaZmean =(TVectorF*)fl->Get("DeltaZmean");
  DeltaXsigma =(TVectorF*)fl->Get("DeltaXsigma");
  DeltaZsigma =(TVectorF*)fl->Get("DeltaZsigma");
  DeltaXmeanErr =(TVectorF*)fl->Get("DeltaXmeanErr");
  DeltaZmeanErr =(TVectorF*)fl->Get("DeltaZmeanErr");
  DeltaZsigmaErr =(TVectorF*)fl->Get("DeltaXsigmaErr");
  DeltaXsigmaErr =(TVectorF*)fl->Get("DeltaZsigmaErr");
  printf("done!!\n\n");
 groupdef.C:1
 groupdef.C:2
 groupdef.C:3
 groupdef.C:4
 groupdef.C:5
 groupdef.C:6
 groupdef.C:7
 groupdef.C:8
 groupdef.C:9
 groupdef.C:10
 groupdef.C:11
 groupdef.C:12
 groupdef.C:13
 groupdef.C:14
 groupdef.C:15
 groupdef.C:16
 groupdef.C:17
 groupdef.C:18
 groupdef.C:19
 groupdef.C:20
 groupdef.C:21
 groupdef.C:22
 groupdef.C:23
 groupdef.C:24
 groupdef.C:25
 groupdef.C:26
 groupdef.C:27
 groupdef.C:28
 groupdef.C:29
 groupdef.C:30
 groupdef.C:31
 groupdef.C:32
 groupdef.C:33
 groupdef.C:34
 groupdef.C:35
 groupdef.C:36
 groupdef.C:37
 groupdef.C:38
 groupdef.C:39
 groupdef.C:40
 groupdef.C:41
 groupdef.C:42
 groupdef.C:43
 groupdef.C:44
 groupdef.C:45
 groupdef.C:46
 groupdef.C:47
 groupdef.C:48
 groupdef.C:49
 groupdef.C:50
 groupdef.C:51
 groupdef.C:52
 groupdef.C:53
 groupdef.C:54
 groupdef.C:55
 groupdef.C:56
 groupdef.C:57
 groupdef.C:58
 groupdef.C:59
 groupdef.C:60
 groupdef.C:61
 groupdef.C:62
 groupdef.C:63
 groupdef.C:64
 groupdef.C:65
 groupdef.C:66
 groupdef.C:67
 groupdef.C:68
 groupdef.C:69
 groupdef.C:70
 groupdef.C:71
 groupdef.C:72
 groupdef.C:73
 groupdef.C:74
 groupdef.C:75
 groupdef.C:76
 groupdef.C:77
 groupdef.C:78
 groupdef.C:79
 groupdef.C:80
 groupdef.C:81
 groupdef.C:82
 groupdef.C:83
 groupdef.C:84
 groupdef.C:85
 groupdef.C:86
 groupdef.C:87
 groupdef.C:88
 groupdef.C:89
 groupdef.C:90
 groupdef.C:91
 groupdef.C:92
 groupdef.C:93
 groupdef.C:94
 groupdef.C:95
 groupdef.C:96
 groupdef.C:97
 groupdef.C:98
 groupdef.C:99
 groupdef.C:100
 groupdef.C:101
 groupdef.C:102
 groupdef.C:103
 groupdef.C:104
 groupdef.C:105
 groupdef.C:106
 groupdef.C:107
 groupdef.C:108
 groupdef.C:109
 groupdef.C:110
 groupdef.C:111
 groupdef.C:112
 groupdef.C:113
 groupdef.C:114
 groupdef.C:115
 groupdef.C:116
 groupdef.C:117
 groupdef.C:118
 groupdef.C:119
 groupdef.C:120
 groupdef.C:121
 groupdef.C:122
 groupdef.C:123
 groupdef.C:124
 groupdef.C:125
 groupdef.C:126
 groupdef.C:127
 groupdef.C:128
 groupdef.C:129
 groupdef.C:130
 groupdef.C:131
 groupdef.C:132
 groupdef.C:133
 groupdef.C:134
 groupdef.C:135
 groupdef.C:136
 groupdef.C:137
 groupdef.C:138
 groupdef.C:139
 groupdef.C:140
 groupdef.C:141
 groupdef.C:142
 groupdef.C:143
 groupdef.C:144
 groupdef.C:145
 groupdef.C:146
 groupdef.C:147
 groupdef.C:148
 groupdef.C:149
 groupdef.C:150
 groupdef.C:151
 groupdef.C:152
 groupdef.C:153
 groupdef.C:154
 groupdef.C:155
 groupdef.C:156
 groupdef.C:157
 groupdef.C:158
 groupdef.C:159
 groupdef.C:160
 groupdef.C:161
 groupdef.C:162
 groupdef.C:163
 groupdef.C:164
 groupdef.C:165
 groupdef.C:166
 groupdef.C:167
 groupdef.C:168
 groupdef.C:169
 groupdef.C:170
 groupdef.C:171
 groupdef.C:172
 groupdef.C:173
 groupdef.C:174
 groupdef.C:175
 groupdef.C:176
 groupdef.C:177
 groupdef.C:178
 groupdef.C:179
 groupdef.C:180
 groupdef.C:181
 groupdef.C:182
 groupdef.C:183
 groupdef.C:184
 groupdef.C:185
 groupdef.C:186
 groupdef.C:187
 groupdef.C:188
 groupdef.C:189
 groupdef.C:190
 groupdef.C:191
 groupdef.C:192
 groupdef.C:193
 groupdef.C:194
 groupdef.C:195
 groupdef.C:196
 groupdef.C:197
 groupdef.C:198
 groupdef.C:199
 groupdef.C:200
 groupdef.C:201
 groupdef.C:202
 groupdef.C:203
 groupdef.C:204
 groupdef.C:205
 groupdef.C:206
 groupdef.C:207
 groupdef.C:208
 groupdef.C:209
 groupdef.C:210
 groupdef.C:211
 groupdef.C:212
 groupdef.C:213
 groupdef.C:214
 groupdef.C:215
 groupdef.C:216
 groupdef.C:217
 groupdef.C:218
 groupdef.C:219
 groupdef.C:220
 groupdef.C:221
 groupdef.C:222
 groupdef.C:223
 groupdef.C:224
 groupdef.C:225
 groupdef.C:226
 groupdef.C:227
 groupdef.C:228
 groupdef.C:229
 groupdef.C:230
 groupdef.C:231
 groupdef.C:232
 groupdef.C:233
 groupdef.C:234
 groupdef.C:235
 groupdef.C:236
 groupdef.C:237
 groupdef.C:238
 groupdef.C:239
 groupdef.C:240
 groupdef.C:241
 groupdef.C:242
 groupdef.C:243
 groupdef.C:244
 groupdef.C:245
 groupdef.C:246
 groupdef.C:247
 groupdef.C:248
 groupdef.C:249
 groupdef.C:250
 groupdef.C:251
 groupdef.C:252
 groupdef.C:253
 groupdef.C:254
 groupdef.C:255
 groupdef.C:256
 groupdef.C:257
 groupdef.C:258
 groupdef.C:259
 groupdef.C:260
 groupdef.C:261
 groupdef.C:262
 groupdef.C:263
 groupdef.C:264
 groupdef.C:265
 groupdef.C:266
 groupdef.C:267
 groupdef.C:268
 groupdef.C:269
 groupdef.C:270
 groupdef.C:271
 groupdef.C:272
 groupdef.C:273
 groupdef.C:274
 groupdef.C:275
 groupdef.C:276
 groupdef.C:277
 groupdef.C:278
 groupdef.C:279
 groupdef.C:280
 groupdef.C:281
 groupdef.C:282
 groupdef.C:283
 groupdef.C:284
 groupdef.C:285
 groupdef.C:286
 groupdef.C:287
 groupdef.C:288
 groupdef.C:289
 groupdef.C:290
 groupdef.C:291
 groupdef.C:292
 groupdef.C:293
 groupdef.C:294
 groupdef.C:295
 groupdef.C:296
 groupdef.C:297
 groupdef.C:298
 groupdef.C:299
 groupdef.C:300
 groupdef.C:301
 groupdef.C:302
 groupdef.C:303
 groupdef.C:304
 groupdef.C:305
 groupdef.C:306
 groupdef.C:307
 groupdef.C:308
 groupdef.C:309
 groupdef.C:310
 groupdef.C:311
 groupdef.C:312
 groupdef.C:313
 groupdef.C:314
 groupdef.C:315
 groupdef.C:316
 groupdef.C:317
 groupdef.C:318
 groupdef.C:319
 groupdef.C:320
 groupdef.C:321
 groupdef.C:322
 groupdef.C:323
 groupdef.C:324
 groupdef.C:325
 groupdef.C:326
 groupdef.C:327
 groupdef.C:328
 groupdef.C:329
 groupdef.C:330
 groupdef.C:331
 groupdef.C:332
 groupdef.C:333
 groupdef.C:334
 groupdef.C:335
 groupdef.C:336
 groupdef.C:337
 groupdef.C:338
 groupdef.C:339
 groupdef.C:340
 groupdef.C:341
 groupdef.C:342
 groupdef.C:343
 groupdef.C:344
 groupdef.C:345
 groupdef.C:346
 groupdef.C:347
 groupdef.C:348
 groupdef.C:349
 groupdef.C:350
 groupdef.C:351
 groupdef.C:352
 groupdef.C:353
 groupdef.C:354
 groupdef.C:355
 groupdef.C:356
 groupdef.C:357
 groupdef.C:358
 groupdef.C:359
 groupdef.C:360
 groupdef.C:361
 groupdef.C:362
 groupdef.C:363
 groupdef.C:364
 groupdef.C:365
 groupdef.C:366
 groupdef.C:367
 groupdef.C:368
 groupdef.C:369
 groupdef.C:370
 groupdef.C:371
 groupdef.C:372
 groupdef.C:373
 groupdef.C:374
 groupdef.C:375
 groupdef.C:376
 groupdef.C:377
 groupdef.C:378
 groupdef.C:379
 groupdef.C:380
 groupdef.C:381
 groupdef.C:382
 groupdef.C:383
 groupdef.C:384
 groupdef.C:385
 groupdef.C:386
 groupdef.C:387
 groupdef.C:388
 groupdef.C:389
 groupdef.C:390
 groupdef.C:391
 groupdef.C:392
 groupdef.C:393
 groupdef.C:394
 groupdef.C:395
 groupdef.C:396
 groupdef.C:397
 groupdef.C:398
 groupdef.C:399
 groupdef.C:400
 groupdef.C:401
 groupdef.C:402
 groupdef.C:403
 groupdef.C:404
 groupdef.C:405
 groupdef.C:406
 groupdef.C:407
 groupdef.C:408
 groupdef.C:409
 groupdef.C:410
 groupdef.C:411
 groupdef.C:412
 groupdef.C:413
 groupdef.C:414
 groupdef.C:415
 groupdef.C:416
 groupdef.C:417
 groupdef.C:418
 groupdef.C:419
 groupdef.C:420
 groupdef.C:421
 groupdef.C:422
 groupdef.C:423
 groupdef.C:424
 groupdef.C:425
 groupdef.C:426
 groupdef.C:427
 groupdef.C:428
 groupdef.C:429
 groupdef.C:430
 groupdef.C:431
 groupdef.C:432
 groupdef.C:433
 groupdef.C:434
 groupdef.C:435
 groupdef.C:436
 groupdef.C:437
 groupdef.C:438
 groupdef.C:439
 groupdef.C:440
 groupdef.C:441
 groupdef.C:442
 groupdef.C:443
 groupdef.C:444
 groupdef.C:445
 groupdef.C:446
 groupdef.C:447
 groupdef.C:448
 groupdef.C:449
 groupdef.C:450
 groupdef.C:451
 groupdef.C:452
 groupdef.C:453
 groupdef.C:454
 groupdef.C:455
 groupdef.C:456
 groupdef.C:457
 groupdef.C:458
 groupdef.C:459
 groupdef.C:460
 groupdef.C:461
 groupdef.C:462
 groupdef.C:463
 groupdef.C:464
 groupdef.C:465
 groupdef.C:466
 groupdef.C:467
 groupdef.C:468
 groupdef.C:469
 groupdef.C:470
 groupdef.C:471
 groupdef.C:472
 groupdef.C:473
 groupdef.C:474
 groupdef.C:475
 groupdef.C:476
 groupdef.C:477