ROOT logo
//*-- AUTHOR : Jochen Markert

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////
//   HSlowPar
//
//   Container to keep slowcontrol summary informations for a bunch of
//   channels (mean, rm, min, max values) for a list of runs.
//
//   //##################################################
//
//   HOWTO FILL the container in a macro:
//
//   HSlowPar p("HSlowPar_test","HSlowPar_test");
//
//   HSlowChan c;
//   c.mean = 1750.;
//   c.rms  = 5;
//   c.min  = 1740.;
//   c.max  = 1760.;
//   c.print()
//
//   p.setChannel(runID,"HV_MDC_example",&c,kFALSE); // set channel in macro to write to ROOT/ASCII
//   ..... more channels and runIDs
//   p.makeChannelList(kTRUE); // kTRUE = sort, call this function after all channels have been set
//                             // needed to create the list of channels
//
//   //--------------------------------------------------
//   For the init from ORACLE the list of channels has to be
//   set before and the Partition specified (all runs for the day
//   of the runID used for init will be added automatically):
//
//   HSlowPar p("HSlowPar_test","HSlowPar_test");
//   p->addToChannelList(""HV_MDC_example""); // add a channel name
//   p->setPartition("online);  // during beam time
//                              // (default is offline) after slow control
//                              // summaries are moved to final tables
//   //--------------------------------------------------
//
//   //##################################################
//
//   HOWTO USE the container:
//
//   HSlowPar* p = (HSlowPar*)gHades->getRuntimeDb()->getConatiner("SlowPar");
//   Double_t values[4];
//   p->getChannel(runid,"HV_MDC_example",&c);        // get Channel with name for a given runID
//   p->getChannel(runid,"HV_MDC_example",values);    // get Channel with name for a given runID
//
//   p->printParam();                         // print container content
//   p->printChannel(runID,"HV_MDC_example"); // print a single channel
//   Bool_t ok = p->findRunId(runID);         // is this runID inside ?
//   Int_t first,last;
//   p->getRangeRunID(first,last);            // get first and last runID inside the container
//   Int_t n = p->getNRunIDs();               // get the number runIDs inside the container
//   TList* list = p->getChannelList();       // get the list of channel names
//
//////////////////////////////////////////////////////////////

#include "hslowpar.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hrun.h"
#include "hpario.h"
#include "hdetpario.h"

#include <algorithm>
#include <iostream>
#include <iomanip>

HSlowPar::HSlowPar(const Char_t* name,const Char_t* title,
		   const Char_t* context) : HParSet(name,title,context)
{

    fCurrentRunID = -2;
    fMIter        = fMRunID.end();
    fPartition    = "offline";
}

void HSlowPar::clear(void) {
    fCurrentRunID = -2;
    fMIter        = fMRunID.end();
}

void HSlowPar::reset(Int_t level) {

    // empty all maps, vectors, lists
    // of runIds and channels
    // level  : 0 reset map
    //          1 reset map + runID
    //          2 reset map + runID = channelList


    map<Int_t,map<TString,HSlowChan*>* >::iterator iter;
    for( iter = fMRunID.begin(); iter != fMRunID.end(); ++iter ) {
	map<TString,HSlowChan*> *m = iter->second;

	map<TString,HSlowChan*>::iterator iter2;
	for( iter2 = m->begin(); iter2 != m->end(); ++iter2 ) {
            HSlowChan* c = iter2->second;
	    delete c;
	}
        m->clear();
        delete m;

    }
    fMRunID.clear();

    fCurrentRunID = -2;
    fMIter        = fMRunID.end();


    if(level > 0) fVRunID.clear();
    if(level > 1) fListChannels.Delete();

}

void HSlowPar::removeRun(Int_t runID) {

    // remove all maps for this runID

    map<Int_t,map<TString,HSlowChan*>* >::iterator iter = fMRunID.find(runID);

    if(iter != fMRunID.end())
    {
	map<TString,HSlowChan*> *m1 = iter->second;

	map<TString,HSlowChan*>::iterator iter2;
	for( iter2 = m1->begin(); iter2 != m1->end(); ++iter2 ) {
	    HSlowChan* c = iter2->second;
	    delete c;
	}
	m1->clear();
	delete m1;

	fMRunID.erase( iter );

        vector<Int_t>::iterator iterv = find(fVRunID.begin(),fVRunID.end(),runID);
        fVRunID.erase( iterv );
    }
}

Bool_t HSlowPar::init(HParIo* inp,Int_t* set) {
    // intitializes the container from an input

    HRun* currentRun = gHades->getRuntimeDb()->getCurrentRun();
    Int_t runID      = currentRun->getRunId();

    if(!findRunID(runID))
    {
        //Info("init()","Run = %i init!",runID);

	HDetParIo* input=inp->getDetParIo("HSpecParIo");

	Bool_t rc = kFALSE;

	TString name = inp->ClassName();
	if(name != "HParOra2Io")
	{   // for ASCII + ROOT IO

            //--------------------------------------
	    // clean up container
	    reset(2);
            //--------------------------------------

	    if (input) rc = input->init(this,set);

	    if(rc)
	    {
		if(name == "HParAsciiFileIo"){
		    sort(fVRunID.begin(),fVRunID.end());
		    setStatic();
		}
	    } else {

                return rc;
	    }

	} else {

           rc = input->init(this,set);
	   sort(fVRunID.begin(),fVRunID.end());
	}

	return rc;
    } else {

        //Info("init()","Run = %i allready inside container!",runID);

    }
    return kTRUE;
}

Int_t HSlowPar::write(HParIo* output) {
    // writes the container to an output
    HDetParIo* out=output->getDetParIo("HSpecParIo");
    if (out) return out->write(this);
    return -1;
}

Bool_t HSlowPar::readline(const Char_t* buf) {
    // decodes one line read from ascii file I/O


    Int_t runID;
    Char_t namec[400];
    HSlowChan sc;

    sscanf(buf,"%i%s%lf%lf%lf%lf",
	   &runID,namec,&sc.mean,&sc.rms,&sc.min,&sc.max);

    TString name = namec;
    return setChannel(runID,name,&sc,kFALSE);
}

void HSlowPar::putAsciiHeader(TString& b) {
    b =
	"#######################################################################\n"
	"# Slow Control parameters for QA\n"
	"# Format:\n"
	"# runID channel mean rms min max\n"
	"#######################################################################\n";
}

Bool_t HSlowPar::write(fstream& out)
{
    // write ascii file

    Bool_t r = kTRUE;

    for(UInt_t i = 0; i < fVRunID.size(); i ++ ){
	Int_t runId = fVRunID[i];

	map<TString,HSlowChan*> *m = findRunIDMap(runId);

	vector<TString> chan;

	map<TString,HSlowChan*>::iterator iter;
	for( iter = m->begin(); iter != m->end(); ++iter ) {
	    chan.push_back(iter->first);
	}

	sort(chan.begin(),chan.end());

	for(UInt_t j = 0; j < chan.size(); j ++ ){
	    HSlowChan* sc = (*m)[chan[j]];

	    out<<runId<<" "<<sc->GetName()<<" "<<sc->mean<<" "<<sc->rms<<" "<<sc->min<<" "<<sc->max<<endl;

	}
    }
    return r;
}

void HSlowPar::printParam()
{
    // print the content of the container
    // in the order of all channels per runID

    sort(fVRunID.begin(),fVRunID.end());

    Info("printParam()","Container: %s",GetName());

    for(UInt_t i = 0; i < fVRunID.size(); i ++ ){
	Int_t runId = fVRunID[i];

	map<TString,HSlowChan*> *m = findRunIDMap(runId);

	vector<TString> chan;

	map<TString,HSlowChan*>::iterator iter;
	for( iter = m->begin(); iter != m->end(); ++iter ) {
	    chan.push_back(iter->first);
	}

	sort(chan.begin(),chan.end());

	for(UInt_t j = 0; j < chan.size(); j ++ ){
            HSlowChan* sc = (*m)[chan[j]];
            sc->print(runId);
	}
	cout<<endl;
    }
}

void HSlowPar::printChannel(Int_t runID,TString name)
{
    // print a single channel
    map<TString,HSlowChan*>* m = findRunIDMap (runID);
    if(m) {
	HSlowChan* sc = findChannel(m,name);
	if(sc){
	    sc->print(runID);
	}
    }
}

void HSlowPar::addToChannelList(TString name,Bool_t sort)
{
    // add channel with name name to the list
    // of channels
    if(!fListChannels.FindObject(name)){
	fListChannels.Add(new TObjString(name));
	if(sort) fListChannels.Sort();
    } else {

	Error("addToChannelList()","Channel with name = %s already existing! skipped!",name.Data());
    }
}

void HSlowPar::makeChannelList(Bool_t sort)
{
    // after setting all channels creatye the
    // list of channels

    if( fVRunID.size() > 0 ) {
        fListChannels.Delete();
	HSlowChan c;
        map<TString,HSlowChan*>* m = findRunIDMap(fVRunID[0]);
	if(m){

	    map<TString,HSlowChan*>::iterator iter;
	    for( iter = m->begin(); iter != m->end(); ++iter ) {
		addToChannelList(iter->first,kFALSE);
	    }
	}

        if(sort) fListChannels.Sort();
    }
}

void HSlowPar::printChannelList()
{
    Info("printChannelList()","Container: %s",GetName());
    Int_t ct = 0;
    TIter next(&fListChannels);
    TObject *obj ;
    while ((obj = next())){
       cout<<setw(5)<<ct<<" = "<<((TObjString*)(obj))->GetString().Data()<<endl;
       ct++;
    }
}

void HSlowPar::getRunIDList(TArrayI* ar)
{
    // coppies the list of runIDs into the TArrayI.
    // The array will be rested before.
    sort(fVRunID.begin(),fVRunID.end());
    if(ar && fVRunID.size() > 0){
	ar->Reset();

	ar->Set(fVRunID.size());
	for(UInt_t i = 0; i < fVRunID.size(); i ++ ){
	    ar->SetAt(fVRunID[i],i);
	}
    }

}

void HSlowPar::printRunIDList()
{
    Info("printRunIDList()","Container: %s",GetName());
    for(UInt_t i = 0; i < fVRunID.size(); i ++ ){
	cout<<setw(5)<<i<<" = "<<fVRunID[i]<<endl;
    }
}

Bool_t HSlowPar::setChannel(Int_t runID,TString name, Double_t ar[], Bool_t overwrite)
{
    // set a new channel for runID  with name name
    // to the values provided by the array ar.
    // if overwrite = kTRUE existing channels will
    // be overwritten. if overwrite = kFALSE an attempt
    // to add a channel with existing name will result
    // in an error. To be called from a macro.
    HSlowChan chan;
    chan.set(ar);

    if(!setChannel(runID,name,&chan,overwrite)) return kFALSE;

    return kTRUE;
}

Bool_t HSlowPar::setChannel(Int_t runID,TString name, HSlowChan* chan, Bool_t overwrite)
{
    // set a new channel for runID  with name name
    // to the values provided by the channel chan.
    // if overwrite = kTRUE existing channels will
    // be overwritten. if overwrite = kFALSE an attempt
    // to add a channel with existing name will result
    // in an error. To be called from a macro.

    map<TString,HSlowChan*> *m = findRunIDMap(runID);

    if(m){ // runID already exists

	HSlowChan* vals = findChannel(m,name);
	if(!vals || (vals && overwrite) )
	{
	    if(!vals){ // channel was not existing
		vals = new HSlowChan;
                vals->SetName(name);
		// new channel
		(*m)[name]  = vals;
	    }
            vals->copyValues(chan);

	} else {
	    Error("setChannel()","Channel %s does already exist for runID = %i!",name.Data(),runID );
	    return kFALSE;
	}
    } else { // new RunId

	// new channel map
	map<TString,HSlowChan*> *m1 = new map<TString,HSlowChan*>;

	// new channel
	HSlowChan* vals = new HSlowChan;
        vals->SetName(name);
        vals->copyValues(chan);

	(*m1)[name]   = vals;
 	fMRunID[runID] = m1;

	fVRunID.push_back(runID); // new runID
    }
    return kTRUE;
}


Bool_t HSlowPar::getChannel(Int_t runID,TString name, Double_t values[])
{
    // returns the values of channel name for a given runID
    // to the array values

    HSlowChan* chan = 0;
    getChannel(runID,name,chan);
    if(chan){
	chan->get(values);
      return kTRUE;
    }
    return kFALSE;
}

Bool_t HSlowPar::getChannel(Int_t runID,TString name,HSlowChan* chan)
{
    // returns the channel with name name for
    // a given runID. Donot delete this object!

    map<TString,HSlowChan*> *m = findRunIDMap(runID);

    if(m) {

	HSlowChan* ch = findChannel(m,name);
	if(!ch){
	    Error("getChannel()","Channel %s does not exist for runID = %i!",name.Data(),runID );
	    return kFALSE;
	} else {
            chan->copyValues(ch);
	    return kTRUE;
	}
    } else {
	Error("getChannel()","RunID = %i does not exist!",runID );
        chan->clear();
	return kFALSE;
    }
    return kFALSE;
}

Bool_t HSlowPar::setChannelMap(Int_t runID)
{
    // creates channel map by using channel list for runID
    // if the map exists it will be deleted and created new.

    map<TString,HSlowChan*> *m = findRunIDMap(runID);

    if(m) {
	removeRun(runID);
    }

    TIter next(&fListChannels);
    TObject *obj ;
    HSlowChan chan;
    while ((obj = next())){
	TString name = ((TObjString*)(obj))->GetString();
	setChannel(runID,name,&chan);
    }

    return kTRUE;
}

Bool_t HSlowPar::findRunID(Int_t runId)
{
    // returns kTRUE if the runID exists
    if(find(fVRunID.begin(),fVRunID.end(),runId) != fVRunID.end()) return kTRUE;
    else return kFALSE;
}

HSlowChan* HSlowPar::findChannel(map<TString, HSlowChan* >* m ,TString name)
{
    // returns the channel with name name
    // from the map belonging to a runID
    map<TString, HSlowChan* > ::iterator iter =  m->find(name);
    if(iter != m->end()) return iter->second;
    else return NULL;
}

map<TString,HSlowChan*>* HSlowPar::findRunIDMap (Int_t runId)
{
    // returns the pointer to the map of channels
    // for given runID

    if(fMIter->first != runId || fMIter == fMRunID.end()) {

	fMIter = fMRunID.find(runId);

	if(fMIter != fMRunID.end()) {
	    fCurrentRunID = runId;
	    return fMIter->second;
	} else return NULL;
    } else {
           return fMIter->second;
    }

    return NULL;
}

Bool_t HSlowPar::getRangeRunID(Int_t& first,Int_t& last)
{
    // returns the first and last runID in the container

    sort(fVRunID.begin(),fVRunID.end());

    first = -1;
    last  = -1;

    if(fVRunID.size() > 0) {
	first = fVRunID[0];
	last  = fVRunID[fVRunID.size()-1];
    }

    return kTRUE;
}


ClassImp(HSlowPar) 
 hslowpar.cc:1
 hslowpar.cc:2
 hslowpar.cc:3
 hslowpar.cc:4
 hslowpar.cc:5
 hslowpar.cc:6
 hslowpar.cc:7
 hslowpar.cc:8
 hslowpar.cc:9
 hslowpar.cc:10
 hslowpar.cc:11
 hslowpar.cc:12
 hslowpar.cc:13
 hslowpar.cc:14
 hslowpar.cc:15
 hslowpar.cc:16
 hslowpar.cc:17
 hslowpar.cc:18
 hslowpar.cc:19
 hslowpar.cc:20
 hslowpar.cc:21
 hslowpar.cc:22
 hslowpar.cc:23
 hslowpar.cc:24
 hslowpar.cc:25
 hslowpar.cc:26
 hslowpar.cc:27
 hslowpar.cc:28
 hslowpar.cc:29
 hslowpar.cc:30
 hslowpar.cc:31
 hslowpar.cc:32
 hslowpar.cc:33
 hslowpar.cc:34
 hslowpar.cc:35
 hslowpar.cc:36
 hslowpar.cc:37
 hslowpar.cc:38
 hslowpar.cc:39
 hslowpar.cc:40
 hslowpar.cc:41
 hslowpar.cc:42
 hslowpar.cc:43
 hslowpar.cc:44
 hslowpar.cc:45
 hslowpar.cc:46
 hslowpar.cc:47
 hslowpar.cc:48
 hslowpar.cc:49
 hslowpar.cc:50
 hslowpar.cc:51
 hslowpar.cc:52
 hslowpar.cc:53
 hslowpar.cc:54
 hslowpar.cc:55
 hslowpar.cc:56
 hslowpar.cc:57
 hslowpar.cc:58
 hslowpar.cc:59
 hslowpar.cc:60
 hslowpar.cc:61
 hslowpar.cc:62
 hslowpar.cc:63
 hslowpar.cc:64
 hslowpar.cc:65
 hslowpar.cc:66
 hslowpar.cc:67
 hslowpar.cc:68
 hslowpar.cc:69
 hslowpar.cc:70
 hslowpar.cc:71
 hslowpar.cc:72
 hslowpar.cc:73
 hslowpar.cc:74
 hslowpar.cc:75
 hslowpar.cc:76
 hslowpar.cc:77
 hslowpar.cc:78
 hslowpar.cc:79
 hslowpar.cc:80
 hslowpar.cc:81
 hslowpar.cc:82
 hslowpar.cc:83
 hslowpar.cc:84
 hslowpar.cc:85
 hslowpar.cc:86
 hslowpar.cc:87
 hslowpar.cc:88
 hslowpar.cc:89
 hslowpar.cc:90
 hslowpar.cc:91
 hslowpar.cc:92
 hslowpar.cc:93
 hslowpar.cc:94
 hslowpar.cc:95
 hslowpar.cc:96
 hslowpar.cc:97
 hslowpar.cc:98
 hslowpar.cc:99
 hslowpar.cc:100
 hslowpar.cc:101
 hslowpar.cc:102
 hslowpar.cc:103
 hslowpar.cc:104
 hslowpar.cc:105
 hslowpar.cc:106
 hslowpar.cc:107
 hslowpar.cc:108
 hslowpar.cc:109
 hslowpar.cc:110
 hslowpar.cc:111
 hslowpar.cc:112
 hslowpar.cc:113
 hslowpar.cc:114
 hslowpar.cc:115
 hslowpar.cc:116
 hslowpar.cc:117
 hslowpar.cc:118
 hslowpar.cc:119
 hslowpar.cc:120
 hslowpar.cc:121
 hslowpar.cc:122
 hslowpar.cc:123
 hslowpar.cc:124
 hslowpar.cc:125
 hslowpar.cc:126
 hslowpar.cc:127
 hslowpar.cc:128
 hslowpar.cc:129
 hslowpar.cc:130
 hslowpar.cc:131
 hslowpar.cc:132
 hslowpar.cc:133
 hslowpar.cc:134
 hslowpar.cc:135
 hslowpar.cc:136
 hslowpar.cc:137
 hslowpar.cc:138
 hslowpar.cc:139
 hslowpar.cc:140
 hslowpar.cc:141
 hslowpar.cc:142
 hslowpar.cc:143
 hslowpar.cc:144
 hslowpar.cc:145
 hslowpar.cc:146
 hslowpar.cc:147
 hslowpar.cc:148
 hslowpar.cc:149
 hslowpar.cc:150
 hslowpar.cc:151
 hslowpar.cc:152
 hslowpar.cc:153
 hslowpar.cc:154
 hslowpar.cc:155
 hslowpar.cc:156
 hslowpar.cc:157
 hslowpar.cc:158
 hslowpar.cc:159
 hslowpar.cc:160
 hslowpar.cc:161
 hslowpar.cc:162
 hslowpar.cc:163
 hslowpar.cc:164
 hslowpar.cc:165
 hslowpar.cc:166
 hslowpar.cc:167
 hslowpar.cc:168
 hslowpar.cc:169
 hslowpar.cc:170
 hslowpar.cc:171
 hslowpar.cc:172
 hslowpar.cc:173
 hslowpar.cc:174
 hslowpar.cc:175
 hslowpar.cc:176
 hslowpar.cc:177
 hslowpar.cc:178
 hslowpar.cc:179
 hslowpar.cc:180
 hslowpar.cc:181
 hslowpar.cc:182
 hslowpar.cc:183
 hslowpar.cc:184
 hslowpar.cc:185
 hslowpar.cc:186
 hslowpar.cc:187
 hslowpar.cc:188
 hslowpar.cc:189
 hslowpar.cc:190
 hslowpar.cc:191
 hslowpar.cc:192
 hslowpar.cc:193
 hslowpar.cc:194
 hslowpar.cc:195
 hslowpar.cc:196
 hslowpar.cc:197
 hslowpar.cc:198
 hslowpar.cc:199
 hslowpar.cc:200
 hslowpar.cc:201
 hslowpar.cc:202
 hslowpar.cc:203
 hslowpar.cc:204
 hslowpar.cc:205
 hslowpar.cc:206
 hslowpar.cc:207
 hslowpar.cc:208
 hslowpar.cc:209
 hslowpar.cc:210
 hslowpar.cc:211
 hslowpar.cc:212
 hslowpar.cc:213
 hslowpar.cc:214
 hslowpar.cc:215
 hslowpar.cc:216
 hslowpar.cc:217
 hslowpar.cc:218
 hslowpar.cc:219
 hslowpar.cc:220
 hslowpar.cc:221
 hslowpar.cc:222
 hslowpar.cc:223
 hslowpar.cc:224
 hslowpar.cc:225
 hslowpar.cc:226
 hslowpar.cc:227
 hslowpar.cc:228
 hslowpar.cc:229
 hslowpar.cc:230
 hslowpar.cc:231
 hslowpar.cc:232
 hslowpar.cc:233
 hslowpar.cc:234
 hslowpar.cc:235
 hslowpar.cc:236
 hslowpar.cc:237
 hslowpar.cc:238
 hslowpar.cc:239
 hslowpar.cc:240
 hslowpar.cc:241
 hslowpar.cc:242
 hslowpar.cc:243
 hslowpar.cc:244
 hslowpar.cc:245
 hslowpar.cc:246
 hslowpar.cc:247
 hslowpar.cc:248
 hslowpar.cc:249
 hslowpar.cc:250
 hslowpar.cc:251
 hslowpar.cc:252
 hslowpar.cc:253
 hslowpar.cc:254
 hslowpar.cc:255
 hslowpar.cc:256
 hslowpar.cc:257
 hslowpar.cc:258
 hslowpar.cc:259
 hslowpar.cc:260
 hslowpar.cc:261
 hslowpar.cc:262
 hslowpar.cc:263
 hslowpar.cc:264
 hslowpar.cc:265
 hslowpar.cc:266
 hslowpar.cc:267
 hslowpar.cc:268
 hslowpar.cc:269
 hslowpar.cc:270
 hslowpar.cc:271
 hslowpar.cc:272
 hslowpar.cc:273
 hslowpar.cc:274
 hslowpar.cc:275
 hslowpar.cc:276
 hslowpar.cc:277
 hslowpar.cc:278
 hslowpar.cc:279
 hslowpar.cc:280
 hslowpar.cc:281
 hslowpar.cc:282
 hslowpar.cc:283
 hslowpar.cc:284
 hslowpar.cc:285
 hslowpar.cc:286
 hslowpar.cc:287
 hslowpar.cc:288
 hslowpar.cc:289
 hslowpar.cc:290
 hslowpar.cc:291
 hslowpar.cc:292
 hslowpar.cc:293
 hslowpar.cc:294
 hslowpar.cc:295
 hslowpar.cc:296
 hslowpar.cc:297
 hslowpar.cc:298
 hslowpar.cc:299
 hslowpar.cc:300
 hslowpar.cc:301
 hslowpar.cc:302
 hslowpar.cc:303
 hslowpar.cc:304
 hslowpar.cc:305
 hslowpar.cc:306
 hslowpar.cc:307
 hslowpar.cc:308
 hslowpar.cc:309
 hslowpar.cc:310
 hslowpar.cc:311
 hslowpar.cc:312
 hslowpar.cc:313
 hslowpar.cc:314
 hslowpar.cc:315
 hslowpar.cc:316
 hslowpar.cc:317
 hslowpar.cc:318
 hslowpar.cc:319
 hslowpar.cc:320
 hslowpar.cc:321
 hslowpar.cc:322
 hslowpar.cc:323
 hslowpar.cc:324
 hslowpar.cc:325
 hslowpar.cc:326
 hslowpar.cc:327
 hslowpar.cc:328
 hslowpar.cc:329
 hslowpar.cc:330
 hslowpar.cc:331
 hslowpar.cc:332
 hslowpar.cc:333
 hslowpar.cc:334
 hslowpar.cc:335
 hslowpar.cc:336
 hslowpar.cc:337
 hslowpar.cc:338
 hslowpar.cc:339
 hslowpar.cc:340
 hslowpar.cc:341
 hslowpar.cc:342
 hslowpar.cc:343
 hslowpar.cc:344
 hslowpar.cc:345
 hslowpar.cc:346
 hslowpar.cc:347
 hslowpar.cc:348
 hslowpar.cc:349
 hslowpar.cc:350
 hslowpar.cc:351
 hslowpar.cc:352
 hslowpar.cc:353
 hslowpar.cc:354
 hslowpar.cc:355
 hslowpar.cc:356
 hslowpar.cc:357
 hslowpar.cc:358
 hslowpar.cc:359
 hslowpar.cc:360
 hslowpar.cc:361
 hslowpar.cc:362
 hslowpar.cc:363
 hslowpar.cc:364
 hslowpar.cc:365
 hslowpar.cc:366
 hslowpar.cc:367
 hslowpar.cc:368
 hslowpar.cc:369
 hslowpar.cc:370
 hslowpar.cc:371
 hslowpar.cc:372
 hslowpar.cc:373
 hslowpar.cc:374
 hslowpar.cc:375
 hslowpar.cc:376
 hslowpar.cc:377
 hslowpar.cc:378
 hslowpar.cc:379
 hslowpar.cc:380
 hslowpar.cc:381
 hslowpar.cc:382
 hslowpar.cc:383
 hslowpar.cc:384
 hslowpar.cc:385
 hslowpar.cc:386
 hslowpar.cc:387
 hslowpar.cc:388
 hslowpar.cc:389
 hslowpar.cc:390
 hslowpar.cc:391
 hslowpar.cc:392
 hslowpar.cc:393
 hslowpar.cc:394
 hslowpar.cc:395
 hslowpar.cc:396
 hslowpar.cc:397
 hslowpar.cc:398
 hslowpar.cc:399
 hslowpar.cc:400
 hslowpar.cc:401
 hslowpar.cc:402
 hslowpar.cc:403
 hslowpar.cc:404
 hslowpar.cc:405
 hslowpar.cc:406
 hslowpar.cc:407
 hslowpar.cc:408
 hslowpar.cc:409
 hslowpar.cc:410
 hslowpar.cc:411
 hslowpar.cc:412
 hslowpar.cc:413
 hslowpar.cc:414
 hslowpar.cc:415
 hslowpar.cc:416
 hslowpar.cc:417
 hslowpar.cc:418
 hslowpar.cc:419
 hslowpar.cc:420
 hslowpar.cc:421
 hslowpar.cc:422
 hslowpar.cc:423
 hslowpar.cc:424
 hslowpar.cc:425
 hslowpar.cc:426
 hslowpar.cc:427
 hslowpar.cc:428
 hslowpar.cc:429
 hslowpar.cc:430
 hslowpar.cc:431
 hslowpar.cc:432
 hslowpar.cc:433
 hslowpar.cc:434
 hslowpar.cc:435
 hslowpar.cc:436
 hslowpar.cc:437
 hslowpar.cc:438
 hslowpar.cc:439
 hslowpar.cc:440
 hslowpar.cc:441
 hslowpar.cc:442
 hslowpar.cc:443
 hslowpar.cc:444
 hslowpar.cc:445
 hslowpar.cc:446
 hslowpar.cc:447
 hslowpar.cc:448
 hslowpar.cc:449
 hslowpar.cc:450
 hslowpar.cc:451
 hslowpar.cc:452
 hslowpar.cc:453
 hslowpar.cc:454
 hslowpar.cc:455
 hslowpar.cc:456
 hslowpar.cc:457
 hslowpar.cc:458
 hslowpar.cc:459
 hslowpar.cc:460
 hslowpar.cc:461
 hslowpar.cc:462
 hslowpar.cc:463
 hslowpar.cc:464
 hslowpar.cc:465
 hslowpar.cc:466
 hslowpar.cc:467
 hslowpar.cc:468
 hslowpar.cc:469
 hslowpar.cc:470
 hslowpar.cc:471
 hslowpar.cc:472
 hslowpar.cc:473
 hslowpar.cc:474
 hslowpar.cc:475
 hslowpar.cc:476
 hslowpar.cc:477
 hslowpar.cc:478
 hslowpar.cc:479
 hslowpar.cc:480
 hslowpar.cc:481
 hslowpar.cc:482
 hslowpar.cc:483
 hslowpar.cc:484
 hslowpar.cc:485
 hslowpar.cc:486
 hslowpar.cc:487
 hslowpar.cc:488
 hslowpar.cc:489
 hslowpar.cc:490
 hslowpar.cc:491
 hslowpar.cc:492
 hslowpar.cc:493
 hslowpar.cc:494
 hslowpar.cc:495
 hslowpar.cc:496
 hslowpar.cc:497
 hslowpar.cc:498
 hslowpar.cc:499
 hslowpar.cc:500
 hslowpar.cc:501
 hslowpar.cc:502
 hslowpar.cc:503
 hslowpar.cc:504
 hslowpar.cc:505
 hslowpar.cc:506
 hslowpar.cc:507
 hslowpar.cc:508
 hslowpar.cc:509
 hslowpar.cc:510
 hslowpar.cc:511
 hslowpar.cc:512
 hslowpar.cc:513
 hslowpar.cc:514
 hslowpar.cc:515
 hslowpar.cc:516
 hslowpar.cc:517
 hslowpar.cc:518
 hslowpar.cc:519
 hslowpar.cc:520
 hslowpar.cc:521
 hslowpar.cc:522
 hslowpar.cc:523
 hslowpar.cc:524
 hslowpar.cc:525
 hslowpar.cc:526
 hslowpar.cc:527
 hslowpar.cc:528
 hslowpar.cc:529
 hslowpar.cc:530
 hslowpar.cc:531
 hslowpar.cc:532
 hslowpar.cc:533
 hslowpar.cc:534
 hslowpar.cc:535
 hslowpar.cc:536
 hslowpar.cc:537
 hslowpar.cc:538
 hslowpar.cc:539
 hslowpar.cc:540
 hslowpar.cc:541
 hslowpar.cc:542
 hslowpar.cc:543
 hslowpar.cc:544
 hslowpar.cc:545